Springcloud學習筆記42--利用HttpClient實現服務A向服務B傳送Http請求
阿新 • • 發佈:2022-03-25
1.服務A傳送Http請求
1.1 在yml檔案中配置Http的相關引數
http:
maxTotal: 100
defaultMaxPerRoute: 20
connectTimeout: 1000
connectionRequestTimeout: 500
socketTimeout: 10000
staleConnectionCheckEnable: true
1.2 編寫HttpClient的相關配置類
1.2.1 @Configuration
@Configuration用於定義配置類,可替換xml配置檔案,被註解的類內部包含有一個或多個被@Bean註解的方法,這些方法將會被AnnotationConfigApplicationContext或AnnotationConfigWebApplicationContext類進行掃描,並用於構建bean定義,初始化Spring容器。
- @Configuration配置spring並啟動spring容器
- @Configuration啟動容器+@Bean註冊Bean
- @Configuration啟動容器+@Component註冊Bean
使用 AnnotationConfigApplicationContext 註冊 AppContext 類的兩種方法
配置Web應用程式(web.xml中配置AnnotationConfigApplicationContext)
注意:@Configuration註解的類在springboot啟動時就會載入;
2022-03-25 15:15:51.116 | INFO | main | org.springframework.web.context.ContextLoader:283 | [] - Root WebApplicationContext: initialization completed in 1270 ms
在Root WebApplicationContext: initialization completed啟動完成之後,會進入debug狀態;
1.3.2 @Component和@Bean註解
@Component註解表明一個類會作為元件類,並告知Spring要為這個類建立bean。
@Bean註解告訴Spring這個方法將會返回一個物件,這個物件要註冊為Spring應用上下文中的bean。通常方法體中包含了最終產生bean例項的邏輯。
兩者的目的是一樣的,都是註冊bean到Spring容器中。
package com.ttbank.flep.core.config; import org.apache.http.client.config.RequestConfig;import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.impl.client.HttpClientBuilder; import org.apache.http.impl.conn.PoolingHttpClientConnectionManager; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import java.util.concurrent.TimeUnit; @Configuration public class HttpClientConfig { @Value("${http.maxTotal}") private Integer maxTotal; @Value("${http.defaultMaxPerRoute}") private Integer defaultMaxPerRoute; @Value("${http.connectTimeout}") private Integer connectTimeout; @Value("${http.connectionRequestTimeout}") private Integer connectionRequestTimeout; @Value("${http.socketTimeout}") private Integer socketTimeout; @Value("${http.staleConnectionCheckEnable}") private boolean staleConnectionCheckEnable; /** * 首先例項化一個連線管理器,設定最大連線數,併發數 */ @Bean(name="httpClientConnectionManager") public PoolingHttpClientConnectionManager getHttpClientConnectionManager(){ PoolingHttpClientConnectionManager httpClientConnectionManager=new PoolingHttpClientConnectionManager(); //最大連線數 httpClientConnectionManager.setMaxTotal(maxTotal); //併發數 httpClientConnectionManager.setDefaultMaxPerRoute(defaultMaxPerRoute); return httpClientConnectionManager; } /** * 例項化連線池 */ @Bean(name="httpClientBuilder") public HttpClientBuilder getHttpClientBuilder(@Qualifier("httpClientConnectionManager")PoolingHttpClientConnectionManager httpClientConnectionManager){ HttpClientBuilder httpClientBuilder=HttpClientBuilder.create(); httpClientBuilder.setConnectionManager(httpClientConnectionManager); //以下可不設定,如果指定了要清理的過期連線,才會啟動清理執行緒,預設不啟動。會有一個單獨的執行緒來掃描連線池中的連線,發現離最近一次使用超時設定後,就會清理。 //設定是否清理過期連線 httpClientBuilder.evictExpiredConnections(); //連線存活時間 httpClientBuilder.setConnectionTimeToLive(10000, TimeUnit.SECONDS); //設定清理空閒連線的時間 httpClientBuilder.evictIdleConnections(60000, TimeUnit.MILLISECONDS); return httpClientBuilder; } /** * 注入連線池,用於獲取httpclient */ @Bean public CloseableHttpClient getCloseableHttpClient(@Qualifier("httpClientBuilder")HttpClientBuilder httpClientBuilder){ return httpClientBuilder.build(); } /** * Builder是RequestConfig的一個內部類,利用custom方法可獲取一個Builder物件 * 設定builder的連線資訊 */ @Bean(name="builder") public RequestConfig.Builder getBuilder(){ RequestConfig.Builder builder = RequestConfig.custom(); return builder.setConnectTimeout(connectTimeout) .setConnectionRequestTimeout(connectionRequestTimeout) .setSocketTimeout(socketTimeout); } /** * 使用builder構建一個RequestConfig物件 */ @Bean public RequestConfig getRequestConfig(@Qualifier("builder") RequestConfig.Builder builder){ return builder.build(); } }
1.3