Skip to content

Commit 1ac1d0e

Browse files
optimize trpc-spring-support test and upgrade jar version (#125)
* feat: optimize trpc-spring-support test
1 parent 444c4af commit 1ac1d0e

25 files changed

Lines changed: 370 additions & 325 deletions

File tree

trpc-core/src/main/java/com/tencent/trpc/core/worker/support/thread/ThreadWorkerPool.java

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,6 @@
4545
import java.util.concurrent.ThreadPoolExecutor;
4646
import java.util.concurrent.TimeUnit;
4747
import java.util.concurrent.atomic.AtomicLong;
48-
import org.reflections.ReflectionUtils;
4948

5049
@Extension(ThreadWorkerPool.TYPE)
5150
public class ThreadWorkerPool extends AbstractWorkerPool
@@ -104,7 +103,7 @@ public void init() throws TRpcExtensionException {
104103
try {
105104
// Use JDK 21+ method Executors.newThreadPerTaskExecutor(ThreadFactory threadFactory)
106105
// to create a virtual thread executor service
107-
Class<?> executorsClazz = ReflectionUtils.forName(EXECUTORS_CLASS_NAME);
106+
Class<?> executorsClazz = Class.forName(EXECUTORS_CLASS_NAME);
108107
Method newThreadPerTaskExecutorMethod = executorsClazz
109108
.getDeclaredMethod(NEW_THREAD_PER_TASK_EXECUTOR_NAME, ThreadFactory.class);
110109
ThreadPerTaskExecutorWrapper wrappedThreadPool = ThreadPerTaskExecutorWrapper
@@ -115,7 +114,8 @@ public void init() throws TRpcExtensionException {
115114
logger.info("Successfully created an executor that assigns each task to a "
116115
+ "new virtual thread for processing");
117116
return;
118-
} catch (NoSuchMethodException | InvocationTargetException | IllegalAccessException exception) {
117+
} catch (NoSuchMethodException | InvocationTargetException |
118+
IllegalAccessException | ClassNotFoundException exception) {
119119
logger.warn("The current JDK version does not support virtual threads, please use OpenJDK 21+, "
120120
+ "or remove use_virtual_thread_per_task_executor config, error: ", exception);
121121
}
@@ -219,7 +219,7 @@ private ThreadFactory getThreadFactory(ThreadPoolConfig poolConfig) {
219219
// introducing the "java.lang.Thread.Builder.OfVirtual" dependency will result in an error,
220220
// so we create virtual threads through reflection, which is compatible with JDKs that do not support
221221
// virtual threads. When the JDK does not support virtual threads, it downgrades to thread.
222-
Class<?> threadClazz = ReflectionUtils.forName(THREAD_CLASS_NAME);
222+
Class<?> threadClazz = Class.forName(THREAD_CLASS_NAME);
223223
Method ofVirtualMethod = threadClazz.getDeclaredMethod(OF_VIRTUAL_NAME);
224224
Object virtual = ofVirtualMethod.invoke(threadClazz);
225225
Class<?> virtualClazz = ofVirtualMethod.getReturnType();
@@ -238,7 +238,8 @@ && containsMethod(virtualClazz.getDeclaredMethods(), SCHEDULER_NAME)) {
238238
threadFactory = (ThreadFactory) factoryMethod.invoke(virtual);
239239
logger.info("Successfully created virtual thread factory");
240240
return threadFactory;
241-
} catch (NoSuchMethodException | InvocationTargetException | IllegalAccessException exception) {
241+
} catch (NoSuchMethodException | InvocationTargetException | IllegalAccessException |
242+
ClassNotFoundException exception) {
242243
logger.error("The current JDK version cannot use virtual threads, please use OpenJDK 21+ or "
243244
+ "Tencent Kona JDK FIBER 8+ version, error: ", exception);
244245
}

trpc-dependencies/trpc-dependencies-bom/pom.xml

Lines changed: 19 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -63,31 +63,31 @@
6363
<assertj-core.version>3.24.2</assertj-core.version>
6464
<apollo.version>2.1.0</apollo.version>
6565
<byte.buddy.version>1.14.9</byte.buddy.version>
66-
<caffeine.version>2.9.3</caffeine.version>
66+
<caffeine.version>3.1.8</caffeine.version>
6767
<central-publishing-maven-plugin.version>0.7.0</central-publishing-maven-plugin.version>
68-
<commons.codec.version>1.15</commons.codec.version>
68+
<commons.codec.version>1.17.1</commons.codec.version>
6969
<commons.collections4.version>4.4</commons.collections4.version>
70-
<commons.configurations.version>2.10.1</commons.configurations.version>
70+
<commons.configurations.version>2.11.0</commons.configurations.version>
7171
<commons.lang.version>2.6</commons.lang.version>
72-
<commons.lang3.version>3.12.0</commons.lang3.version>
73-
<commons.pool2.version>2.3</commons.pool2.version>
74-
<commons.io.version>2.15.1</commons.io.version>
75-
<commons.text.version>1.10.0</commons.text.version>
72+
<commons.lang3.version>3.17.0</commons.lang3.version>
73+
<commons.pool2.version>2.12.0</commons.pool2.version>
74+
<commons.io.version>2.18.0</commons.io.version>
75+
<commons.text.version>1.13.0</commons.text.version>
7676
<commons.beanutils.version>1.9.4</commons.beanutils.version>
7777
<nacos.config.sdk.version>0.2.12</nacos.config.sdk.version>
78-
<curator.version>5.5.0</curator.version>
78+
<curator.version>5.7.1</curator.version>
7979
<consul-api.version>1.4.5</consul-api.version>
8080
<disruptor.version>3.4.2</disruptor.version>
8181
<error.prone.annotations.version>2.10.0</error.prone.annotations.version>
8282
<freemarker.version>2.3.32</freemarker.version>
83-
<gson.version>2.8.9</gson.version>
83+
<gson.version>2.11.0</gson.version>
8484
<guava.version>32.1.3-jre</guava.version>
8585
<httpclient.version>4.5.14</httpclient.version>
86-
<httpclient5.version>5.3.1</httpclient5.version>
86+
<httpclient5.version>5.4.1</httpclient5.version>
87+
<httpcore5.version>5.4</httpcore5.version>
8788
<httpcore.version>4.4.15</httpcore.version>
88-
<httpcore5.version>5.2.5</httpcore5.version>
8989
<hutool.all.version>5.8.28</hutool.all.version>
90-
<jackson.version>2.15.0-rc2</jackson.version>
90+
<jackson.version>2.18.2</jackson.version>
9191
<jakarta.servlet.version>6.0.0</jakarta.servlet.version>
9292
<jakarta.annotation-api.version>2.1.1</jakarta.annotation-api.version>
9393
<jakarta.activation-api.version>2.1.3</jakarta.activation-api.version>
@@ -101,7 +101,7 @@
101101
<joda-time.version>2.7</joda-time.version>
102102
<jprotobuf.version>2.4.14</jprotobuf.version>
103103
<junit.version>5.14.2</junit.version>
104-
<javassist.version>3.28.0-GA</javassist.version>
104+
<javassist.version>3.30.2-GA</javassist.version>
105105
<javax.servlet-api.version>3.1.0</javax.servlet-api.version>
106106
<jsr305.version>3.0.2</jsr305.version>
107107
<logback.version>1.4.14</logback.version>
@@ -119,7 +119,7 @@
119119
<nacos.version>1.4.2</nacos.version>
120120
<nacos.client.version>2.2.1</nacos.client.version>
121121
<objenesis.version>3.3</objenesis.version>
122-
<okhttp3.version>4.10.0</okhttp3.version>
122+
<okhttp3.version>4.12.0</okhttp3.version>
123123
<opentracing.version>0.33.0</opentracing.version>
124124
<openfeign.version>12.2</openfeign.version>
125125
<openfeign.form.version>3.8.0</openfeign.form.version>
@@ -132,24 +132,24 @@
132132
<pgv.version>0.4.1</pgv.version>
133133
<pgv.bin.version>0.6.13</pgv.bin.version>
134134
<quasar.version>0.7.9</quasar.version>
135-
<reflections.version>0.9.12</reflections.version>
135+
<reflections.version>0.10.2</reflections.version>
136136
<resteasy.version>6.2.15.Final</resteasy.version>
137137
<sentinel-transport-simple-http.version>1.8.6</sentinel-transport-simple-http.version>
138138
<sentinel.version>1.8.6</sentinel.version>
139139
<slf4j.version>2.0.17</slf4j.version>
140140
<snakeyaml.version>2.0</snakeyaml.version>
141-
<snappy.version>1.1.10.4</snappy.version>
141+
<snappy.version>1.1.10.7</snappy.version>
142142
<spring.version>6.2.7</spring.version>
143143
<springboot.version>3.5.0</springboot.version>
144144
<spring.cloud.gateway.version>4.3.0</spring.cloud.gateway.version>
145145
<transmittable.version>2.12.4</transmittable.version>
146-
<zookeeper.version>3.8.4</zookeeper.version>
146+
<zookeeper.version>3.9.3</zookeeper.version>
147147

148148
<!-- netty-bom, reactor-bom, io.grpc, auto.value.annotations should be upgraded simultaneously -->
149149
<auto.value.annotations.version>1.9</auto.value.annotations.version>
150150
<io.grpc.version>1.56.0</io.grpc.version>
151-
<reactor-bom.version>2022.0.9</reactor-bom.version>
152-
<netty-bom.version>4.1.79.Final</netty-bom.version>
151+
<reactor-bom.version>2023.0.11</reactor-bom.version>
152+
<netty-bom.version>4.1.115.Final</netty-bom.version>
153153
</properties>
154154

155155
<dependencyManagement>

trpc-spring-support/trpc-spring-cloud-gateway/src/main/java/com/tencent/trpc/spring/cloud/gateway/filter/TrpcGatewayFilterFactory.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
/*
22
* Tencent is pleased to support the open source community by making tRPC available.
33
*
4-
* Copyright (C) 2023 THL A29 Limited, a Tencent company.
4+
* Copyright (C) 2023 THL A29 Limited, a Tencent company.
55
* All rights reserved.
66
*
77
* If you have downloaded a copy of the tRPC source code from Tencent,
@@ -65,7 +65,6 @@ public List<String> shortcutFieldOrder() {
6565

6666
@Override
6767
public GatewayFilter apply(TrpcGatewayFilterFactory.Config config) {
68-
logger.info("config.toString():" + config.toString());
6968
loadRequestRewriter(config);
7069
loadResponseRewriter(config);
7170
return new TrpcRoutingFilter(requestRewriter, responseRewriter, config);

trpc-spring-support/trpc-spring-cloud-gateway/src/main/java/com/tencent/trpc/spring/cloud/gateway/filter/TrpcRoutingFilter.java

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,17 @@ public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
8383
ServerHttpRequest request = exchange.getRequest();
8484
return DataBufferUtils.join(request.getBody())
8585
.map(body -> requestRewriter.resolver(exchange, route, body))
86-
.map(body -> client.asyncInvoke(request, route, body.asByteBuffer().array()))
86+
.map(body -> {
87+
java.nio.ByteBuffer byteBuffer = body.asByteBuffer();
88+
byte[] bytes;
89+
if (byteBuffer.hasArray()) {
90+
bytes = byteBuffer.array();
91+
} else {
92+
bytes = new byte[byteBuffer.remaining()];
93+
byteBuffer.get(bytes);
94+
}
95+
return client.asyncInvoke(request, route, bytes);
96+
})
8797
.flatMap(result -> this.responseRewriter.write(exchange, route.getMetadata(), result));
8898
}
8999

trpc-spring-support/trpc-spring-cloud-gateway/src/main/java/com/tencent/trpc/spring/cloud/gateway/rewriter/DefaultTrpcResponseRewriter.java

Lines changed: 20 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
/*
22
* Tencent is pleased to support the open source community by making tRPC available.
33
*
4-
* Copyright (C) 2023 THL A29 Limited, a Tencent company.
4+
* Copyright (C) 2023 THL A29 Limited, a Tencent company.
55
* All rights reserved.
66
*
77
* If you have downloaded a copy of the tRPC source code from Tencent,
@@ -30,11 +30,25 @@ public Mono<Void> write(ServerWebExchange exchange,
3030
Mono<byte[]> result) {
3131
ServerHttpResponse response = exchange.getResponse();
3232
if (result != null) {
33-
DataBuffer dataBuffer = response.bufferFactory().wrap(result.block());
34-
logger.info("dataBuffer :{}", dataBuffer.toString(StandardCharsets.UTF_8));
35-
// Content-Type uses application/json by default
36-
response.getHeaders().add("Content-Type", MimeTypeUtils.APPLICATION_JSON_VALUE);
37-
return response.writeWith(Mono.justOrEmpty(dataBuffer));
33+
return result.flatMap(bytes -> {
34+
if (bytes == null || bytes.length == 0) {
35+
if (logger.isDebugEnabled()) {
36+
logger.debug("Empty response body, skipping write");
37+
}
38+
return Mono.empty();
39+
}
40+
41+
if (logger.isDebugEnabled()) {
42+
logger.debug("Writing response: {}", new String(bytes, StandardCharsets.UTF_8));
43+
}
44+
45+
DataBuffer dataBuffer = response.bufferFactory().wrap(bytes);
46+
response.getHeaders().setContentLength(bytes.length);
47+
response.getHeaders().set("Content-Type", MimeTypeUtils.APPLICATION_JSON_VALUE);
48+
49+
return response.writeWith(Mono.just(dataBuffer))
50+
.doOnError(error -> logger.error("Failed to write response", error));
51+
});
3852
}
3953
return Mono.empty();
4054
}

trpc-spring-support/trpc-spring-cloud-gateway/src/test/java/com/tencent/trpc/spring/cloud/gateway/filter/TrpcRoutingFilterTest.java

Lines changed: 28 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
/*
22
* Tencent is pleased to support the open source community by making tRPC available.
33
*
4-
* Copyright (C) 2023 THL A29 Limited, a Tencent company.
4+
* Copyright (C) 2023 THL A29 Limited, a Tencent company.
55
* All rights reserved.
66
*
77
* If you have downloaded a copy of the tRPC source code from Tencent,
@@ -11,8 +11,8 @@
1111

1212
package com.tencent.trpc.spring.cloud.gateway.filter;
1313

14-
import static org.junit.Assert.assertEquals;
15-
import static org.junit.Assert.assertNull;
14+
import static org.junit.jupiter.api.Assertions.assertEquals;
15+
import static org.junit.jupiter.api.Assertions.assertNotNull;
1616

1717
import com.tencent.trpc.spring.cloud.gateway.TrpcGatewayApplication;
1818
import java.io.IOException;
@@ -22,6 +22,7 @@
2222
import okhttp3.Request;
2323
import okhttp3.RequestBody;
2424
import okhttp3.Response;
25+
import okhttp3.ResponseBody;
2526
import org.json.JSONException;
2627
import org.json.JSONObject;
2728
import org.junit.jupiter.api.AfterEach;
@@ -34,52 +35,60 @@ public class TrpcRoutingFilterTest {
3435

3536
private final String requestBody = "{\"msg\":\"hello gateway!\",\"id\":\"\"}";
3637

37-
ConfigurableApplicationContext application;
38+
private ConfigurableApplicationContext application;
39+
private OkHttpClient httpClient;
3840

3941
@BeforeEach
40-
void setUp() {
41-
// Start the Spring container, start the gateway, and backend services
42+
void setUp() throws InterruptedException {
4243
application = new SpringApplicationBuilder().sources(TrpcGatewayApplication.class).run(new String[0]);
44+
TimeUnit.SECONDS.sleep(5);
45+
46+
httpClient = new OkHttpClient().newBuilder()
47+
.readTimeout(10, TimeUnit.SECONDS)
48+
.connectTimeout(10, TimeUnit.SECONDS)
49+
.writeTimeout(10, TimeUnit.SECONDS)
50+
.build();
4351
}
4452

4553
@AfterEach
4654
void tearDown() {
47-
// Stop the gateway and simulated backend services
48-
application.stop();
55+
if (application != null) {
56+
application.close();
57+
}
4958
}
5059

5160
@Test
5261
void filter() {
53-
// Initiate an HTTP request and verify the normal TRPC forwarding scenario.
5462
trpcTest();
55-
56-
// Initiate an HTTP request and verify the normal HTTP forwarding scenario.
5763
httpTest();
5864
}
5965

6066
private void httpTest() {
6167
try {
6268
JSONObject response = gateway(getHttpRequest());
63-
assertEquals(response.toString(), requestBody);
69+
assertNotNull(response);
70+
assertEquals(requestBody, response.toString());
6471
} catch (JSONException | IOException e) {
65-
assertNull(e);
72+
throw new AssertionError("httpTest failed", e);
6673
}
6774
}
6875

6976
private void trpcTest() {
7077
try {
7178
JSONObject response = gateway(getTRPCRequest(requestBody));
72-
assertEquals(response.toString(), requestBody);
79+
assertNotNull(response);
80+
assertEquals(requestBody, response.toString());
7381
} catch (JSONException | IOException e) {
74-
assertNull(e);
82+
throw new AssertionError("trpcTest failed", e);
7583
}
7684
}
7785

7886
private JSONObject gateway(Request httpRequest) throws JSONException, IOException {
79-
Response response = new OkHttpClient().newBuilder().readTimeout(2, TimeUnit.SECONDS).build()
80-
.newCall(httpRequest).execute();
81-
// Format is as follows: {"message":"","id":""}
82-
return new JSONObject(response.body().string());
87+
try (Response response = httpClient.newCall(httpRequest).execute()) {
88+
ResponseBody body = response.body();
89+
assertNotNull(body);
90+
return new JSONObject(body.string());
91+
}
8392
}
8493

8594
private Request getHttpRequest() {

trpc-spring-support/trpc-spring/src/test/java/com/tencent/trpc/spring/context/AutoInjectTestClientFilter.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,9 @@
1717
import com.tencent.trpc.core.rpc.Response;
1818
import com.tencent.trpc.spring.context.TRpcConfigAutoRegistryTest.TestService;
1919
import java.util.concurrent.CompletionStage;
20-
import javax.annotation.Resource;
20+
import jakarta.annotation.Resource;
2121
import org.springframework.beans.factory.annotation.Autowired;
22+
import org.springframework.beans.factory.annotation.Qualifier;
2223

2324
public class AutoInjectTestClientFilter implements Filter {
2425

@@ -31,6 +32,7 @@ public TestService getMyTestService1() {
3132
}
3233

3334
@Autowired
35+
@Qualifier("myTestService1")
3436
public void setMyTestService1(TestService myTestService1) {
3537
this.myTestService1 = myTestService1;
3638
}

trpc-spring-support/trpc-spring/src/test/java/com/tencent/trpc/spring/context/AutoInjectTestServerFilter.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
import com.tencent.trpc.spring.context.TRpcConfigAutoRegistryTest.InjectByFieldBean;
1919
import com.tencent.trpc.spring.context.TRpcConfigAutoRegistryTest.InjectBySetterBean;
2020
import java.util.concurrent.CompletionStage;
21-
import javax.annotation.Resource;
21+
import jakarta.annotation.Resource;
2222
import org.springframework.beans.factory.annotation.Autowired;
2323

2424
public class AutoInjectTestServerFilter implements Filter {

0 commit comments

Comments
 (0)