From c96d1165b784a717f9ff1bb728f0d0d7ac8147c8 Mon Sep 17 00:00:00 2001 From: Haotian Zhang Date: Fri, 15 Aug 2025 15:54:04 +0800 Subject: [PATCH] fix:replace HttpClient with HttpURLConnection for JDK 8 compatibility. (#1709) --- CHANGELOG.md | 1 + .../tsf/demo/provider/ProviderController.java | 24 ++++++ .../PolarisFaultInjectionHttpResponse.java | 8 +- .../TrafficMirroringPostPlugin.java | 78 +++++++++---------- .../config/TrafficMirroringProperties.java | 4 +- .../TrafficMirroringPropertiesTest.java | 8 +- 6 files changed, 75 insertions(+), 48 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 70f1fb8fa..3af01953a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -17,3 +17,4 @@ - [fix: fix lb configuration on bootstrap step.](https://github.com/Tencent/spring-cloud-tencent/issues/1706) - [feat:support fault injection.](https://github.com/Tencent/spring-cloud-tencent/pull/1707) - [feat: support config event and monitor address list.](https://github.com/Tencent/spring-cloud-tencent/pull/1708) +- [fix:replace HttpClient with HttpURLConnection for JDK 8 compatibility.](https://github.com/Tencent/spring-cloud-tencent/pull/1709) diff --git a/spring-cloud-tencent-examples/tsf-example/provider-demo/src/main/java/com/tencent/cloud/tsf/demo/provider/ProviderController.java b/spring-cloud-tencent-examples/tsf-example/provider-demo/src/main/java/com/tencent/cloud/tsf/demo/provider/ProviderController.java index 615c58069..726d7812b 100644 --- a/spring-cloud-tencent-examples/tsf-example/provider-demo/src/main/java/com/tencent/cloud/tsf/demo/provider/ProviderController.java +++ b/spring-cloud-tencent-examples/tsf-example/provider-demo/src/main/java/com/tencent/cloud/tsf/demo/provider/ProviderController.java @@ -21,6 +21,8 @@ import java.net.InetAddress; import java.net.NetworkInterface; import java.net.SocketException; import java.util.Enumeration; +import java.util.HashMap; +import java.util.Map; import javax.servlet.http.HttpServletResponse; @@ -129,8 +131,11 @@ public class ProviderController { responseBody = "mock 5xx return."; break; default: + LOG.info("provider-demo -- request param: [" + param + "]"); responseBody = String.format("from host-ip: %s, request param: %s, response from %s", getInet4Address(), param, providerNameConfig.getName()); + LOG.info("provider-demo -- provider config name: [" + providerNameConfig.getName() + ']'); + LOG.info("provider-demo -- response info: [" + responseBody + "]"); status = HttpServletResponse.SC_OK; break; } @@ -193,4 +198,23 @@ public class ProviderController { LOG.info(response); return response; } + + /** + * 简单的鉴权接口。 + * token = provider-demo 鉴权成功,其它失败。 + * + * @param token 凭证 + * @return 鉴权结果 + */ + @RequestMapping(value = "/checkToken", method = RequestMethod.GET) + public Map checkToken(@RequestParam String token) { + LOG.info("provider-demo -- request param: [" + token + "]"); + + Map resultMap = new HashMap<>(); + resultMap.put("result", "provider-demo".equalsIgnoreCase(token)); + resultMap.put("payload", "this is payload"); + + LOG.info("provider-demo -- response info: [" + resultMap + "]"); + return resultMap; + } } diff --git a/spring-cloud-tencent-plugin-starters/spring-cloud-starter-tencent-fault-injection-plugin/src/main/java/com/tencent/cloud/plugin/fault/instrument/resttemplate/PolarisFaultInjectionHttpResponse.java b/spring-cloud-tencent-plugin-starters/spring-cloud-starter-tencent-fault-injection-plugin/src/main/java/com/tencent/cloud/plugin/fault/instrument/resttemplate/PolarisFaultInjectionHttpResponse.java index c23f0ec13..1b14bbe17 100644 --- a/spring-cloud-tencent-plugin-starters/spring-cloud-starter-tencent-fault-injection-plugin/src/main/java/com/tencent/cloud/plugin/fault/instrument/resttemplate/PolarisFaultInjectionHttpResponse.java +++ b/spring-cloud-tencent-plugin-starters/spring-cloud-starter-tencent-fault-injection-plugin/src/main/java/com/tencent/cloud/plugin/fault/instrument/resttemplate/PolarisFaultInjectionHttpResponse.java @@ -27,7 +27,6 @@ import org.jetbrains.annotations.NotNull; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpStatus; -import org.springframework.http.HttpStatusCode; import org.springframework.http.client.ClientHttpResponse; /** @@ -67,10 +66,15 @@ public class PolarisFaultInjectionHttpResponse implements ClientHttpResponse { @NotNull @Override - public HttpStatusCode getStatusCode() { + public HttpStatus getStatusCode() { return HttpStatus.valueOf(fallbackInfo.getCode()); } + @Override + public int getRawStatusCode() throws IOException { + return fallbackInfo.getCode(); + } + @NotNull @Override public final String getStatusText() { diff --git a/spring-cloud-tencent-plugin-starters/spring-cloud-starter-tencent-traffic-mirroring-plugin/src/main/java/com/tencent/cloud/plugin/trafficmirroring/TrafficMirroringPostPlugin.java b/spring-cloud-tencent-plugin-starters/spring-cloud-starter-tencent-traffic-mirroring-plugin/src/main/java/com/tencent/cloud/plugin/trafficmirroring/TrafficMirroringPostPlugin.java index c86b88b6b..38a7cccfe 100644 --- a/spring-cloud-tencent-plugin-starters/spring-cloud-starter-tencent-traffic-mirroring-plugin/src/main/java/com/tencent/cloud/plugin/trafficmirroring/TrafficMirroringPostPlugin.java +++ b/spring-cloud-tencent-plugin-starters/spring-cloud-starter-tencent-traffic-mirroring-plugin/src/main/java/com/tencent/cloud/plugin/trafficmirroring/TrafficMirroringPostPlugin.java @@ -17,10 +17,10 @@ package com.tencent.cloud.plugin.trafficmirroring; +import java.io.OutputStream; +import java.net.HttpURLConnection; import java.net.URI; -import java.net.http.HttpClient; -import java.net.http.HttpResponse; -import java.time.Duration; +import java.net.URL; import java.util.Optional; import java.util.concurrent.LinkedBlockingQueue; import java.util.concurrent.ThreadPoolExecutor; @@ -61,8 +61,6 @@ public class TrafficMirroringPostPlugin implements EnhancedPlugin { private ThreadPoolExecutor threadPoolExecutor; - private HttpClient httpClient; - public TrafficMirroringPostPlugin(TrafficMirroringProperties trafficMirroringProperties) { this.trafficMirroringProperties = trafficMirroringProperties; } @@ -137,23 +135,16 @@ public class TrafficMirroringPostPlugin implements EnhancedPlugin { 60, TimeUnit.SECONDS, new LinkedBlockingQueue<>(), new NamedThreadFactory("polaris-traffic-mirroring")); } - if (httpClient == null) { - // create JDK HttpClient instance. - this.httpClient = HttpClient.newBuilder() - .connectTimeout(Duration.ofMillis(trafficMirroringProperties.getRequestConnectionTimeout())) - .executor(threadPoolExecutor) - .build(); - } } - private void setHeaders(java.net.http.HttpRequest.Builder requestBuilder, Object originalRequest) { + private void setHeaders(HttpURLConnection connection, Object originalRequest) { if (ClassUtils.isClassPresent("org.springframework.http.HttpRequest") && originalRequest instanceof HttpRequest) { HttpHeaders httpHeaders = ((HttpRequest) originalRequest).getHeaders(); httpHeaders.forEach((headerName, headerValues) -> { if (shouldKeepHeader(headerName)) { headerValues.forEach(headerValue -> - requestBuilder.header(headerName, headerValue)); + connection.setRequestProperty(headerName, headerValue)); } }); } @@ -163,7 +154,7 @@ public class TrafficMirroringPostPlugin implements EnhancedPlugin { request.headers().forEach((headerName, headerValues) -> { if (shouldKeepHeader(headerName)) { headerValues.forEach(headerValue -> - requestBuilder.header(headerName, headerValue)); + connection.setRequestProperty(headerName, headerValue)); } }); } @@ -185,32 +176,39 @@ public class TrafficMirroringPostPlugin implements EnhancedPlugin { originalBody = new byte[0]; } - // create JDK HttpRequest builder. - java.net.http.HttpRequest.Builder requestBuilder = java.net.http.HttpRequest.newBuilder() - .uri(URI.create(mirroringUrl)) - .method(method, - java.net.http.HttpRequest.BodyPublishers.ofByteArray(originalBody)); - - // copy request headers (except some special headers). - setHeaders(requestBuilder, originalRequest); - - // build request. - java.net.http.HttpRequest mirrorRequest = requestBuilder.build(); - - // send async request (ignore response). - httpClient.sendAsync(mirrorRequest, HttpResponse.BodyHandlers.discarding()) - .thenAccept(response -> { - if (response.statusCode() >= 400) { - LOG.warn("Traffic mirroring async request return: {}", response.statusCode()); - } - else { - LOG.debug("Traffic mirroring async request return: {}", response.statusCode()); + byte[] finalOriginalBody = originalBody; + threadPoolExecutor.execute(() -> { + try { + URL url = new URL(mirroringUrl); + HttpURLConnection connection = (HttpURLConnection) url.openConnection(); + connection.setRequestMethod(method); + connection.setConnectTimeout((int) trafficMirroringProperties.getRequestConnectionTimeout()); + connection.setReadTimeout((int) trafficMirroringProperties.getRequestConnectionTimeout()); + + // copy request headers (except some special headers). + setHeaders(connection, originalRequest); + + // set request body. + if (finalOriginalBody.length > 0) { + connection.setDoOutput(true); + try (OutputStream os = connection.getOutputStream()) { + os.write(finalOriginalBody); } - }) - .exceptionally(ex -> { - LOG.warn("Traffic mirroring async request failed", ex); - return null; - }); + } + + // send request (ignore response). + int responseCode = connection.getResponseCode(); + if (responseCode >= 400) { + LOG.warn("Traffic mirroring request return: {}", responseCode); + } + else { + LOG.debug("Traffic mirroring request return: {}", responseCode); + } + } + catch (Exception e) { + LOG.warn("Traffic mirroring request failed", e); + } + }); } /** diff --git a/spring-cloud-tencent-plugin-starters/spring-cloud-starter-tencent-traffic-mirroring-plugin/src/main/java/com/tencent/cloud/plugin/trafficmirroring/config/TrafficMirroringProperties.java b/spring-cloud-tencent-plugin-starters/spring-cloud-starter-tencent-traffic-mirroring-plugin/src/main/java/com/tencent/cloud/plugin/trafficmirroring/config/TrafficMirroringProperties.java index b4e12d773..97cd875dd 100644 --- a/spring-cloud-tencent-plugin-starters/spring-cloud-starter-tencent-traffic-mirroring-plugin/src/main/java/com/tencent/cloud/plugin/trafficmirroring/config/TrafficMirroringProperties.java +++ b/spring-cloud-tencent-plugin-starters/spring-cloud-starter-tencent-traffic-mirroring-plugin/src/main/java/com/tencent/cloud/plugin/trafficmirroring/config/TrafficMirroringProperties.java @@ -40,7 +40,7 @@ public class TrafficMirroringProperties { /** * Traffic mirroring request connection timeout in millisecond. Default is 5000. */ - private long requestConnectionTimeout = 5000; + private int requestConnectionTimeout = 5000; public boolean isEnabled() { return enabled; @@ -62,7 +62,7 @@ public class TrafficMirroringProperties { return requestConnectionTimeout; } - public void setRequestConnectionTimeout(long requestConnectionTimeout) { + public void setRequestConnectionTimeout(int requestConnectionTimeout) { this.requestConnectionTimeout = requestConnectionTimeout; } diff --git a/spring-cloud-tencent-plugin-starters/spring-cloud-starter-tencent-traffic-mirroring-plugin/src/test/java/com/tencent/cloud/plugin/trafficmirroring/config/TrafficMirroringPropertiesTest.java b/spring-cloud-tencent-plugin-starters/spring-cloud-starter-tencent-traffic-mirroring-plugin/src/test/java/com/tencent/cloud/plugin/trafficmirroring/config/TrafficMirroringPropertiesTest.java index 871923e45..014a86222 100644 --- a/spring-cloud-tencent-plugin-starters/spring-cloud-starter-tencent-traffic-mirroring-plugin/src/test/java/com/tencent/cloud/plugin/trafficmirroring/config/TrafficMirroringPropertiesTest.java +++ b/spring-cloud-tencent-plugin-starters/spring-cloud-starter-tencent-traffic-mirroring-plugin/src/test/java/com/tencent/cloud/plugin/trafficmirroring/config/TrafficMirroringPropertiesTest.java @@ -69,7 +69,7 @@ public class TrafficMirroringPropertiesTest { void testRequestConnectionTimeoutProperty() { TrafficMirroringProperties properties = new TrafficMirroringProperties(); - properties.setRequestConnectionTimeout(3000L); + properties.setRequestConnectionTimeout(3000); assertThat(properties.getRequestConnectionTimeout()).isEqualTo(3000L); } @@ -78,10 +78,10 @@ public class TrafficMirroringPropertiesTest { void testRequestConnectionTimeoutBoundaryValues() { TrafficMirroringProperties properties = new TrafficMirroringProperties(); - properties.setRequestConnectionTimeout(0L); + properties.setRequestConnectionTimeout(0); assertThat(properties.getRequestConnectionTimeout()).isZero(); - properties.setRequestConnectionTimeout(-1000L); + properties.setRequestConnectionTimeout(-1000); assertThat(properties.getRequestConnectionTimeout()).isNegative(); } @@ -90,7 +90,7 @@ public class TrafficMirroringPropertiesTest { TrafficMirroringProperties properties = new TrafficMirroringProperties(); properties.setEnabled(false); properties.setRequestPoolSize(8); - properties.setRequestConnectionTimeout(2000L); + properties.setRequestConnectionTimeout(2000); String result = properties.toString();