为什么会出现Ribbon?
当启动某个服务的时候,可以通过HTTP的形式将信息注册到注册中心,并且可以通过Spring Cloud提供的工具获取注册中心的服务列表。但是服务之间的调用还存在很多的问题,如何更加方便的调用微服务,多个微服务的提供者如何选择,如何负载均衡等。
Ribbon概述
什么是Ribbon?
Ribbon是Netflix发布的一个负载均衡器,有助于控制HTTP和TCP客户端行为。在SpringCloud中,Eureka一般配合Ribbon进行使用,Ribbon提供了客户端负载均衡的功能,Ribbon利用从Rureka中读取到的服务信息,在调用服务节点提供的服务时,会合理地进行负载。
在SpringCloud中可以将注册中心和Ribbon配合使用,Ribbon自动地从注册中心中获取服务提供者的列表信息,并基于内置的负载均衡算法,请求服务。
Ribbon的主要作用?
- 服务调用
基于Ribbon实现服务调用,是通过拉取到所有的服务列表组成(服务名-请求路径)的映射关系。借助RestTemplate最终进行调用。
- 负载均衡
Ribbon是一个典型的客户端负载均衡器;而nginx属于服务端的负载均衡;
当有多个服务提供者时,Ribbon可以根据负载均衡的算法自动地选择需要调用的服务地址。
@LoadBalanced:是ribbon提供的负载均衡的注解
负载均衡策略
RoumdRobinRule:以轮询的方式进行负载均衡
RandomRule:随机策略
RetryRule:重试策略
WeightedResponseTimeRule:权重策略,会计算每个服务的权重,越高的被调用的可能性越大
BestAvailableRule:最佳策略,遍历所有的服务实例,过滤掉故障实例,并返回请求数量最小的实例
AvailabilityFilteringRule:可用过滤策略,过滤掉故障和请求数量超过阈值的服务实例,再从剩下的实例中轮询调用
策略选择
如果每个机器配置一样,则建议不修改策略
如果部分机器配置强,则可以改为WeightedResponseTimeRule
重试机制
坐标
<dependency>
<groupId>org.springframework.retry</groupId>
<artifactId>spring-retry</artifactId>
</dependency>
yml
#修改ribbon的负载均衡策略 服务名 - ribbon - NFLoadBalancerRuleClassName : 策略
service-product:
ribbon:
#NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandonRule
ConnectTimeout: 250 #Ribbon的超时时间
ReadTimeout: 1000 #Ribbon的数据读取超时时间
OkToRetryOnAllOperations: true #是否对所有操作都进行重试
MaxAutoRetriesNextServer: 1 #切换实例的重试次数
MaxAutoRetries: 1 #对当前实例的重试次数
在一个请求过来时,ribbon会添加请求拦截器,执行intercept方法,根据请求的serviceId筛选服务列表并根据负载均衡算法得出来一个地址,最终调用远程服务。
重试也是添加拦截器
RibbonAutoConfiguration(自动装配)