最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

RestTemplate集成Ribbbon的示例代碼

 更新時間:2018年08月03日 10:34:39   作者:楊輝  
這篇文章主要介紹了RestTemplate集成Ribbbon的示例代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

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

RestTemplate的類圖如下

  • HttpAccessor主要根據(jù)ClientHttpRequestFactory創(chuàng)建ClientHttpRequest
  • InterceptingHttpAccessor擴展了HttpAccessor,創(chuàng)建攔截的InterceptingClientHttpRequest,這里會設(shè)置攔截器ClientHttpRequestInterceptor,這是集成ribbon的核心,當RestTemplate發(fā)起http請求調(diào)用的時候,會先經(jīng)過攔截器,然后才真正發(fā)起http請求。

攔截器ClientHttpRequestInterceptor是如何被設(shè)置的呢?在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就被設(shè)置了LoadBalancerInterceptor,下面來看看整個調(diào)用過程

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

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

從調(diào)用時序圖上我們看到,開始我們調(diào)用的是InterceptingClientHttpRequestFactory來獲取InterceptingClientHttpRequest,它們通過組合的方式集成了ClientHttpRequestFactory和攔截器,InterceptingClientHttpRequest發(fā)起調(diào)用的時候委托了其內(nèi)部類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();
  }
}

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

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

 RestTemplate默認是使用SimpleClientHttpRequestFactory,內(nèi)部是調(diào)用jdk的HttpConnection,默認超時為-1,可以這樣設(shè)置超時時間:

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

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

如果想開啟重試機制,我們可以引入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接口來配置,默認實現(xiàn)類DefaultLoadBalancerRetryHandler,如下為默認的配置參數(shù)

#最大的重試次數(shù)
ribbon.MaxAutoRetries=0
#最大重試server的個數(shù)
ribbon.MaxAutoRetriesNextServer=1
#是否開啟任何異常都重試(默認在get請求下會重試,其他情況不會重試,除非設(shè)置為true)
ribbon.OkToRetryOnAllOperations=false
#指定重試的http狀態(tài)碼
ribbon.retryableStatusCodes=500,501

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

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • 解決SpringBoot自定義攔截器和跨域配置沖突的問題

    解決SpringBoot自定義攔截器和跨域配置沖突的問題

    這篇文章主要介紹了解決SpringBoot自定義攔截器和跨域配置沖突的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • Java?嵌入數(shù)據(jù)引擎從?SQLite?到?SPL詳解

    Java?嵌入數(shù)據(jù)引擎從?SQLite?到?SPL詳解

    這篇文章主要介紹了Java?嵌入數(shù)據(jù)引擎:從?SQLite?到?SPL,SQLite架構(gòu)簡單,其核心雖然是C語言開發(fā)的,但封裝得比較好,對外呈現(xiàn)為一個小巧的Jar包,能方便地集成在Java應用中,本文給大家介紹的非常詳細,需要的朋友參考下
    2022-07-07
  • springboot 使用上下文獲取bean

    springboot 使用上下文獲取bean

    這篇文章主要介紹了springboot 使用上下文獲取bean,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-07-07
  • Java中Objects.equals踩坑記錄

    Java中Objects.equals踩坑記錄

    最近在工作中發(fā)現(xiàn)一個問題,覺著還是挺有必要記錄下的,這篇文章主要給大家介紹了關(guān)于Java中Objects.equals踩坑的相關(guān)資料,需要的朋友可以參考下
    2022-03-03
  • SpringBoot MockMvc單元測試的示例代碼

    SpringBoot MockMvc單元測試的示例代碼

    這篇文章主要介紹了SpringBoot MockMvc單元測試的示例代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-11-11
  • SpringBoot3.x打包Docker容器的實現(xiàn)

    SpringBoot3.x打包Docker容器的實現(xiàn)

    這篇文章主要介紹了SpringBoot3.x打包Docker容器的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-11-11
  • SpringSecurity?用戶帳號已被鎖定的問題及解決方法

    SpringSecurity?用戶帳號已被鎖定的問題及解決方法

    這篇文章主要介紹了SpringSecurity?用戶帳號已被鎖定,本文給大家分享問題原因及解決方式,需要的朋友可以參考下
    2023-12-12
  • SpringBoot項目啟動健康檢查的操作方法

    SpringBoot項目啟動健康檢查的操作方法

    在現(xiàn)代的微服務(wù)架構(gòu)中,容器化技術(shù)已經(jīng)成為一種主流的部署方式,Docker 作為容器化技術(shù)的代表,提供了一種輕量級、可移植的解決方案,然而,僅僅將應用容器化是不夠的,我們還需要確保這些容器在運行時能夠保持健康狀態(tài),這就是健康檢查發(fā)揮作用的地方
    2024-12-12
  • SpringBoot?thymeleaf實現(xiàn)餅狀圖與柱形圖流程介紹

    SpringBoot?thymeleaf實現(xiàn)餅狀圖與柱形圖流程介紹

    這篇文章主要介紹了SpringBoot?thymeleaf實現(xiàn)餅狀圖與柱形圖流程,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習吧
    2022-12-12
  • java 數(shù)據(jù)結(jié)構(gòu)之堆排序(HeapSort)詳解及實例

    java 數(shù)據(jù)結(jié)構(gòu)之堆排序(HeapSort)詳解及實例

    這篇文章主要介紹了java 數(shù)據(jù)結(jié)構(gòu)之堆排序(HeapSort)詳解及實例的相關(guān)資料,需要的朋友可以參考下
    2017-03-03

最新評論

平远县| 靖边县| 西乌珠穆沁旗| 五原县| 五大连池市| 红桥区| 田阳县| 尼勒克县| 宁安市| 东山县| 锡林浩特市| 遵义县| 罗定市| 万州区| 达州市| 西乡县| 乡城县| 图片| 宜宾县| 江西省| 克拉玛依市| 南郑县| 诏安县| 中卫市| 平邑县| 花莲市| 抚州市| 彭水| 正蓝旗| 清镇市| 安泽县| 年辖:市辖区| 沙田区| 丁青县| 宝坻区| 大理市| 若羌县| 隆林| 资源县| 邛崃市| 赤水市|