摘要:根據傳入的從中挑選一個對應的。是負載均衡策略實現,默認由生成,根據來執行請求,調用。將轉換成通過注冊中心中各個服務節點的初始化流程返回了一個攔截器,作用主要是在客戶端發起請求時進行攔截,進而實現客戶端負載均衡功能。
@LoadBalanced
public interface ServiceInstanceChooser { // 根據傳入的serviceId從LoadBalancer中挑選一個對應的ServiceInstance。 ServiceInstance choose(String serviceId); } public interface LoadBalancerClient extends ServiceInstanceChooser { // 邏輯同choose,即通過ILoadBalancer::chooseServer,然后使用返回的ServiceInstance調用下面execute方法。 // ILoadBalancer是負載均衡策略實現,默認由RibbonClientConfiguration::ribbonLoadBalancer生成ZoneAwareLoadBalancer,初始化流程T execute(String serviceId, LoadBalancerRequest request) throws IOException; // 根據ServiceInstance來執行請求,調用LoadBalancerRequest::apply。 T execute(String serviceId, ServiceInstance serviceInstance, LoadBalancerRequest request) throws IOException; // 將serviceId轉換成host:port(通過注冊中心中各個服務節點的metadata) URI reconstructURI(ServiceInstance instance, URI original); }
LoadBalancerAutoConfiguration.LoadBalancerInterceptorConfig
::ribbonInterceptor返回了一個攔截器,作用主要是在客戶端發起請求時進行攔截,進而實現客戶端負載均衡功能。
::restTemplateCustomizer會實例化RestTemplateCustomizer,其作用是設置::ribbonInterceptor返回的攔截器
LoadBalancerAutoConfiguration
::loadBalancedRestTemplateInitializer調用RestTemplateCustomizer::customize方法來給RestTemplate添加上LoadBalancerInterceptor攔截器。
public class LoadBalancerInterceptor implements ClientHttpRequestInterceptor { private LoadBalancerClient loadBalancer; private LoadBalancerRequestFactory requestFactory; ...... public ClientHttpResponse intercept(final HttpRequest request, final byte[] body, final ClientHttpRequestExecution execution) throws IOException { final URI originalUri = request.getURI(); String serviceName = originalUri.getHost(); // 會調另一個execute方法,即LoadBalancerRequest::apply,而LoadBalancerRequest的實例是由LoadBalancerRequestFactory::createRequest生成的。 return this.loadBalancer.execute(serviceName, requestFactory.createRequest(request, body, execution)); } } public class LoadBalancerRequestFactory { ...... public LoadBalancerRequestcreateRequest(final HttpRequest request, final byte[] body, final ClientHttpRequestExecution execution) { return new LoadBalancerRequest () { @Override public ClientHttpResponse apply(final ServiceInstance instance) throws Exception { // ServiceRequestWrapper重寫了getURI(),即ServiceRequestWrapper::getURI調用了LoadBalancerClient::reconstructURI HttpRequest serviceRequest = new ServiceRequestWrapper(request, instance, loadBalancer); if (transformers != null) { for (LoadBalancerRequestTransformer transformer : transformers) { serviceRequest = transformer.transformRequest(serviceRequest, instance); } } // 這里的execution是InterceptingRequestExecution::execute,它會調用serviceRequest的HttpRequest::getURI,就是上面ServiceRequestWrapper重寫的getURI() return execution.execute(serviceRequest, body); } }; } }
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/68341.html
摘要:概要什么是實戰整合實現負載均衡是什么是一個客戶端負載均衡的組件什么是負載均衡負載均衡就是分發請求流量到不同的服務器目前的實現有軟件和硬件負載均衡分為兩種服務器端負載均衡如上圖所示服務器端負載均衡是對客戶透明的用戶請求到服務器真正的服務器是由 概要 什么是Spring Cloud Netflix Ribbon? 實戰:整合Ribbon實現負載均衡 Spring Cloud Netfl...
摘要:本例中介紹如何使用來完成服務調用并實現負載均衡。即,對于注冊中心而言,生產者和調用者都是端。文件配置如下在文件中,我們將應用命名為,端口為,表示注冊中心地址。 前言 Ribbon是Spring Cloud體系中完成負載均衡的重要組件。Spring Cloud體系中有兩種完成服務調用的組件,一種是Ribbon+RestTemplate,另一種Feign。Feign默認使用的也是Ribbo...
摘要:客戶端負載均衡器是一個客戶端負載均衡器,可以讓你對和客戶端的行為進行大量控制,已經使用了,因此,如果你使用,此部分也適用。 客戶端負載均衡器:Ribbon Ribbon是一個客戶端負載均衡器,可以讓你對HTTP和TCP客戶端的行為進行大量控制,Feign已經使用了Ribbon,因此,如果你使用@FeignClient,此部分也適用。 Ribbon中的一個核心概念是命名客戶端,每個負載均...
摘要:在服務架構中,業務都會被拆分成一個獨立的服務,服務與服務的通訊是基于的。配置文件如下在工程的啟動類中通過向服務中心注冊并且注冊了一個通過注冊表明,這個是負載均衡的。 轉載請標明出處: http://blog.csdn.net/forezp/a...本文出自方志朋的博客 在上一篇文章,講了服務的注冊和發現。在服務架構中,業務都會被拆分成一個獨立的服務,服務與服務的通訊是基于http re...
摘要:在服務注冊服務提供者這一篇可能學習了這么開發一個服務提供者,在生成上服務提供者通常是部署在內網上,即是服務提供者所在的服務器是與互聯網完全隔離的。服務消費者本質上也是一個。 在《服務注冊&服務提供者》這一篇可能學習了這么開發一個服務提供者,在生成上服務提供者通常是部署在內網上,即是服務提供者所在的服務器是與互聯網完全隔離的。這篇說下服務發現(服務消費者),通常服務消費者是部署在與互聯網...
摘要:多層服務調用常見于微服務架構中較底層的服務如果出現故障,會導致連鎖故障。 Spring Cloud 體驗 簡介 Spring Cloud為開發人員提供了快速構建分布式系統的一些工具,包括配置管理、服務發現、斷路器、路由、微代理、 事件總線、全局鎖、決策競選、分布式會話等等 基于Spring Boot,Spring Cloud將各公司成熟服務框架組合起來,通過Spring Boo...
閱讀 2022·2021-09-29 09:35
閱讀 1955·2019-08-30 14:15
閱讀 2980·2019-08-30 10:56
閱讀 964·2019-08-29 16:59
閱讀 577·2019-08-29 14:04
閱讀 1310·2019-08-29 12:30
閱讀 1031·2019-08-28 18:19
閱讀 515·2019-08-26 11:51