- 博客(269)
- 资源 (7)
- 问答 (4)
- 收藏
- 关注
原创 【读写分离】SpringBoot整合多数据源实现读写分离(一)
背景:实际项目中大都读多写少,如果查询出现瓶颈之后,我们可以考虑使用读写分离。比如有三台Mysql服务器A、B、C,一主二从,先配置好主从复制之后,再来做读写分离,A用来做update操作,B和C用来做select操作。网上很多文章都写的比较乱,这里我尽量简单优雅的完成。分析:有很多中间件可以使用,比如:Mycat,当当的Sharding-JDBC,美团的DBProxy等,但是都需要依赖第三方组件,增加学习money成本,这里我们使用Spring提供的轻量级数据路由类 Abstr..
2021-03-05 16:51:34 1299 7
原创 如何优雅的打印日志?
一般我们程序里打印日志可以帮助我们排查问题,我们也可以通过日志,来判断接口的成功、耗时等情况,而且按照一定的日志格式来打印的话,还可以用于告警平台,可以计算接口总量、成功量、失败量、失败率、耗时等,通过短信、钉钉等通知到我们。那么接下来,我们就来看看怎么样才能规范且优雅的打印我们的日志。一、日志目录的设置一般我们使用Spring来开发管理后台或者api时,都会遵循一些分层范式, api -> manager -> service -> dao,那么根据这种分层,我们考虑为我们的
2021-01-17 13:51:45 1893 2
原创 springboot集成sharding-shardingsphere做分库分表(二)
目录一、背景二、撸码1、建表2、user表(1)user表分库规则:(2)user表分表规则:3、order表(1)order表分库规则:(2)order表分表规则:4、做sharding配置5、做测试6、做总结:一、背景springboot集成sharding-shardingsphere做分库分表(一)上篇文章我们在springboot里集成了sharding-shardingsphere做分库分表,且测试完成了,当时我们每个库里的表名都是一样
2021-01-10 10:04:44 1047
原创 重试任务(二)
1、表CREATE TABLE `retry_task` ( `task_id` varchar(128) NOT NULL COMMENT '主键id', `gmt_create` timestamp(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6) COMMENT '创建时间', `gmt_modified` timestamp(6) NOT NULL DEFAULT '0000-00-00 00:00:00.000000' COMMENT '修改时间'
2020-12-29 17:53:23 1321 2
原创 Spring中集成Groovy的四种方式
groovy是一种动态脚本语言,适用于一些可变、和规则配置性的需求,目前Spring提供ScriptSource接口,支持两种类型,一种是ResourceScriptSource,另一种是 StaticScriptSource,但是有的场景我们需要把groovy代码放进DB中,所以我们需要扩展这个。ResourceScriptSource:在 resources 下面写groovy类StaticScriptSource:把groovy类代码放进XML里DatabaseScriptSour
2020-09-27 09:05:08 9427 16
原创 使用 spring EL 表达式 完成动态配置(四)
使用 spring EL 表达式 完成动态配置(一)使用 spring EL 表达式 完成动态配置(二)使用 spring EL 表达式 完成动态配置(三)背景:上篇文章,我们已经做出来基本的功能,DB里的规则可以这么配置:#UserFact.exists == true and #UserFact.status == "ENABLE"但是呢我们发现,一条配置里只能配置一个Fact,UserFact,而平时的项目肯定会有类似这样的组合规则:用户存在且可用,账户余额还要大于10块钱,
2020-09-21 21:57:28 785
原创 BDD之单元测试(四):实际的项目教程
上篇文章是介绍了BDD的官方教程,对我们的 CucumberController 做了单元测试;那么实际项目中,需要对很多个类写单元测试,那么我们把demo多写一下,方便其他同学快速编码。1、我们对 CalculateController 、 CucumberController 两个接口进行做单元测试2、calculate_reward.feature3、steps4、runtest5、测试...
2020-07-12 15:46:31 842
原创 springboot + shiro + cas 实现 登录 + 授权 + sso单点登录 (一)
背景:1、每家公司基本都会有自己的管理平台,说到管理平台就离不开 角色,权限等问题,避免越权问题。所以我们引入shiro来解决这个问题,为什么用shiro呢?因为他功能全,开发简单。2、每家公司基本都不只一个管理平台,可能有很多个,如果我们登录每个平台都需要输入账号密码的话,那也太麻烦了吧。所以我们引入cas来做sso单点登录,意思就是,我只要登录了一个管理平台,从这个平台里跳到另外一个平...
2020-04-10 19:36:40 7486 1
原创 【云原生】Apisix接入Nacos、K8s服务注册中心自动获取服务
我们看到,我们再调用网关之前,需要配置上游,填入上游的地址和端口,但是端口是变的,每次服务重启之后都是变化的,而且网关本身也是要知道我们微服务架构中共有哪些服务,因为服务经常会上下线,网关路由需要感知到。这次经过网关,要访问网关的地址和端口,网关会根据我们的配置进行路由,9080是网关默认的端口,因为我在配置路由时给了域名,所以这里需要加上;这里可以选择很多插件,有限流、gRpc转换等插件,我这里选择一个限流插件使用,gRpc的后面再演示。然后经过Apisix再调用一次,发现结果是一样的,测试成功。
2023-03-10 16:47:20 1600 1
原创 【云原生】Istio请求路由、流量转发、超时配置等
代码继续接着前面的文章,本篇文章我们测试下请求路由功能。生产中我们上了个新接口或者新功能,一般会经过 内灰 -> 外灰5% -> 外灰10% ...... 外灰100%的过程,这篇文章我们就来模拟下。为了方便测试,我修改yaml文件,同一个应用部署多个版本,每个版本代表着一个新的功能。
2023-03-07 11:26:23 516
原创 【云原生】整合K8s + SpringCloudK8s + gRpc + RocketMQ + Istio + Envoy
K8s + SpringCloudK8s + gRpc + RocketMQ + Istio + Envoy
2023-03-05 10:23:16 2328
原创 【云原生】Trace、Metrics、Logging 选型
OpenTracing 的优势在于制定了一套无关厂商、无关平台的协议标准,使开发人员只需要修改 Tracer 就可以更迅捷的添加或更换底层监控的实现,被追踪的服务只需要调用相关 API 接口,就可被任何实现这套接口的追踪后台支持。在上述的项目中有两个项目较为特殊:其一是OpenTracing,他制定了一套无关平台的统一的Trace的标准,后续的很多项目例如Jaeger等都是基于此协议,因此他在当时的Trace标准领域具有不小影响力;许多语言都带有类型定义,可以在实现中使用,例如用于创建可重用组件的接口。
2023-03-04 23:04:48 846
原创 【云原生】Gateway网关选型
网关一般分为流量网关和业务网关,流量网关负责接入所有的流量,并分发给不同的子系统,那在具体的业务接入之前,还有一层业务网关。流量网关提供全局性的、与后端业务应用无关的策略,例如 HTTPS证书卸载、Web防火墙、全局流量监控、日志记录、黑白名单控制、接入请求到业务系统的负载均衡等,比如Kong。业务网关业务紧耦合的、提供单个业务域级别的策略,如服务治理、身份认证,权限控制、日志输出、数据加密、熔断限流等等,比如K8s的Ingress。流量网关负责南北向流量调度及安全防护,业务网关负责东西。
2023-03-04 23:00:26 2117
原创 【云原生】K8s中gRpc通信负载均衡失效
上篇文章在做 整合K8s+SpringCloudK8s+SpringBoot+gRpc 时,发现K8s中使用gRpc通信,负载均衡功能失效
2023-02-21 14:21:34 661 3
原创 【云原生】Consul & SpringCloudK8S 选型
说起微服务,就需要用到SpringCloud,目前市面上主流的SpringCloud产品有这些:SpringCloudNeflix、Spring Cloud Alibaba、Spring Cloud for AWS、Spring Cloud Azure 和 Spring Cloud Kubernetes。其中SpringCloudNeflix已经不在更新,只做维护,所以不再考虑。因为我们的需求是一套架构能够快速的部署到不同的云上,为了避免日后不好在多个云之间移植,我们所使用的产品或工具就不能和云厂商做强
2023-02-15 17:52:26 657
原创 AQS学习
提供一个框架,用于实现依赖于先进先出 (FIFO) 等待队列的阻塞锁和相关同步器(信号量、事件等)。此类旨在成为大多数依赖单个原子 int 值来表示状态的同步器的有用基础。子类必须定义更改此状态的protected的方法,并根据获取或释放此对象来定义该状态的含义。鉴于这些,此类中的其他方法执行所有排队和阻塞机制。子类可以维护其他状态字段,但只有使用方法 getState、setState 和 compareAndSetState 操作的原子更新的 int 值在同步方面被跟踪。
2022-12-15 16:34:01 445
原创 参数化集成测试
我们在开发项目的过程中遇到了复杂的业务需求,测试同学没有办法帮我们覆盖每一个场景;或者是我们自己在做代码功能升级、技改,而不是业务需求的时候,可能没有测试资源帮我们做测试,那这个时候就需要依靠自己的单元测试来保证产品的质量。我们的工程一般分为接口层,业务层,仓储层;那每一个模块都需要我们用单元测试来覆盖。仓储层:这一层,我们一般会连接到真实的数据库,完成仓储层的CRUD,我们可以连到开发库或者测试库,但是仅仅是单元测试就需要对我们资源占用,成本有点高,所以h2基于内存的数据库就很好的帮我们解决这些问题。
2022-12-10 16:24:15 648
原创 【maven】maven多module脚手架
每个公司都有一套自己的工程模板,为了提高创建新工程的效率,以及统一工程规范,这里使用maven自带的功能archetype来产出一份工程脚手架。1、idea中安装插件Maven Archetype Catalogs,直接在Plugins里搜索安装2、手动新建maven多module工程3、在工程根目录下执行命令:mvn archetype:create-from-project,会生成 target 目录4、进到 target/generated-sources/archetype/
2022-05-02 18:38:03 1012
原创 【Spring】实例化、初始化、InitializingBean等执行顺序(二)
下面我们从源码的角度证明我们上篇文章的正确性。看到了熟悉的 refresh() 方法继续走下面的 doCreateBean()先看populateBean()总结:上面的源码图可以对应到上篇文章的执行顺序。1、实例化之前 ——>实例化(构造函数) ——> 实例化之后2、初始化之前 ——>PostConstruct ——>实现了InitializingBean接口 ——&g...
2021-11-09 15:22:19 1581
原创 【Spring】实例化、初始化、InitializingBean等执行顺序(一)
今天先来测试一下Spring 初始化IOC流程中,构造函数、@PostConstruct、InitializingBean接口,InstantiationAwareBeanPostProcessor接口,initMethod 等执行顺序。pom <dependency> <groupId>org.springframework</groupId> <artifactId>spring-c.
2021-10-30 16:59:29 1712
原创 如何实现自己的spring boot starter(二)
我们在SpringBoot中使用redis的时候,直接引用 spring-boot-starter-data-redis 的pom,然后配置spring.redis.host = localhostspring.redis.port = 6379spring.redis.password = 123456就可以使用在我们的业务系统里注入redisTemplate来操作redis了,但是他是怎么工作的呢?让我们走进SpringBoot的源码,看几张截图:在 spring-boot-a
2021-10-14 14:46:04 293 3
原创 如何实现自己的spring boot starter(一)
目录背景:客户端 my-spring-boot-starter-client:POMHelloWorldPropertiesHelloWorldAutoConfigurationHelloWorldMETA-INF:服务端:my-spring-boot-starter-consumerPOM:application.propertiesTestController测试:客户端打jar包服务端引用坐标启动服务端,请求localhost:80...
2021-10-07 20:00:02 272
原创 学习总结^-^
2021.06.15开始准备面试1、HashMapHashMap底层就是一个数组,数组中的每一项又是一个链表。当新建一个HashMap的时候,就会初始化一个数组。源码如下:
2021-06-15 22:12:29 247 7
原创 【Spring】Ioc容器的初始化过程:BeanDefinition的Resource定位
以编程的方式使用DefaultListableBeanFactory时,首先定义一个Resource来定位容器使用的BeanDefinition。这时使用的是ClassPathResource,这意味着Spring会在类路径中去寻找以文件形式存在的BeanDefinition信息。ClassPathResource res = new ClassPathResource("beans.xml");这里定义的Resource并不能由DefaultListableBeanFactory直接使用,Spr
2021-05-16 21:44:49 258 1
原创 【Spring】IoC容器系列的设计与实现:BeanFactory和ApplicationContext
在Spring IoC容器的设计中,我们可以看到两个主要的容器系列,一个是实现BeanFactory接口的简单容器系列,这系列容器只实现了容器的最基本功能,另一个是ApplicationContext应用上下文,它作为容器的高级形态而存在。应用上下文在简单容器的基础上,增加了许多面向框架的特性,同时对应用环境做了许多适配。有了这两种基本的容器系列,基本上可以满足用户对IoC容器使用的大部分需求了。下面,我们就对Spring IoC容器中这两种容器系列的设计与实现进行一个简要的分析。Spring的IoC容
2021-05-16 09:43:00 304 1
原创 【RocketMQ】Springboot集成RocketMQ(三)
目录新建工程新建model新建生产者场景枚举类新建消费者修改配置文件新增测试类新建工程新建一个SpringBoot项目,引入RocketMQ 的 pom <dependency> <groupId>org.apache.rocketmq</groupId> <artifactId>rocketmq-spring-boot-starter</artifa
2021-04-24 20:32:56 504 2
cas-client.7z
2020-04-12
cas-server.7z
2020-04-12
工程里面的eclipse.bat和install.bat都是什么呀。
2016-11-24
js里鼠标移到图片上图片随着鼠标放大
2016-07-13
js里的<img src="" .....>
2016-07-08
慢慢看,应该能看懂。java小白。
2016-06-07
TA创建的收藏夹 TA关注的收藏夹
TA关注的人