首先Ribbon是Spring Cloud的核心组件之一,使用很简单,核心代码如下:
@Bean
@LoadBalanced
RestTemplate restTemplate() {
return new RestTemplate();
}
需要明确的是@LoadBalanced注解是Spring的而非Ribbon的,且我们加上了@Bean注解,所以在spring启动时会将它注入到spring容器中,Ribbon通过一个@LoadBalanced注解就实现了RestTemplate请求的负载均衡,它具体的执行过程如下:
- 第一步客户端通过RestTemplate调用服务端的服务
- 请求首先被:LoadBalancerInterceptor类(负载均衡拦截器)拦截
- LoadBalancerInterceptor类有个LoadBalancerInterceptor方法,该方法入参为LoadBalancerClient对象
- 通过LoadBalancerClient可以获取到ILoadBalancer接口,通过该接口的方法可以查询到所有的服务列表
- ILoadBalancer(BaseLoadBalancer为其实现类之一)它的实现类里有个IRule接口,该接口就是用来设置负载均衡策略的,默认使用的是轮询,可通过配置文件设置。
- Ribbon提供了七种负载均衡策略
浅谈Ribbon和nginx负载均衡的区别名称 解释 RoundRobinRule 轮训策略 RandomRule 随机策略 BestAvailableRule 过滤出故障服务器后,选择一个并发量最小的 WeightedResponseTimeRule 针对响应时间加权轮询 AvailabilityFilteringRule 可用过滤策略,先过滤出故障的或并发请求大于阈值的一部分服务实例,然后再以线性轮询的方式从过滤后的实例清单中选出一个; ZoneAvoidanceRule 从最佳区域实例集合中选择一个最优性能的服务实例 RetryRule 选择一个Server,如果失败,重新选择一个Server重试