在集群环境中,用多个节点来提供服务,难免会有某个节点出现故障。用 Nginx 做负载均衡的时候,如果应用是无状态的、可以滚动发布的,也就是需要一台台去重启应用,这样对用户的影响其实是比较小的,因为 Nginx 在转发请求失败后会重新将该请求转发到别的实例上去。
由于 Eureka 是基于 AP 原则构建的,牺牲了数据的一致性,每个 Eureka 服务都会保存注册的服务信息,当注册的客户端与 Eureka 的心跳无法保持时,有可能是网络原因,也有可能是服务挂掉了,在这种情况下,Eureka 中还会在一段时间内保存注册信息,这时客户端就有可能拿到已经挂掉了的服务信息,故 Ribbon 就有可能拿到已经失效了的服务信息,这样就会导致发生失败的请求,避免这种问题可以选用重试机制,即当ribbon发现请求的服务不可到达时,重新请求另外的服务;
ribbon重试机制
ribbon自带的retryrule重试:
ribbon-config-demo.ribbon.NFLoadBalancerRuleClassName=com.netflix.loadbalancer.RetryRule
spring的retry重试:
·引入依赖
<dependency>
<groupId>org.springframework.retry</groupId>
<artifactId>spring-retry</artifactId>
</dependency>
·配置重试数据:
# 对当前实例的重试次数
ribbon.maxAutoRetries=1
# 切换实例的重试次数
ribbon.maxAutoRetriesNextServer=3
# 对所有操作请求都进行重试
ribbon.okToRetryOnAllOperations=true
# 对Http响应码进行重试
ribbon.retryableStatusCodes=500,404,502
rbbon配置
配置文件方式配置:
(负载均衡器操作接口):
<clientName>.ribbon.NFLoadBalancerClassName: Should implement ILoadBalancer
(负载均衡算法):
<clientName>.ribbon.NFLoadBalancerRuleClassName: Should implement IRule
(服务可用性检查):
<clientName>.ribbon.NFLoadBalancerPingClassName: Should implement IPing
(服务列表获取):
<clientName>.ribbon.NIWSServerListClassName: Should implement ServerList
(服务列表的过滤):
<clientName>.ribbon.NIWSServerListFilterClassName: Should implement ServerListFilter
代理配置ribbon:
·配置负载策略配置类
@Configuration
public class BeanConfiguration { @Bean public MyRule rule() { return new MyRule(); } }
·创建ribbon客户端配置类,关联beanconfiguration,用name指定调用的服务名称:
@RibbonClient(name = "ribbon-config-demo", configuration = BeanConfiguration.class)
public class RibbonClientConfig { }
常用的ribbon配置:
·当不想和eureka集成时,可以配置:
# 禁用 Eureka
ribbon.eureka.enabled=false
·当禁用eureka后需要手动配置调用的服务地址,可以配置如:
# 禁用 Eureka 后手动配置服务地址
service-name-xx.ribbon.listOfServers=localhost:8081,localhost:8083
·ribbon有两种和时间相关的设置,分别是请求连接的超时时间和请求处理的超市时间,设置规则为:
# 请求连接的超时时间
ribbon.ConnectTimeout=2000
# 请求处理的超时时间
ribbon.ReadTimeout=5000
也可以为每个Ribbon客户端设置不同的超时时间, 通过服务名称进行指定:
service-name-xx.ribbon.ConnectTimeout=2000
service-name-xx.ribbon.ReadTimeout=5000
·设置并发参数
# 最大连接数
ribbon.MaxTotalConnections=500
# 每个host最大连接数
ribbon.MaxConnectionsPerHost=500
结语
今天的分享就到这里,我是雷记,专注于分享关于开发编程相关的技术干货,如果今日的分享对您有帮助的话,还望不吝关注点赞,这对我很重要!如果各位在开发过程中遇到棘手问题,可以扫描下图二维码加入,和雷记与其他小伙伴一起探讨解决,让我们努力让每一个问题都得到解决!
