IRule 的子实现类:
IRule <--实现-- AbstractLoadBalancerRule?AbstractLoadBalancerRule <--继承-- [RandomRule, RoundRobinRule, ClientConfigEnabledRoundRobinRule, RetryRule]?RoundRobinRule <--继承-- WeightedResponseTimeRule ?ClientConfigEnabledRoundRobinRule <--继承-- [PredicateBasedRule, BestAvailableRule]?PredicateBasedRule <--继承-- [AvailabilityFilteringRule, ZoneAvoidanceRule]
- RoundRobinRule - 轮询策略:
- RandomRule - 随机策略:
- RetryRule - 重试策略:
- BestAvailableRule - 最小连接数策略:
- AvailabilityFilteringRule - 可用过滤策略:
- ZoneAvoidanceRule - 区域权衡策略(默认策略):
修改负载均衡策略:
# 针对的被调用方微服务名称,不加就是全局生效lagou-service-product:ribbon:# 请求连接超时时间ConnectTimeout: 2000# 请求处理超时时间ReadTimeout: 15000# 对所有操作都进行重试OkToRetryOnAllOperations: true## 根据如上配置,当访问到故障请求的时候,它会再尝试访问一次当前实例(次数由 MaxAutoRetries 配置),## 如果不行,就换一个实例进行访问,如果还不行,再换一次实例访问(更换次数由 MaxAutoRetriesNextServer 配置),## 如果依然不行,返回失败信息 。# 对当前选中实例重试次数,不包括第一次调用MaxAutoRetries: 2# 切换实例的重试次数MaxAutoRetriesNextServer: 2# 负载策略调整NFLoadBalancerRuleClassName: com.netflix.loadbalancer.AvailabilityFilteringRule
Ribbon 核心源码剖析Ribbon 工作原理:Actor ----> 拦截器 ----> 负载均衡算法(Ribbon)----> 目标微服务Ribbon:按照一定算法选取服务实例
SpringCloud 充分利用了 SpringBoot 的自动装配特点 。引入的 Maven 依赖 --> spring-cloud-commons-2.1.0.RELEASE.jar --> META-INF --> spring.factories 配置文件:
# AutoConfigurationorg.springframework.boot.autoconfigure.EnableAutoConfiguration=org.springframework.cloud.client.CommonsClientAutoConfiguration,org.springframework.cloud.client.discovery.composite.CompositeDiscoveryClientAutoConfiguration,org.springframework.cloud.client.discovery.noop.NoopDiscoveryClientAutoConfiguration,org.springframework.cloud.client.discovery.simple.SimpleDiscoveryClientAutoConfiguration,org.springframework.cloud.client.hypermedia.CloudHypermediaAutoConfiguration,org.springframework.cloud.client.loadbalancer.AsyncLoadBalancerAutoConfiguration,org.springframework.cloud.client.loadbalancer.LoadBalancerAutoConfiguration,...
点击配置文件中的 LoadBalancerAutoConfiguration 跳转到其源码文件:@Configuration@ConditionalOnClass(RestTemplate.class)@ConditionalOnBean(LoadBalancerClient.class)@EnableConfigurationProperties(LoadBalancerRetryProperties.class)public class LoadBalancerAutoConfiguration {@LoadBalanced @Autowired(required = false) private List<RestTemplate> restTemplates = Collections.emptyList();... @Configuration @ConditionalOnMissingClass("org.springframework.retry.support.RetryTemplate") static class LoadBalancerInterceptorConfig {@Beanpublic LoadBalancerInterceptor ribbonInterceptor(LoadBalancerClient loadBalancerClient,LoadBalancerRequestFactory requestFactory) {return new LoadBalancerInterceptor(loadBalancerClient, requestFactory);}@Bean@ConditionalOnMissingBeanpublic RestTemplateCustomizer restTemplateCustomizer(final LoadBalancerInterceptor loadBalancerInterceptor) {return restTemplate -> {List<ClientHttpRequestInterceptor> list = new ArrayList<>(restTemplate.getInterceptors());list.add(loadBalancerInterceptor);restTemplate.setInterceptors(list);};} }...}
推荐阅读
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 5分钟搭建公网https网页文件服务器,免费权威TLS证书
- 一个比 Nginx 功能更强大的 Web 服务器
- 2021寒假儿童关爱服务四送活动总结?2021寒假儿童关爱服务观后感
- 微型投影仪选购及保养技巧
- 一般公司或者团队是怎么进行代码开发并且部署到服务器上的?
- 微信拉黑后再拉回来对方有提示吗?
- 家用无线路由器DHCP服务器配置方法
- 500行代码,教你用python写个微信飞机大战
- 什么是微内核架构设计?
- 云计算核心技术Docker教程:docker-compose控制服务启动和关闭顺序