91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

RestTemplate集成Ribbbon的示例代碼

發布時間:2020-10-17 04:08:28 來源:腳本之家 閱讀:199 作者:楊輝 欄目:編程語言

上一篇文章我們分析了ribbon的核心原理,接下來我們來看看springcloud是如何集成ribbon的,不同的springcloud的組件(feign,zuul,RestTemplate)集成ribbon有所不同,這篇文章先來看看RestTemplate。

RestTemplate的類圖如下

RestTemplate集成Ribbbon的示例代碼

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

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

@LoadBalanced
@Autowired(required = false)
private List<RestTemplate> restTemplates = Collections.emptyList();

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

@Configuration
@ConditionalOnMissingClass("org.springframework.retry.support.RetryTemplate")
static class LoadBalancerInterceptorConfig {
  @Bean
  public LoadBalancerInterceptor ribbonInterceptor(
    LoadBalancerClient loadBalancerClient,
    LoadBalancerRequestFactory requestFactory) {
    return new LoadBalancerInterceptor(loadBalancerClient, requestFactory);
  }

  @Bean
  @ConditionalOnMissingBean
  public RestTemplateCustomizer restTemplateCustomizer(
    final LoadBalancerInterceptor loadBalancerInterceptor) {
    return new RestTemplateCustomizer() {
      @Override
      public void customize(RestTemplate restTemplate) {
        List<ClientHttpRequestInterceptor> list = new ArrayList<>(
          restTemplate.getInterceptors());
        list.add(loadBalancerInterceptor);
        restTemplate.setInterceptors(list);
      }
    };
  }
}

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

RestTemplate集成Ribbbon的示例代碼

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

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

RestTemplate集成Ribbbon的示例代碼

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

@Override
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 {
    ClientHttpRequest delegate = requestFactory.createRequest(request.getURI(), request.getMethod());
    for (Map.Entry<String, List<String>> entry : request.getHeaders().entrySet()) {
      List<String> values = entry.getValue();
      for (String value : values) {
        delegate.getHeaders().add(entry.getKey(), value);
      }
    }
    if (body.length > 0) {
      StreamUtils.copy(body, delegate.getBody());
    }
    return delegate.execute();
  }
}

首先會先取出攔截器集合的第一個執行,當攔截器執行完成后,會回調回來,執行else的代碼,真正發起http請求,主要有兩種方式實現ClientHttpRequestFactory接口:

  • 一種是SimpleClientHttpRequestFactory,使用J2SE提供的方式(既java.net包提供的方式)創建底層的Http請求連接
  • 一種方式是使用HttpComponentsClientHttpRequestFactory方式,底層使用HttpClient訪問遠程的Http服務,使用HttpClient可以配置連接池和證書等信息。

 RestTemplate默認是使用SimpleClientHttpRequestFactory,內部是調用jdk的HttpConnection,默認超時為-1,可以這樣設置超時時間:

@Bean
@LoadBalanced
public RestTemplate restTemplate() {
  SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory();
  factory.setConnectTimeout(1000 * 2);//連接超時時間
  factory.setReadTimeout(1000 * 1);//讀超時時間
  return new RestTemplate(factory);
}

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

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

<dependency>
  <groupId>org.springframework.retry</groupId>
  <artifactId>spring-retry</artifactId>
  <version>版本號</version>
</dependency>

這樣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<ClientHttpRequestInterceptor> 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次。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持億速云。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

安庆市| 临夏县| 周至县| 东山县| 苍梧县| 合山市| 日照市| 大埔区| 贵定县| 溧阳市| 永登县| 柞水县| 扎赉特旗| 庆阳市| 崇明县| 宕昌县| 抚宁县| 江安县| 昭苏县| 长春市| 大余县| 淄博市| 营山县| 大埔县| 天柱县| 汉川市| 分宜县| 孙吴县| 巍山| 邻水| 武汉市| 莱州市| 玉龙| 义乌市| 阜城县| 察隅县| 汕头市| 武乡县| 安阳县| 静海县| 灵宝市|