Spring Cloud Ribbon 深入学习
通过添加注释@LoanBalanced就开启了客户端负载均衡
Ribbon客户端负载均衡原理
对于一个客户端负载均衡实现方案,核心一般有服务发现,服务监听,服务选择.
服务发现:能够自动发现所依赖服务的列表
服务监听: 能够监听到失效的服务,并高效地将失效服务从服务列表中剔除
服务选择策略: 即负载均衡策略,能够决定如何在多个服务实例中选择一个有效的服务实例,并进行相应的服务请求处理。
Ribbon作为Spring Cloud中客户端负载均衡实现方案,在具体实现上主要有6大组件:
1. 服务器列表
服务器列表就是客户端负载均衡所使用的各服务的服务实例列表,Ribbon在实现上支持以下3种服务器列表方式:
列表服务器列表: 可以通过Ribbon中的BaseLoanBalancer所提供的setServeList()方法直接设置
基于配置的服务列表:需要在项目配置文件中通过<服务名称>.ribbon.listOfServers属性进行设置。代码如下:USERSERVICE.ribbon.listOfServers=http://192.168.1.12:8200,http://192.168.1.12:8201
基于服务发现的服务列表:在应用中使用Ribbon和Eureka时,默认使用这种方式,在应用启动Ribbon就会从Eureka服务器中获取所有注册服务的列表数据,并保持同步。
2. 服务列表过滤器(ServerListFilter)
开发者使用动态服务器列表时,该组件会对原始服务列表使用一定的策略进行过滤,并返回有效的服务器列表给客户端负载均衡器使用。Ribbon在具体实现上提供以下可能过滤器供开发人员在应用中进行选择:
ZoneAffinityServerListFilter: 该过滤器基于区域感知的方式,实现对服务实例过滤,仅返回与本身所在区域一致的服务提供者服务列表
ServerListSubsetFilter: 该过滤器继承自ZoneAffinityServerListFilter,在进行区域感知过滤后,瓜返回一个固定大小的服务列表,也就是说不会返回全部符合条件的服务实例列表,这种过滤器非常适用于拥有大规模服务器集群的系统,默认将返回20个服务实例,但是可以通过ribbon.ServerListSubsetFilter.size属性设置具体返回的服务实例个数
ZonePreferenceServerListFilter: 是Spring Cloud融合Netflix时新增的一个过滤器,当开发者使用Spring Cloud整个Eureka和Ribbon时就会默认使用该过滤器,其主要是实现通过配置或Eureka所属区域来过滤出同区域的服务实例列表。
3. 服务实例存活探测(IPing)
简单来说服务实例存活探测就像开发者常用的ping命令一样,用来监测一个微服务实例是否有响应,Ribbon通过该组件来判断所持有的服务实例列表中的各服务可能情况,如果检测到某服务实例不再可用则会从列表中及时剔除。Ribbon默认提供以下实现:
PingUrl: 通过定期访问指定的URL来判断服务器是否可用
PingConstant: 不做任何处理,只是返回一个固定值,用来表示该服务器是否可用,默认值:true,即可用
NoOpPing: 不做任务处理,只返回true,表示服务器可用,这是默认策略
DummyPing: 直接返回true,但实现了initWithNiWsConfig方法
NiWsDiscoveryPing: 根据DiscoveryEnabledServer中InstanceInfo的InstanceStatus属性判断,如果该属性的值为InstanceStatus.UP,则表示服务器可用,否则为不可用