springboot-cloud-8-ribbon-source
2017-09-15 10:21
260 查看
LoadBalancerAutoConfiguration 定制个性化的restTemplate
//定制个性化 restTemplate @Bean public SmartInitializingSingleton loadBalancedRestTemplateInitializer( final List<RestTemplateCustomizer> customizers) { return new SmartInitializingSingleton() { @Override public void afterSingletonsInstantiated() { for (RestTemplate restTemplate : LoadBalancerAutoConfiguration.this.restTemplates) { for (RestTemplateCustomizer customizer : customizers) { customizer.customize(restTemplate); } } } }; } // 个性化主要添加了loadBalancerInterceptor @Bean @ConditionalOnMissingBean public RestTemplateCustomizer restTemplateCustomizer( final RetryLoadBalancerInterceptor loadBalancerInterceptor) { return new RestTemplateCustomizer() { @Override public void customize(RestTemplate restTemplate) { List<ClientHttpRequestInterceptor> list = new ArrayList<>( restTemplate.getInterceptors()); list.add(loadBalancerInterceptor); restTemplate.setInterceptors(list); } }; } //构造 ribbonInterceptor @Bean public LoadBalancerInterceptor ribbonInterceptor( LoadBalancerClient loadBalancerClient, LoadBalancerRequestFactory requestFactory) { return new LoadBalancerInterceptor(loadBalancerClient, requestFactory); }
LoadBalancerInterceptor#intercept
//执行个性化的拦截 @Override public ClientHttpResponse intercept(final HttpRequest request, final byte[] body, final ClientHttpRequestExecution execution) throws IOException { final URI originalUri = request.getURI(); String serviceName = originalUri.getHost(); Assert.state(serviceName != null, "Request URI does not contain a valid hostname: " + originalUri); return this.loadBalancer.execute(serviceName, requestFactory.createRequest(request, body, execution)); }
ILoadBalancer 负载
4000
均衡
DynamicServerListLoadBalancer ,BaseLoadBalancer
//// 主要有IRule 来实行如何选择server @Override public <T> T execute(String serviceId, LoadBalancerRequest<T> request) throws IOException { ILoadBalancer loadBalancer = getLoadBalancer(serviceId); Server server = getServer(loadBalancer); if (server == null) { throw new IllegalStateException("No instances available for " + serviceId); } RibbonServer ribbonServer = new RibbonServer(serviceId, server, isSecure(server, serviceId), serverIntrospector(serviceId).getMetadata(server)); return execute(serviceId, ribbonServer, request); }
主要由IRule 来负载选择server
public Server chooseServer(Object key) { if (counter == null) { counter = createCounter(); } counter.increment(); if (rule == null) { return null; } else { try { return rule.choose(key); } catch (Exception e) { logger.warn("LoadBalancer [{}]: Error choosing server for key {}", name, key, e); return null; } } }
相关文章推荐
- Spring Cloud Spring Boot mybatis 企业分布式微服务云(四)服务消费(Ribbon)【Dalston版】
- Spring Boot + Spring Cloud 实现权限管理系统 后端篇(十九):服务消费(Ribbon、Feign)
- Spring Boot + Spring Cloud 构建微服务系统(二):服务消费和负载(Ribbon)
- springboot-cloud-2-ribbon
- springboot-cloud-7-eureka-source
- spring-cloud-ribbon之spring-cloud-1.3.4(Dalston.SR3)-boot(1.5.6) 学习笔记
- Spring Cloud Spring Boot mybatis 企业分布式微服务云(四)服务消费(Ribbon)【Dalston版】
- Spring Cloud Ribbon(负载均衡)
- 【Spring Cloud】Ribbon负载均衡
- SpringCloud之消费服务(rest+ribbon)|第二章-yellowcong
- 和spring cloud/boot 学习如何管理自己的组件
- Spring Cloud Eureka与Ribbon——服务发现与消费
- Spring Boot + Spring Cloud 实现权限管理系统 后端篇(十一):集成 Shiro 框架
- 「一句话经典」从Spring到SpringMVC再到JavaEE开发颠覆者Spring Boot,最后佛法无边Spring Cloud;只不过却成了nodejs的笑柄
- Spring 5.0+Spring Boot+security+spring cloud oauth2+Redis整合详情,记录那些遇到的一些坑
- SpringCloud之Ribbon(一)
- Spring Boot/Spring Cloud解决中文乱码
- spring boot / spring cloud
- spring cloud & spring boot 全家桶 & maven 标签 dependencyManagement
- 白话SpringCloud | 第四章:服务消费者(RestTemple+Ribbon+Feign)