深入Ribbon
1、Ribbon客户端负载均衡原理
对于一个客户端负载均衡实现方案,主要核心三个步骤:
- 服务发现:能够自动发现所依赖服务的列表
- 服务监听:能够监测到失败的服务,并高效地将失败服务从服务列表中移除
- 负载均衡策略:能够决定如何在多个服务实例中选择一个有效的服务实例,并进行相应的服务请求处理。
Ribbon在具体实现上,有以下组件:
服务器列表(ServerList)
服务器列表就是客户端负载均衡所使用的各服务的服务实例列表。Ribbon在实现上支持3中服务列表方式
- 静态服务器列表:通过Ribbon的BaseLoadBalancer所提供的setServerList()方法直接进行设置。
- 基于配置的服务器列表:需要在项目配置文件中通过<服务名称>.ribbon.listOfServers进行设置。(如user-service.ribbon.listOfServers=http://127.0.0.1:8000,http://127.0.0.1:8001)
- 基于服务发现的服务器列表:同时使用Ribbon和Eureka时,默认使用该方式,在应用启动时Ribbon就会从Eureka服务器中获取所有注册服务的列表数据,并保持同步。
服务器列表过滤(ServerListFilter)
该组件会对原始服务列表使用一定策略进行过滤,并返回有效的服务器列表给客户端负载均衡器使用。
- ZoneAffinityServerListFilter:基于区域感知的方式,实现对服务实例的过滤,仅返回与本身所处区域一直的服务提供者实例列表。
- ServerListSubsetFilter:该过滤器继承自ZoneAffinityServerListFilter,在进行区域感知过滤后,仅返回一个固定大小的服务列表。默认将返回20个服务实例,可以通过ribbon.ServerListSubsetFilter.size进行设置。
- ZonePreferenceServerListFilter:使用Eureka和Ribbon时默认的过滤器。实现通过配置或者Eureka所属区域来过滤出同区域的服务实例列表。
服务实例存活探测(IPing)
用来检测一个微服务实例是否有相应。Ribbon通过该组件来判断所持有的服务实例列表中各服务可用情况,如果检测到某服务实例不存在,则会从列表中及时移除。
- Ping