总结学习Spring Cloud系列之深入理解Ribbon

Posted 在路上的德尔菲

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了总结学习Spring Cloud系列之深入理解Ribbon相关的知识,希望对你有一定的参考价值。

一、简介

Ribbon是客户端负载均衡方案,主要有三部分:

  1. 服务发现:能够自动发现所依赖服务的列表
  2. 服务监听:能够检测到失效的服务,并高效地将失效服务从服务列表中剔除。
  3. 服务选择策略:负载均衡策略,能够决定如何在多个服务实例中选择一个有效的服务实例并进行相应的服务请求处理。

二、使用

2.1 @LoadBalanced 注解

@Bean
@LoadBalanced //开启负载均衡的功能
RestTemplate restTemplate() {
    return new RestTemplate();
}


2.2 LoadBalancerClient Ribbon API

@Autowired
private LoadBalancerClient loadBalancerClient;

ServiceInstance instance = loadBalancerClient.choose("USERSERVICE");

三、原理

3.1服务器列表(ServerList)

  1. 静态服务器列表:在代码里setServerList()设置,写死。
  2. 基于配置的服务器列表:配置文件中设置,写死。
  3. 基于服务发现的服务器列表:当应用中同时使用Eureka和Ribbon时,默认使用这种方式,在应用启动时Ribbon就会从Eureka服务器中获取所有注册服务的列表数据并保持同步

3.2服务器列表过滤器(ServerListFilter)

  1. 区域感知服务器列表过滤器(ZoneAffinityServerListFilter):基于区域感知的方式,仅返回与本身所处区域一致的服务提供者示例列表。
  2. 区域感知服务器列表子集过滤器(ServerListSubsetFilter):继承自ZoneAffinityServerListFilter,仅返回一个固定大小的区域的服务列表,适合拥有大规模服务器集群的系统。
  3. ZonePreferenceServerListFilter:通过配置或者Eureka所属区域来过去同区域的服务实例列表

3.3服务实例存活探测(IPing)

检测一个微服务实例是否有响应,判断服务实例列表中各服务是否可用,如果检测到某服务实例不可用将其剔除,Ribbon提供以下几种实现:

  1. PingUrl
  2. PingConstant
  3. NoOpPing
  4. DummyPing
  5. NIWSDiscoveryPing

3.4负载均衡策略(IRule)

  1. 轮询(RoundRobinRule)
  2. 随机(RandomRule)
  3. 最大可用策略(BestAvailableRule):先过滤出故障服务实例后,选择一个当前并发请求数最小的。
  4. 根据响应时间加权(WeightedResponseTimeRule):根据各个服务实例响应时间加权处理,然后再采用轮询方式获取响应的服务实例。
  5. 可用过滤策略(AvailabilityFilteringRule):和BestAvailableRule类似,先过滤出故障服务实例或并发请求大于阈值的一部分实例后,然后再以线性轮询的方式从过滤的实例列表中选出一个实例。
  6. 区域感知策略(ZoneAvoidanceRule):

3.5负载均衡器(ILoadBalancer)

可以理解为客户端负载均衡大总管,包括前面讲的ServerList、IPing、IRule、Filter

ILoadBalancer接口主要提供增、删、选几个方法,抽象类为AbstractLoadBalancer,具体实现类为DynamicServerListLoadBalancer、ZoneAwareLoadBalancer和NoOpLoadBalancer

public interface ILoadBalancer {

	public void addServer(List<Server> newServers);

	public void markServerDown(Server server);
	
	public Server chooseServer(Object key);

	public List<Server> getAllServers();

	public List<Server> getReachableServers();
}


public abstract class AbstractLoadBalancer implements ILoadBalancer{
	
	public enum ServerGroup{
		ALL,
		STATUS_UP,
		STATUS_NOT_UP
	}

	public abstract List<Server> getServerList(ServerGroup serverGroup);

	public abstract LoadBalancerStats getLoadBalancerStats();
}

3.6 服务调用器(RestClient)

服务调用器为负载均衡后,Ribbon向服务提供者发起的请求的工具

以上是关于总结学习Spring Cloud系列之深入理解Ribbon的主要内容,如果未能解决你的问题,请参考以下文章

总结学习Spring Cloud系列之深入理解Zuul

总结学习Spring Cloud系列之深入理解Ribbon

总结学习Spring Cloud系列之深入理解Ribbon

总结学习Spring Cloud系列之深入理解Ribbon

Spring Cloud 系列之 Apollo 配置中心

Spring Cloud 系列之 Apollo 配置中心