欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

java實用型-高并發(fā)下RestTemplate的正確使用說明

 更新時間:2021年10月23日 11:57:59   作者:我們都愛松松吧  
這篇文章主要介紹了java實用型-高并發(fā)下RestTemplate的正確使用說明,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

前言

如果java項目里有調用第三方的http接口,我們可以使用RestTemplate去遠程訪問。也支持配置連接超時和響應超時,還可以配置各種長連接策略,也可以支持長連接預熱,在高并發(fā)下,合理的配置使用能夠有效提高第三方接口響應時間。

一、RestTemplate是什么?

RestTemplate是Spring提供的用于訪問Rest服務的客戶端,RestTemplate提供了多種便捷訪問遠程Http服務的方法,能夠大大提高客戶端的編寫效率。

二、如何使用

1.創(chuàng)建一個bean

以下代碼配置比較簡單,只設置了連接超時時間和響應超時時間

/**
 * restTemplate配置
 *
 * @author Songsong
 * @date 2020-08-17 15:09
 */
@Configuration
public class RestTemplateConfiguration {
    @Bean(name = "restTemplate")
    public RestTemplate restTemplate() {
        SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory();
        //設置連接超時時間1s
        factory.setConnectTimeout(1000);
        //設置讀取時間1s
        factory.setReadTimeout(1000);
        return new RestTemplate(factory);
    }
}

2.使用步驟

在需要使用的地方使用@Resource或者@Autowired注入進來

@Resource
private RestTemplate restTemplate;

然后我們平常調用第三方的接口是get方式和post方式,restTemplate提供getForEntity和postForEntity方法支持這兩種方式,直接調用即可,源碼分別如下:

getForEntity方法:

 public <T> ResponseEntity<T> getForEntity(String url, Class<T> responseType, Object... uriVariables) throws RestClientException {
        RequestCallback requestCallback = this.acceptHeaderRequestCallback(responseType);
        ResponseExtractor<ResponseEntity<T>> responseExtractor = this.responseEntityExtractor(responseType);
        return (ResponseEntity)nonNull(this.execute(url, HttpMethod.GET, requestCallback, responseExtractor, uriVariables));
    }

postForEntity方法:

public <T> ResponseEntity<T> postForEntity(String url, @Nullable Object request, Class<T> responseType, Object... uriVariables) throws RestClientException {
        RequestCallback requestCallback = this.httpEntityCallback(request, responseType);
        ResponseExtractor<ResponseEntity<T>> responseExtractor = this.responseEntityExtractor(responseType);
        return (ResponseEntity)nonNull(this.execute(url, HttpMethod.POST, requestCallback, responseExtractor, uriVariables));
    }

源碼中還有很多以上兩種其他的重載方法,以上是作者平常項目中用的最多的一種,參數有url(第三方http鏈接)、request是請求所需的參數,responseType是返回類型里的泛型。

只需要解析返回的參數即可。

三、高并發(fā)下的RestTemplate使用

在平常的開發(fā)中,以上簡單的配置可能就夠用了,但是在高并發(fā)下,對接口響應時間要求很高,所以我們需要盡量的提高第三方接口響應時間。在RestTemplate中可以使用httpClient長連接,關于httpClient長連接的介紹我們可以參考:HTTPclient保持長連接

以下代碼我們設置了長連接預熱的功能,以及路由并發(fā)數:

@Slf4j
@Configuration
public class RestTemplateConfiguration {
    @Bean(name = "restTemplate")
    public RestTemplate restTemplate() {
       return getRestTemplate(3, "https://www.baidu.com/......");
    }
    private RestTemplate getRestTemplate(int maxTotal, String preHeatUrl) {
        HttpComponentsClientHttpRequestFactory httpRequestFactory = httpComponentsClientHttpRequestFactory(maxTotal);
        RestTemplate restTemplate = new RestTemplate(httpRequestFactory);
        //解決首次預熱耗時長
        if (StringUtils.isNotEmpty(preHeatUrl)) {
            try {
                restTemplate.postForEntity(preHeatUrl, "", String.class);
            } catch (Exception e) {
                log.error("preHeat url error:{}", e.getMessage());
            }
        }
        return restTemplate;
    }
    /**
     * ClientHttpRequestFactory接口的另一種實現方式(推薦使用),即:
     * HttpComponentsClientHttpRequestFactory:底層使用Httpclient連接池的方式創(chuàng)建Http連接請求
     *
     * @return
     */
    private HttpComponentsClientHttpRequestFactory httpComponentsClientHttpRequestFactory(int maxTotal) {
        //Httpclient連接池,長連接保持時間
        PoolingHttpClientConnectionManager connectionManager = new PoolingHttpClientConnectionManager(1, TimeUnit.HOURS);
        //設置總連接數
        connectionManager.setMaxTotal(maxTotal);
        //設置同路由的并發(fā)數
        connectionManager.setDefaultMaxPerRoute(maxTotal);
        //設置header
        List<Header> headers = new ArrayList<Header>();
        headers.add(new BasicHeader("User-Agent", "Mozilla/5.0 (Windows NT 6.3; rv:36.0) Gecko/20100101 Firefox/36.04"));
        headers.add(new BasicHeader("Accept-Encoding", "gzip, deflate"));
        headers.add(new BasicHeader("Accept-Language", "zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3"));
        headers.add(new BasicHeader("Connection", "keep-alive"));
        //創(chuàng)建HttpClient
        HttpClient httpClient = HttpClientBuilder.create()
                .setConnectionManager(connectionManager)
                .setDefaultHeaders(headers)
                .setRetryHandler(new DefaultHttpRequestRetryHandler(3, true)) //設置重試次數
                .setKeepAliveStrategy(new DefaultConnectionKeepAliveStrategy()) //設置保持長連接
                .build();
        //創(chuàng)建HttpComponentsClientHttpRequestFactory實例
        HttpComponentsClientHttpRequestFactory requestFactory =
                new HttpComponentsClientHttpRequestFactory(httpClient);
        //設置客戶端和服務端建立連接的超時時間
        requestFactory.setConnectTimeout(10000);
        //設置客戶端從服務端讀取數據的超時時間
        requestFactory.setReadTimeout(5000);
        //設置從連接池獲取連接的超時時間,不宜過長
        requestFactory.setConnectionRequestTimeout(2000);
        //緩沖請求數據,默認為true。通過POST或者PUT大量發(fā)送數據時,建議將此更改為false,以免耗盡內存
        requestFactory.setBufferRequestBody(false);
        return requestFactory;
    }

1.設置預熱功能

我們可以看到,在getRestTemplate方法中,

return restTemplate;

之前先請求了一次,也就是說在需要使用第三方接口調用的service層注入的時候,提前先調用了一次,根據長連接的特性,一般第一次連接的時間較長,使用完之后,這個連接并不會馬上回收掉,在一定的時間還是存活狀態(tài),所以在高并發(fā)下,經過預熱后的接口響應時間會大幅提高。

2.合理設置maxtotal數量

我們可以看到以下代碼

//設置總連接數
 connectionManager.setMaxTotal(maxTotal);

我們可以看到這一行,maxTotal是設置總連接數,這個設置需要根據接口的響應時間以及需要支持的QPS來設置,比如接口響應時間是100ms,需要支持的QPS為5000,也就是5000/s,那么一個長連接1s就是能夠處理10個請求,那么總共需要maxTotal為500個,這個就是設置的大概數量,但是有時候QPS不是那么穩(wěn)定,所以具體設置多少得視具體情況而定。

RestTemplate深度解析可以參考:RestTemplate深度解析

總結

以上就是關于RestTemplate的使用介紹,其實平常使用下還好,看不出來什么問題,但是一旦高并發(fā)情況下,預熱和設置總連接數還有并發(fā)數以及其他的相關配置就顯得尤為重要,具體的配置還是得經過實驗才能得知,沒有最好,只有更好,以上就是作者在高并發(fā)活動中的一些實際經歷,希望可以幫助到你?。。∪缬绣e誤或未考慮完全的地方,望不吝賜教,也希望大家多多支持腳本之家!

相關文章

  • Mybatis初始化知識小結

    Mybatis初始化知識小結

    Mybatis的初始化過程就是加載自己運行時所需要的配置信息的過程,這篇文章主要介紹了Mybatis初始化知識小結,需要的朋友可以參考下
    2021-10-10
  • windows7配置java環(huán)境變量的圖文教程

    windows7配置java環(huán)境變量的圖文教程

    這篇文章主要介紹了windows7配置java環(huán)境變量的教程,本文通過圖文并茂的形式給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-02-02
  • SpringBoot使用Caffeine實現緩存的示例代碼

    SpringBoot使用Caffeine實現緩存的示例代碼

    本文主要介紹了SpringBoot使用Caffeine實現緩存的示例代碼,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-07-07
  • Spring?Boot?使用?Disruptor?做內部高性能消息隊列

    Spring?Boot?使用?Disruptor?做內部高性能消息隊列

    這篇文章主要介紹了Spring?Boot?使用?Disruptor?做內部高性能消息隊列,工作中遇到項目使用Disruptor做消息隊列,對你沒看錯,不是Kafka,也不是rabbitmq。Disruptor有個最大的優(yōu)點就是快,還有一點它是開源的哦,下面做個簡單的記錄
    2022-06-06
  • Java中BigDecimal類的簡單用法

    Java中BigDecimal類的簡單用法

    這篇文章主要介紹了Java中BigDecimal類的簡單用法,是Java應用程序開發(fā)中非常實用的技巧,本文以實例形式對此進行了簡單的分析,需要的朋友可以參考下
    2014-09-09
  • springboot使用@value注入配置失敗的解決

    springboot使用@value注入配置失敗的解決

    這篇文章主要介紹了springboot使用@value注入配置失敗的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • Go Java算法之外觀數列實現方法示例詳解

    Go Java算法之外觀數列實現方法示例詳解

    這篇文章主要為大家介紹了Go Java算法外觀數列實現的方法示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-08-08
  • Java線程的控制詳解

    Java線程的控制詳解

    這篇文章主要介紹了Java中的join線程、后臺線程、線程睡眠、線程讓步以及線程的優(yōu)先級,非常的詳細,希望能對大家有所幫助
    2014-10-10
  • Java中ThreadLocal的用法及原理詳解

    Java中ThreadLocal的用法及原理詳解

    這篇文章主要介紹了Java中ThreadLocal的用法及原理詳解,在并發(fā)編程中,如果一個類變量被多個線程操作,會造成線程安全問題,使用ThreadLocal可以讓每個線程擁有線程內部的變量,防止多個線程操作一個類變量造成的線程安全問題,需要的朋友可以參考下
    2023-09-09
  • Quarkus中實現Resteasy的文件上傳下載操作

    Quarkus中實現Resteasy的文件上傳下載操作

    這篇文章主要為大家介紹了Quarkus中實現Resteasy的文件上傳下載的操作過程步驟,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步
    2022-02-02

最新評論