Ribbon 是一个客户端负载均衡器(Nginx 为服务端负载均衡),它赋予了应用一些支配 HTTP 与 TCP 行为的能力,能够得知,这里的客户端负载均衡也是进程内负载均衡的一种。它在 Spring Cloud 生态内是一个不可缺乏的组件,少了它,服务便不能横向扩展,这显然是有违云原生12要素的。此外 Feign 与 Zuul 中已经默认集成了 Ribbon,在咱们的服务之间凡是涉及调用的,均可以集成它并应用,从而使咱们的调用链具有良好的伸缩性。
附带拓展福利,云原生12要素:https://12factor.net/zh_cn/git
Ribbon是Netflix公司开源的一个负载均衡的项目,它属于上述的第二种,是一个客户端负载均衡器,运行在客户端上。它是一个通过了云端测试的IPC库,能够很好地控制HTTP和TCP客户端的一些行为。 Feign已经默认使用了Ribbon。github
ribbon:https://github.com/Netflix/ribbonspring
@RestController @RequestMapping(value = "/Promotion",method = RequestMethod.GET) public class PromotionController implements PromotionFacade { @Value("${server.port}") String port; @Value("${spring.profiles.active}") String environment; @Override @RequestMapping(value = "/delete") public String releasePromotion(@RequestParam int orderID){ try { if ("local".equals(environment)) { Thread.sleep(200L); } return port; } catch (Exception ex) { return port+"---"+ex.getMessage(); } } }
注册服务以下 缓存
上述trade-promotion服务,有2个站点部署,feign调用他们以下。网络
@FeignClient(name = "trade-promotion") public interface PromotionClient { @RequestMapping(value = "/Promotion/delete", method = RequestMethod.GET) String releasePromotion(@RequestParam int orderID); }
默认状况下,调用结果是:8085,8082,8085,8082,8085,8082,8085,8082... 这样轮询调用执行。并发
缘由就是默认集成啦Ribbon,能够经过spring-cloud-starter-openfeign这个依赖看下他的父依赖中,就有spring-cloud-starter-netflix-ribbon这个包的依赖。app
默认为轮询策略负载均衡
@Configuration public class RibbonConfig { /** * 随机规则 */ @Bean public IRule ribbonRule() { return new RetryRule(); } }
#trade-promotion:这个是eureka中的被调用的服务名称
trade-promotion.ribbon.NFLoadBalancerRuleClassName=com.netflix.loadbalancer.RandomRule
note:第一个new的对象与上面的轮询规则匹配,第二个配置文件最后的词语也是与轮询规则匹配dom
针对单个服务的重试与超时配置:异步
#负载均衡策略
trade-promotion.ribbon.NFLoadBalancerRuleClassName=com.netflix.loadbalancer.RandomRule
#http创建socket超时时间,毫秒
trade-promotion.ribbon.ConnectTimeout=2000
#http读取响应socket超时时间
trade-promotion.ribbon.ReadTimeout=5000
#同一台实例最大重试次数,不包括首次调用
trade-promotion.ribbon.MaxAutoRetries=0
#重试负载均衡其余的实例最大重试次数,不包括首次server
trade-promotion.ribbon.MaxAutoRetriesNextServer=2
# 是否全部操做都重试,POST请求注意屡次提交错误。
# 默认false,设定为false的话,只有get请求会重试
trade-promotion.ribbon.OkToRetryOnAllOperations=true
全局服务的重试与超时配置
#http创建socket超时时间,毫秒
ribbon.ConnectTimeout=2000
#http读取响应socket超时时间
ribbon.ReadTimeout=5000
#同一台实例最大重试次数,不包括首次调用
ribbon.MaxAutoRetries=0
#重试负载均衡其余的实例最大重试次数,不包括首次server
ribbon.MaxAutoRetriesNextServer=2
# 是否全部操做都重试,POST请求注意屡次提交错误。
# 默认false,设定为false的话,只有get请求会重试
ribbon.OkToRetryOnAllOperations=true
ribbon.eureka.enabled=false
trade-promotion.ribbon.listOfServers:http://localhost:8085,http://localhost:8082
ribbon.eager-load.enabled=true
ribbon.eager-load.clients=trade-promotion,trade-order
多看文档,多翻资料