【总结学习】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向服务提供者发起的请求的工具

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值