微服务-Spring Cloud核心组件原理分析

本文详细介绍了SpringCloud中的服务治理组件Eureka和Nacos,客户端负载均衡器SpringCloudLoadBalancer和Ribbon的使用,以及高可用组件如Hystrix、Resilience4j和Sentinel。涵盖了服务注册、负载均衡策略、熔断降级和分布式事务处理等内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Spring Cloud提供了分布式系统中的常用组件,例如:配置管理器、服务发现、断路器、智能路由、消息总线、全局锁、选举等能力。

一、服务治理组件    

Eureka:Netflix提供的注册中心,基于AP模型

Nacos:Alibaba提供的注册中心,也是基于AP模型

二、客户端负载均衡组件

1、Spring Cloud LoadBalancer:SpringCloud的负载均衡器,新项目优先选择。

2、Ribbon:Netflix提供的客户端负载均衡组件,仅维护。

1)Ribbon核心组件的默认配置类是RibbonClientConfiguration.java。

Ribbon核心接口
接口定义SpringBeanName默认实现类说明
IClientConfigribbonClientConfig

DefaultClient

ConfigImpl

客户端配置
IRuleribbonRule

ZoneAvoidance

Rule

负载均衡策略
IPingribbonPingDummyPing验证服务实例是否可用

ServerList

<Server>

ribbonServerList

Configuration

BasedServerList

服务实例清单

ServerListFilter

<Server>

ribbonServerListFilter

ZonePreference

ServerListFilter

根据条件过滤后得到的服务实例清单
ILoadBalancerribbonLoadBalancer

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提交/回滚资源。

​​​​​​​

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值