zestroly 2019-01-06
Spring Cloud Ribbon是基于Netflix Ribbon实现的一套客户端负载均衡的工具。它是一个基于HTTP和TCP的客户端负载均衡器。它可以通过在客户端中配置ribbonServerList来设置服务端列表去轮询访问以达到均衡负载的作用。
主要包括六个组件:
1、ServerList,负载均衡使用的服务器列表。这个列表会缓存在负载均衡器中,并定期更新。当 Ribbon 与 Eureka 结合使用时,ServerList 的实现类就是 DiscoveryEnabledNIWSServerList,它会保存 Eureka Server 中注册的服务实例表。
2、ServerListFilter,服务器列表过滤器。这是一个接口,主要用于对 Service Consumer 获取到的服务器列表进行预过滤,过滤的结果也是 ServerList。Ribbon 提供了多种过滤器的实现。
3、IPing,探测服务实例是否存活的策略。
4、IRule,负载均衡策略,其实现类表述的策略包括:轮询、随机、根据响应时间加权等。
5、ILoadBalancer,负载均衡器。这也是一个接口,Ribbon 为其提供了多个实现,比如 ZoneAwareLoadBalancer。而上层代码通过调用其 API 进行服务调用的负载均衡选择。
6、RestClient,服务调用器。
主要负载均衡策略:
1、com.netflix.loadbalancer.RoundRobinRule:轮询,这是默认的策略。
2、com.netflix.loadbalancer.RandomRule:随机
3、com.netflix.loadbalancer.RetryRule:对选定的负载均衡策略机上重试机制,在一个配置时间段内当选择server不成功,则一直尝试使用subRule的方式选择一个可用的server
4、com.netflix.loadbalancer.WeightedResponseTimeRule:加权响应时间。根据相应时间分配一个weight,相应时间越长,weight越小,被选中的可能性越低。
5、com.netflix.loadbalancer.ZoneAvoidanceRule:区域感知轮询。复合判断server所在区域的性能和server的可用性选择server
6、com.netflix.loadbalancer.AvailabilityFilteringRule:过滤掉那些因为一直连接失败的被标记为circuit tripped的后端server,并过滤掉那些高并发的的后端server。
7、com.netflix.loadbalancer.BestAvailableRule:选择一个最小的并发请求的server,逐个考察Server,如果Server被tripped了,则忽略
启动类:
@EnableEurekaClient // @RibbonClient(name="service-provider-1", configuration=DefaultRibbonConfiguration.class) @SpringBootApplication public class Main { @Bean @LoadBalanced //添加负载均衡支持,默认策略是轮询 public RestTemplate getRestTemplate() { return new RestTemplate(); } public static void main(String[] args) { SpringApplication.run(Main.class, args); } }
Controller类:
@RestController public class UserController { @Autowired private RestTemplate restTemplate; @GetMapping("/user/{id}") public String addUser(@PathVariable Long id){ //服务提供者的接口地址:此处用 spring.application.name 属性值 String url = "http://service-provider-1/user/" + id; //通过RestTemplate对象调用接口 String result = restTemplate.getForObject(url, String.class); return result; } }
通过自定义Ribbon更改默认的负载均衡策略,有以下两种方式:
1、通过代码自定义Ribbon
创建Ribbon配置类
/** * 自定义Ribbon配置类 * * 该配置类不能被@ComponentScan扫描到,否则配置信息就会被所有 @RibbonClient 共享 * Ribbon默认配置类是 RibbonClientConfiguration */ @Configuration public class DefaultRibbonConfiguration { @Bean public IRule ribbonRule(){ IRule rule = new RandomRule(); return rule; } }
在启动类中使用 @RibbonClient 或 @RibbonClients 注解为服务提供者指定Ribbon配置类
@RibbonClient(name="service-provider-1", configuration=DefaultRibbonConfiguration.class)
2、使用配置文件自定义Ribbon
在application.properties文件中添加以下配置信息
service-provider-1.ribbon.NFLoadBalancerRuleClassName=com.netflix.loadbalancer.RandomRule