Spring Cloud提供了分布式系统中的常用组件,例如:配置管理器、服务发现、断路器、智能路由、消息总线、全局锁、选举等能力。
一、服务治理组件
Eureka:Netflix提供的注册中心,基于AP模型
Nacos:Alibaba提供的注册中心,也是基于AP模型
二、客户端负载均衡组件
1、Spring Cloud LoadBalancer:SpringCloud的负载均衡器,新项目优先选择。
2、Ribbon:Netflix提供的客户端负载均衡组件,仅维护。
1)Ribbon核心组件的默认配置类是RibbonClientConfiguration.java。
接口定义 | SpringBeanName | 默认实现类 | 说明 |
IClientConfig | ribbonClientConfig |
DefaultClient ConfigImpl | 客户端配置 |
IRule | ribbonRule |
ZoneAvoidance Rule | 负载均衡策略 |
IPing | ribbonPing | DummyPing | 验证服务实例是否可用 |
ServerList <Server> | ribbonServerList |
Configuration BasedServerList | 服务实例清单 |
ServerListFilter <Server> | ribbonServerListFilter |
ZonePreference ServerListFilter | 根据条件过滤后得到的服务实例清单 |
ILoadBalancer | ribbonLoadBalancer |
ZoneAware LoadBalancer | 按某种策略来选取服务实例 |
ServerList Updater |
ribbonServer ListUpdater |
PollingServer ListUpdater | 更新服务实例清单 |
2)Ribbon核心类图
3)Ribbon配置
Ribbon核心组件的默认配置类是RibbonClientConfiguration.java。
a)配置文件方式配置
<clientName>.ribbon.NFLoadBalancerClassName:负载均衡类
<clientName>.ribbon.NFLoadBalancerRuleClassName:负载均衡策略类
<clientName>.ribbon.NFLoadBalancerPingClassName:心跳检测类
<clientName>.ribbon.NIWSServerListClassName:服务实例清单类
<clientName>.ribbon.NIWSServerListFilterClassName:服务实例清单过滤类
b)注解方式配置
@RibbonClient/@RibbonClients
注意:FundConfiguration.java不能放在SpringBoot主入口文件扫描范围内,否则其配置的策略会对全局生效。且优先级大于@RibbonClient的方式。
c)饥饿加载,可提高首次请求时的访问速度
#ribbon: # eager-load: # # 是否启动饥渴加载?默认值为false # enabled: true # # 饥渴加载的微服务ID # clients: user, product, fund
三、高可用组件
服务熔断、降级:需要结合企业的实际业务进行处理。
1、Hystrix:底层采用RxJava,采用观察者模式实现,已经停止更新。
Hystrix特性
- 命令模式:请求调用封装为Hystrix命令
- Hystrix将结果存储到10个1秒的桶里
- 5秒后,状态为HALF_OPEN,然后有一次请求就能关闭断路器
关键设计模式:命令模式、工厂模式、动态代理。
“Hystrix流程图”
- execute():阻塞的,返回单个响应。
- queue():返回包含单个响应的Future对象。
- observe():返回Observable对象。hot。
- toObservable():返回Observable对象。cold。订阅了消息源,并不会立刻将消息传递给订阅者,订阅者需再次发送命令,消息源才会将消息传递给观察者。
“hystrix断路器工作原理图(对应上图中4)”
- Hystrix使用
a)命令方式:HystrixCommand<R>/HystrixObservableCommand<R>
b)注解方式:@HystrixCommand(fallbackMethod="fallback1",observableExecutionMode=ObservableExecutionMode.EAGER,ignoreExceptions={XxxException,YyyException})
注意:非HystrixBadRequestException才会触发fallback降级逻辑。
- Hystrix缓存
a)只在当前请求内有效,注意脏读情况。
b)代码方式
c)注解方式
@CacheResult(cacheKeyMethod="getCacheKey")
@HystrixCommand(commandKey="user_get")
@Override
public UserInfo getUserInfo(@CacheKey Long id){ //todo }
@CacheRemove(commandKey = "user_get", cacheKeyMethod="getCacheKey")
@HystrixCommand
@Override
public UserInfo updateUserInfo(UserInfo user){ //todo }
public String getCacheKey(Long id){return "user_"+id;}
public String getCacheKey(UserInfo user){return "user_"+user.getId();}
- Hystrix请求合并
@HystrixCollapser(collapserKey="userGroup",batchMethod="findUser2",scope=Scope.GLOBAL,collapserProperties={
@HystrixProperty(name="timerDelayInMilliseseconds",value="50"),//合并时间戳
@HystrixProperty(name="maxRequestsInBatch",value="10"),//合并最大请求数
})
public Future<UserInfo> getUser2(Long id){return null;}
@HystrixCommand(commandKey="userGroup")
@Override
public List<UserInfo> findUsers2(List<Long> ids){//todo}
- 隔离(舱壁模式)
线程池/信号量
组别键/命令键/线程池键
@HystrixCommand(
groupKey="userGroup" ,
commandKey="userGroup" ,
threadPoolKey="pool-user",
fallbackMethod="fallbackMethod",
observableExecutionMode=ObservableExecutionMode.EAGER,
commandProperties={@HystrixProperty(name="execution.isolation.stragegy",value="semaphore"),@HystrixProperty(name="circuitBreaker.errorThresholdPercentage",value="30"),@HystrixProperty(name="execution.timeout.enabled",value="true"),@HystrixProperty(name="execution.isolation.thread.timeoutInMilliseconds",value="1000"),@HystrixProperty(name="execution.isolation.thread.interruptOnTimeout",value="true")},
threadPoolProperties={})
2、Resilience4j
Resilience4j特性:
- 基于函数式和Lambda表达式;
- 执行结果存储到环形缓存区(固定长度的数组);
- 通过请求结果的数量与阈值的比较来判断断路器的状态;
环形缓冲区:
- 是一个长度为16的Long数组,它可以表示 16*64=1024位数字。可以表达1024个请 求的成功或失败的状态。它提供了无锁的读写操作,读取数据时,只修改head指针,写入数据时只修改tail指针,这些都是基于CAS的。head==tail表示数组为空,head==(tail+1) mod buffer.length表示数组满了。
核心模块:
- resilience-4j-circuitbreaker:断路器
状态:CLOSED、OPEN、HALF_OPEN,对外发布事件。
CircuitBreaker.Metrics、EventConsumer<T>。
- resilience-4j-ratelimiter:限速器
RateLimiter.Metrics、EventConsumer、RateLimiterConfig、RateLimiterRegistry、RateLimiter
- resilience-4j-bulkhead:舱壁模式
仅提供信号量模式。
BulkheadConfig、BulkheadRegistry、Bulkhead。
事件类型:CALL_PERMITTED、CALL_REJECTED、CALL_FINISHED
- resilience-4j-retry:自动重试
- resilience-4j-cache:缓存
- resilience-4j-timelimiter:超时处理
附加模块:
- resilience-4j-reactor:Spring Reactor适配器
- resilience-4j-rxjava2:RxJava2适配器
- resilience-4j-micrometer:Micrometer度量输出
- resilience-4j-metrics:Dropwizard度量输出
- resilience-4j-prometheus:Prometheus度量输出
- resilience-4j-spring-boot2:
- resilience-4j-ratpack:Ratpack启动器
- resilience-4j-retrofit:Retrofit Call适配器工程
- resilience-4j-vertx:Vertx Future装饰器
- resilience-4j-consumer:环形缓冲区事件消费者
3、Sentinel:面向云原生微服务的高可用流控防护组件
五、声明式客户端调用
OpenFeign
六、网关
Zuul
Gateway
七、配置中心-Config
八、全链路追踪-Sleuth
九、分布式事务
1、2PC模式
事务管理器(TM,协调者)、资源管理器(RM)。存在阻塞问题、协调者单点问题。
2、TCC模式:与2PC相比,TCC位于业务层而非资源层。
Try:
Confirm:
Cancel:
3、基于事务消息的最终一致性
RocketMQ实现分布式事务流程图:
4、Saga模式:由事件驱动、参与者提供冲正补偿服务(正向操作、逆向操作)
5、开源项目-Seata:是一款开源分布式事务解决方案,提供微服务架构下的分布式事务解决方案。支持AT、TCC、SAGA、XA四种模式。
- TC:事务协调者,维护全局和分支事务的状态,驱动全局事务提交或回滚。
- TM:事务管理器,定义全局事务范围,开启、提交、回滚全局事务。
- RM:资源管理器,管理分支事务处理的资源,与TC交谈以注册分支事务和报告分支事务的状态,驱动分支事务提交或回滚。
执行流程:TM开启分布式事务(向TC注册全局事务) -> RM向TC汇报资源准备状态 -> TM通知TC提交/回滚分布式事务 -> TC决定分布式事务是提交还是回滚 -> TC通知所有RM提交/回滚资源。