Browse Source

add http配置

GITZYY 7 months ago
parent
commit
6940bb23bf

+ 8 - 0
egress-gateway-service-domain/pom.xml

@@ -65,5 +65,13 @@
             <groupId>org.springframework</groupId>
             <artifactId>spring-context</artifactId>
         </dependency>
+        <dependency>
+            <groupId>org.apache.httpcomponents</groupId>
+            <artifactId>httpclient</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.commons</groupId>
+            <artifactId>commons-pool2</artifactId>
+        </dependency>
     </dependencies>
 </project>

+ 2 - 3
egress-gateway-service-infrastructure/src/main/java/com/hrsk/cloud/eg/infrastructure/ApiGateWayImpl/ApiGatewayImpl.java

@@ -1,9 +1,8 @@
 package com.hrsk.cloud.eg.infrastructure.ApiGateWayImpl;
 
 import com.hrsk.cloud.eg.domain.api.ApiGateway;
-import com.hrsk.cloud.eg.infrastructure.clinent.HttpClient;
+import com.hrsk.cloud.eg.infrastructure.clinent.HttpTemPlateClient;
 import lombok.extern.slf4j.Slf4j;
-import org.apache.commons.lang3.StringUtils;
 import org.springframework.stereotype.Component;
 
 import javax.annotation.Resource;
@@ -19,7 +18,7 @@ public class ApiGatewayImpl implements ApiGateway {
 
 
     @Resource
-    private HttpClient httpClient;
+    private HttpTemPlateClient httpTemPlateClient;
 
     @Override
     public Object request() {

+ 5 - 4
egress-gateway-service-infrastructure/src/main/java/com/hrsk/cloud/eg/infrastructure/clinent/HttpClient.java → egress-gateway-service-infrastructure/src/main/java/com/hrsk/cloud/eg/infrastructure/clinent/HttpTemPlateClient.java

@@ -1,15 +1,16 @@
 package com.hrsk.cloud.eg.infrastructure.clinent;
 
 import com.hrsk.cloud.eg.domain.api.HttpApi;
+import com.hrsk.cloud.eg.infrastructure.clinent.config.RetryRestTemplate;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.http.HttpEntity;
 import org.springframework.http.HttpMethod;
 import org.springframework.http.ResponseEntity;
 import org.springframework.stereotype.Component;
+import org.springframework.web.client.RestTemplate;
 
 import javax.annotation.Resource;
 import java.util.Objects;
-import org.springframework.web.client.RestTemplate;
 /**
  * @author: bianlanzhou
  * @create: 2024-08-02 17:08
@@ -17,9 +18,9 @@ import org.springframework.web.client.RestTemplate;
  **/
 @Slf4j
 @Component
-public class HttpClient {
+public class HttpTemPlateClient {
     @Resource
-    private RestTemplate restTemplate;
+    private RestTemplate httpRestTemplate;
     /**
      * 请求
      * @param httpApi http api对象
@@ -28,7 +29,7 @@ public class HttpClient {
     public Object request(HttpApi httpApi){
         ResponseEntity<String> responseEntity = null;
         try {
-            responseEntity = restTemplate.exchange(httpApi.getUrl(),
+            responseEntity = httpRestTemplate.exchange(httpApi.getUrl(),
                     Objects.requireNonNull(HttpMethod.resolve(httpApi.getMethod())),
                     new HttpEntity<>(httpApi.getPayload()),
                     String.class);

+ 69 - 0
egress-gateway-service-infrastructure/src/main/java/com/hrsk/cloud/eg/infrastructure/clinent/config/RetryRequestConfig.java

@@ -0,0 +1,69 @@
+package com.hrsk.cloud.eg.infrastructure.clinent.config;
+
+/**
+ * Author: zhangyy
+ * Date: 2019/3/20
+ * Description:
+ */
+public class RetryRequestConfig {
+    //http请求timeout时的重试次数
+    int retryCount = 3;
+    //http请求timeout,重试间隔时间,重试间隔时间=次数*100 ms.
+    long retryIntervalTime = 100;
+    //连接池连接数量
+    int connectMaxTotal = 200;
+    //连接超时时间
+    int connectTimeout = 30000;
+    // 数据读取超时时间,即SocketTimeout
+    int readTimeout = 30000;
+    // 连接不够用的等待时间,不宜过长,必须设置,比如连接不够用时,时间过长将是灾难性的
+    int ConnectionRequestTimeout = 10000;
+
+    public int getRetryCount() {
+        return retryCount;
+    }
+
+    public void setRetryCount(int retryCount) {
+        this.retryCount = retryCount;
+    }
+
+    public long getRetryIntervalTime() {
+        return retryIntervalTime;
+    }
+
+    public void setRetryIntervalTime(long retryIntervalTime) {
+        this.retryIntervalTime = retryIntervalTime;
+    }
+
+    public int getConnectMaxTotal() {
+        return connectMaxTotal;
+    }
+
+    public void setConnectMaxTotal(int connectMaxTotal) {
+        this.connectMaxTotal = connectMaxTotal;
+    }
+
+    public int getConnectTimeout() {
+        return connectTimeout;
+    }
+
+    public void setConnectTimeout(int connectTimeout) {
+        this.connectTimeout = connectTimeout;
+    }
+
+    public int getReadTimeout() {
+        return readTimeout;
+    }
+
+    public void setReadTimeout(int readTimeout) {
+        this.readTimeout = readTimeout;
+    }
+
+    public int getConnectionRequestTimeout() {
+        return ConnectionRequestTimeout;
+    }
+
+    public void setConnectionRequestTimeout(int connectionRequestTimeout) {
+        ConnectionRequestTimeout = connectionRequestTimeout;
+    }
+}

+ 124 - 0
egress-gateway-service-infrastructure/src/main/java/com/hrsk/cloud/eg/infrastructure/clinent/config/RetryRestTemplate.java

@@ -0,0 +1,124 @@
+package com.hrsk.cloud.eg.infrastructure.clinent.config;
+
+import org.apache.http.HttpEntityEnclosingRequest;
+import org.apache.http.NoHttpResponseException;
+import org.apache.http.client.HttpRequestRetryHandler;
+import org.apache.http.client.protocol.HttpClientContext;
+import org.apache.http.config.Registry;
+import org.apache.http.config.RegistryBuilder;
+import org.apache.http.conn.ConnectTimeoutException;
+import org.apache.http.conn.socket.ConnectionSocketFactory;
+import org.apache.http.conn.socket.PlainConnectionSocketFactory;
+import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
+import org.apache.http.impl.client.CloseableHttpClient;
+import org.apache.http.impl.client.HttpClientBuilder;
+import org.apache.http.impl.client.HttpClients;
+import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
+import org.apache.http.protocol.HttpContext;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.http.client.HttpComponentsClientHttpRequestFactory;
+import org.springframework.http.converter.HttpMessageConverter;
+import org.springframework.http.converter.StringHttpMessageConverter;
+import org.springframework.stereotype.Component;
+import org.springframework.web.client.RestTemplate;
+
+import java.io.IOException;
+import java.net.ConnectException;
+import java.nio.charset.Charset;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * Author: zhangyy
+ * Date: 2019/3/20
+ * Description:
+ */
+@Configuration
+public class RetryRestTemplate {
+    private RetryRequestConfig requestConfig = new RetryRequestConfig();
+
+    public RetryRestTemplate(RetryRequestConfig requestConfig) {
+        this.requestConfig = requestConfig;
+    }
+
+    public RetryRestTemplate() {
+    }
+
+    @Bean
+    public RestTemplate restTemplate(){
+        RestTemplate restTemplate = new RestTemplate();
+        //1.用UTF-8 StringHttpMessageConverter替换默认StringHttpMessageConverter
+        List<HttpMessageConverter<?>> newMessageConverters = new ArrayList<>();
+        for(HttpMessageConverter<?> converter : restTemplate.getMessageConverters()){
+            if(converter instanceof StringHttpMessageConverter){
+                StringHttpMessageConverter messageConverter = new StringHttpMessageConverter(Charset.forName("UTF-8"));
+                newMessageConverters.add(messageConverter);
+            }else {
+                newMessageConverters.add(converter);
+            }
+        }
+        restTemplate.setMessageConverters(newMessageConverters);
+
+
+        //2. retryHandler add
+        HttpClientBuilder httpClientBuilder = HttpClients.custom();
+        HttpRequestRetryHandler handler = new HttpRequestRetryHandler() {
+            @Override
+            public boolean retryRequest(IOException exception, int curRetryCount, HttpContext context) {
+                try {
+                    //重试延迟
+                    TimeUnit.SECONDS.sleep(curRetryCount*requestConfig.getRetryIntervalTime());
+                } catch (InterruptedException e) {
+
+                }
+                if (curRetryCount > requestConfig.getRetryCount()) {
+                    return false;
+                }
+                if (exception instanceof ConnectTimeoutException
+                        || exception instanceof NoHttpResponseException || exception instanceof ConnectException) {
+                    return true;
+                }
+
+                HttpClientContext clientContext = HttpClientContext.adapt(context);
+                org.apache.http.HttpRequest request = clientContext.getRequest();
+                boolean idempotent = !(request instanceof HttpEntityEnclosingRequest);
+                if (idempotent) {
+                    // 如果请求被认为是幂等的,那么就重试。即重复执行不影响程序其他效果的
+                    return true;
+                }
+                return false;
+            }
+        };
+
+        // 3.支持HTTP、HTTPS
+        Registry<ConnectionSocketFactory> registry = RegistryBuilder.<ConnectionSocketFactory> create()
+                .register("http", PlainConnectionSocketFactory.getSocketFactory())
+                .register("https", SSLConnectionSocketFactory.getSocketFactory())
+                .build();
+        PoolingHttpClientConnectionManager connectionManager = new PoolingHttpClientConnectionManager(registry);
+        connectionManager.setMaxTotal(this.requestConfig.getConnectMaxTotal());
+        connectionManager.setDefaultMaxPerRoute(100);
+        connectionManager.setValidateAfterInactivity(2000);
+
+        httpClientBuilder.setRetryHandler(handler)
+                            .setConnectionManager(connectionManager);
+
+        CloseableHttpClient httpClient = httpClientBuilder.build();
+
+        // httpClient连接配置,底层是配置RequestConfig
+        HttpComponentsClientHttpRequestFactory clientHttpRequestFactory = new HttpComponentsClientHttpRequestFactory(httpClient);
+        // 连接超时
+        clientHttpRequestFactory.setConnectTimeout(this.requestConfig.getConnectTimeout());
+        // 数据读取超时时间,即SocketTimeout
+        clientHttpRequestFactory.setReadTimeout(this.requestConfig.getReadTimeout());
+        // 连接不够用的等待时间,不宜过长,必须设置,比如连接不够用时,时间过长将是灾难性的
+        clientHttpRequestFactory.setConnectionRequestTimeout(this.requestConfig.getConnectionRequestTimeout());
+        // 缓冲请求数据,默认值是true。通过POST或者PUT大量发送数据时,建议将此属性更改为false,以免耗尽内存。
+        // clientHttpRequestFactory.setBufferRequestBody(false);
+        restTemplate.setRequestFactory(clientHttpRequestFactory);
+        return restTemplate;
+    }
+
+}

+ 2 - 5
egress-gateway-service-infrastructure/src/main/java/com/hrsk/cloud/eg/infrastructure/clinent/utils/HttpConfiguration.java

@@ -1,7 +1,5 @@
 package com.hrsk.cloud.eg.infrastructure.clinent.utils;
 
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Configuration;
 import org.springframework.web.client.RestTemplate;
 
 /**
@@ -9,10 +7,9 @@ import org.springframework.web.client.RestTemplate;
  * @create: 2024-08-05 11:01
  * @description: HTTP配置
  **/
-@Configuration
 public class HttpConfiguration {
-    @Bean
+
     public RestTemplate restTemplate(){
-        return new RestTemplate();
+        return  new RestTemplate();
     }
 }

+ 7 - 0
egress-gateway-service-infrastructure/src/test/java/com/hrsk/cloud/op/eg/repository/CustomerMapperTest.java

@@ -1,10 +1,16 @@
 package com.hrsk.cloud.op.eg.repository;
 
 
+import com.hrsk.cloud.eg.infrastructure.clinent.config.RetryRestTemplate;
 import org.junit.Test;
 import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.boot.test.context.SpringBootTest;
 import org.springframework.test.context.junit4.SpringRunner;
+import org.springframework.web.client.RestTemplate;
+
+import javax.annotation.Resource;
 
 
 /** 
@@ -18,6 +24,7 @@ import org.springframework.test.context.junit4.SpringRunner;
 @RunWith(SpringRunner.class)
 public class CustomerMapperTest {
 
+
     @Test
     public void test() {
 

+ 12 - 0
pom.xml

@@ -22,6 +22,8 @@
         <commons-codec.version>1.16.1</commons-codec.version>
         <cola.components.version>>4.3.2</cola.components.version>
         <hessian.version>4.0.60</hessian.version>
+        <http.version>4.5.5</http.version>
+        <common-pools.version>2.4.2</common-pools.version>
     </properties>
 
     <dependencies>
@@ -117,6 +119,16 @@
                 <artifactId>mybatis-plus-boot-starter</artifactId>
                 <version>${mybatis-plus.version}</version>
             </dependency>
+            <dependency>
+                <groupId>org.apache.httpcomponents</groupId>
+                <artifactId>httpclient</artifactId>
+                <version>${http.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.commons</groupId>
+                <artifactId>commons-pool2</artifactId>
+                <version>${common-pools.version}</version>
+            </dependency>
         </dependencies>
     </dependencyManagement>