springcloud微服務架構,springcloud整合php,詳細講解springcloud的組件之RestTemplate集成的Ribbbon

 2023-10-02 阅读 26 评论 0

摘要:本文講的是springcloud是如何集成ribbon的,不同的springcloud的組件(feign,zuul,RestTemplate)集成ribbon有所不同,這篇文章先來看看RestTemplate。RestTemplate的類圖如下HttpAccessor主要根據ClientHttpRequestFactory創建ClientHttpRequestInt

本文講的是springcloud是如何集成ribbon的,不同的springcloud的組件(feign,zuul,RestTemplate)集成ribbon有所不同,這篇文章先來看看RestTemplate。

RestTemplate的類圖如下

ae7627284356fe638ca6feec34b83c85.pngHttpAccessor主要根據ClientHttpRequestFactory創建ClientHttpRequest

InterceptingHttpAccessor擴展了HttpAccessor,創建攔截的InterceptingClientHttpRequest,這里會設置攔截器ClientHttpRequestInterceptor,這是集成ribbon的核心,當RestTemplate發起http請求調用的時候,會先經過攔截器,然后才真正發起http請求。

攔截器ClientHttpRequestInterceptor是如何被設置的呢?在LoadBalancerAutoConfiguration類中,有如下代碼:@LoadBalanced

springcloud微服務架構。@Autowired(required = false)

private List restTemplates = Collections.emptyList();

只要加入注解@LoadBalanced的RestTemplate會被注入,在沒有引入spring retry組件的時候,加載如下配置:@Configuration

@ConditionalOnMissingClass("org.springframework.retry.support.RetryTemplate")

static class LoadBalancerInterceptorConfig {

spring七大組件、@Bean

public LoadBalancerInterceptor ribbonInterceptor(

LoadBalancerClient loadBalancerClient,

LoadBalancerRequestFactory requestFactory) {

return new LoadBalancerInterceptor(loadBalancerClient, requestFactory);

php架構設計、}

@Bean

@ConditionalOnMissingBean

public RestTemplateCustomizer restTemplateCustomizer(

final LoadBalancerInterceptor loadBalancerInterceptor) {

springmvc注解?return new RestTemplateCustomizer() {

@Override

public void customize(RestTemplate restTemplate) {

List list = new ArrayList<>(

restTemplate.getInterceptors());

PrinsAI完成B輪融資、list.add(loadBalancerInterceptor);

restTemplate.setInterceptors(list);

}

};

}

新?}

這樣RestTemplate就被設置了LoadBalancerInterceptor,下面來看看整個調用過程

40594aaee92a85a371ccb647a783d5e3.png

整個過程有點復雜,核心就是經過攔截器LoadBalancerInterceptor,通過RibbonLoadBalancerClient發起負載均衡調用。RibbonLoadBalancerClientI組合了LoadBalancer,所以具備了負載均衡的能力,也就是我們在上一篇文章解讀的ribbon原理。

圖中我們沒有畫出真正發起http請求的過程,其默認是由SimpleClientHttpRequestFactory創建,ClientHttpRequestFactory的類圖如下:

d708d37e18703fdd9a363b9a9ad3a85e.png

從調用時序圖上我們看到,開始我們調用的是InterceptingClientHttpRequestFactory來獲取InterceptingClientHttpRequest,它們通過組合的方式集成了ClientHttpRequestFactory和攔截器,InterceptingClientHttpRequest發起調用的時候委托了其內部類InterceptingRequestExecution去處理,核心邏輯:@Override

springcloud常用組件。public ClientHttpResponse execute(HttpRequest request, byte[] body) throws IOException {

if (this.iterator.hasNext()) {

ClientHttpRequestInterceptor nextInterceptor = this.iterator.next();

return nextInterceptor.intercept(request, body, this);

}else {

springcloud面試題、ClientHttpRequest delegate = requestFactory.createRequest(request.getURI(), request.getMethod());

for (Map.Entry> entry : request.getHeaders().entrySet()) {

List values = entry.getValue();

for (String value : values) {

delegate.getHeaders().add(entry.getKey(), value);

springcloud有哪些組件?}

}

if (body.length > 0) {

StreamUtils.copy(body, delegate.getBody());

}

docker部署php項目。return delegate.execute();

}

}

首先會先取出攔截器集合的第一個執行,當攔截器執行完成后,會回調回來,執行else的代碼,真正發起http請求,主要有兩種方式實現ClientHttpRequestFactory接口:一種是SimpleClientHttpRequestFactory,使用J2SE提供的方式(既java.net包提供的方式)創建底層的Http請求連接

一種方式是使用HttpComponentsClientHttpRequestFactory方式,底層使用HttpClient訪問遠程的Http服務,使用HttpClient可以配置連接池和證書等信息。

docker搭建php開發環境?RestTemplate默認是使用SimpleClientHttpRequestFactory,內部是調用jdk的HttpConnection,默認超時為-1,可以這樣設置超時時間:@Bean

@LoadBalanced

public RestTemplate restTemplate() {

SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory();

factory.setConnectTimeout(1000 * 2);//連接超時時間

php框架laravel、factory.setReadTimeout(1000 * 1);//讀超時時間

return new RestTemplate(factory);

}

使用HttpComponentsClientHttpRequestFactory方式可以使用連接池(推薦) ,還可以設置重試策略(具體沒有研究過)

如果想開啟重試機制,我們可以引入spring的retry組件

spring ioc和aop原理。org.springframework.retry

spring-retry

版本號

這樣springcloud-ribbon就會加重如下配置:@Configuration

@ConditionalOnClass(RetryTemplate.class)

public static class RetryAutoConfiguration {

@Bean

public RetryTemplate retryTemplate() {

RetryTemplate template = new RetryTemplate();

template.setThrowLastExceptionOnExhausted(true);

return template;

}

@Bean

@ConditionalOnMissingBean

public LoadBalancedRetryPolicyFactory loadBalancedRetryPolicyFactory() {

return new LoadBalancedRetryPolicyFactory.NeverRetryFactory();

}

}

@Configuration

@ConditionalOnClass(RetryTemplate.class)

public static class RetryInterceptorAutoConfiguration {

@Bean

@ConditionalOnMissingBean

public RetryLoadBalancerInterceptor ribbonInterceptor(

LoadBalancerClient loadBalancerClient, LoadBalancerRetryProperties properties,

LoadBalancedRetryPolicyFactory lbRetryPolicyFactory,

LoadBalancerRequestFactory requestFactory) {

return new RetryLoadBalancerInterceptor(loadBalancerClient, properties,

lbRetryPolicyFactory, requestFactory);

}

@Bean

@ConditionalOnMissingBean

public RestTemplateCustomizer restTemplateCustomizer(

final RetryLoadBalancerInterceptor loadBalancerInterceptor) {

return new RestTemplateCustomizer() {

@Override

public void customize(RestTemplate restTemplate) {

List list = new ArrayList<>(

restTemplate.getInterceptors());

list.add(loadBalancerInterceptor);

restTemplate.setInterceptors(list);

}

};

}

}@Bean

@ConditionalOnClass(name = "org.springframework.retry.support.RetryTemplate")

@ConditionalOnMissingBean

public LoadBalancedRetryPolicyFactory loadBalancedRetryPolicyFactory(SpringClientFactory clientFactory) {

return new RibbonLoadBalancedRetryPolicyFactory(clientFactory);

}

攔截器替換成RetryLoadBalancerInterceptor了,這里集成了retry組件retryTemplate。重試策略由RetryHandler接口來配置,默認實現類DefaultLoadBalancerRetryHandler,如下為默認的配置參數#最大的重試次數

ribbon.MaxAutoRetries=0

#最大重試server的個數

ribbon.MaxAutoRetriesNextServer=1

#是否開啟任何異常都重試(默認在get請求下會重試,其他情況不會重試,除非設置為true)

ribbon.OkToRetryOnAllOperations=false

#指定重試的http狀態碼

ribbon.retryableStatusCodes=500,501

以上是對全局生效,如果加上xxx.ribbon.MaxAutoRetries=1這樣只會對某個ribbon客戶端生效。MaxAutoRetries和MaxAutoRetriesNextServer是配合使用的,最大重試次數是針對每一個server的,如果設置MaxAutoRetries=1,MaxAutoRetriesNextServer=1這樣觸發最大重試次數就是4次。

相關文章:

版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。

原文链接:https://hbdhgg.com/1/110825.html

发表评论:

本站为非赢利网站,部分文章来源或改编自互联网及其他公众平台,主要目的在于分享信息,版权归原作者所有,内容仅供读者参考,如有侵权请联系我们删除!

Copyright © 2022 匯編語言學習筆記 Inc. 保留所有权利。

底部版权信息