Skip to content

Commit ef90c4a

Browse files
committed
refactor: tcp反代优化、单元测试包结构调整
1 parent 9ff14bf commit ef90c4a

File tree

7 files changed

+80
-37
lines changed

7 files changed

+80
-37
lines changed

src/main/java/top/meethigher/proxy/http/ReverseHttpProxy.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -392,7 +392,7 @@ protected void doLog(Route route, HttpServerRequest serverReq, HttpServerRespons
392392
String logInfo = logFormat
393393
.replace("{name}", route.getName())
394394
.replace("{method}", serverReq.method().toString())
395-
.replace("{userAgent}", serverReq.getHeader("User-Agent"))
395+
.replace("{userAgent}", serverReq.getHeader("User-Agent") == null ? "" : serverReq.getHeader("User-Agent"))
396396
.replace("{remoteAddr}", serverReq.remoteAddress().hostAddress())
397397
.replace("{remotePort}", String.valueOf(serverReq.remoteAddress().port()))
398398
.replace("{source}", serverReq.uri())

src/main/java/top/meethigher/proxy/tcp/ReverseTcpProxy.java

Lines changed: 50 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import io.vertx.core.net.NetClient;
88
import io.vertx.core.net.NetServer;
99
import io.vertx.core.net.NetSocket;
10+
import io.vertx.core.net.SocketAddress;
1011
import org.slf4j.Logger;
1112
import org.slf4j.LoggerFactory;
1213

@@ -43,23 +44,63 @@ private ReverseTcpProxy(NetServer netServer, NetClient netClient,
4344
this.netServer = netServer;
4445
this.netClient = netClient;
4546
this.connectHandler = sourceSocket -> {
47+
// 暂停流读取
4648
sourceSocket.pause();
4749
netClient.connect(targetPort, targetHost)
50+
.onFailure(e -> log.error("failed to connect to {}:{}", targetHost, targetPort, e))
4851
.onSuccess(targetSocket -> {
49-
log.info("connected {} <--> {} ({} <--> {})", sourceSocket.remoteAddress().toString(), sourceSocket.localAddress().toString(),
50-
targetSocket.localAddress().toString(), targetSocket.remoteAddress().toString());
52+
SocketAddress sourceRemoteAddress = sourceSocket.remoteAddress();
53+
SocketAddress sourceLocalAddress = sourceSocket.localAddress();
54+
SocketAddress targetRemoteAddress = targetSocket.remoteAddress();
55+
SocketAddress targetLocalAddress = targetSocket.localAddress();
56+
log.debug("connected {} -- {} ({} -- {})", sourceRemoteAddress.toString(), sourceLocalAddress.toString(),
57+
targetLocalAddress.toString(), targetRemoteAddress.toString());
58+
59+
// 暂停流读取
5160
targetSocket.pause();
52-
sourceSocket.closeHandler(v -> targetSocket.close()).pipeTo(targetSocket);
61+
62+
63+
sourceSocket.closeHandler(v -> targetSocket.close()).pipeTo(targetSocket, ar -> {
64+
if (ar.succeeded()) {
65+
log.debug("pipeTo successful. {} --> {} --> {} --> {}",
66+
sourceRemoteAddress,
67+
sourceLocalAddress,
68+
targetLocalAddress,
69+
targetRemoteAddress);
70+
} else {
71+
log.error("pipeTo failed. {} --> {} --> {} --> {}",
72+
sourceRemoteAddress,
73+
sourceLocalAddress,
74+
targetLocalAddress,
75+
targetRemoteAddress,
76+
ar.cause());
77+
}
78+
});
5379
targetSocket.closeHandler(v -> {
5480
sourceSocket.close();
55-
log.info("closed {} <--> {} ({} <--> {})", sourceSocket.remoteAddress().toString(), sourceSocket.localAddress().toString(),
56-
targetSocket.localAddress().toString(), targetSocket.remoteAddress().toString());
57-
}).pipeTo(sourceSocket);
81+
log.debug("closed {} -- {} ({} -- {})", sourceRemoteAddress.toString(), sourceLocalAddress.toString(),
82+
targetLocalAddress.toString(), targetRemoteAddress.toString());
83+
}).pipeTo(sourceSocket, ar -> {
84+
if (ar.succeeded()) {
85+
log.debug("pipeTo successful. {} <-- {} <-- {} <-- {}",
86+
sourceRemoteAddress,
87+
sourceLocalAddress,
88+
targetLocalAddress,
89+
targetRemoteAddress);
90+
} else {
91+
log.error("pipeTo failed. {} <-- {} <-- {} <-- {}",
92+
sourceRemoteAddress,
93+
sourceLocalAddress,
94+
targetLocalAddress,
95+
targetRemoteAddress,
96+
ar.cause());
97+
}
98+
});
99+
100+
// 恢复流读取
58101
sourceSocket.resume();
59102
targetSocket.resume();
60-
})
61-
.onFailure(e -> log.error("failed to connect to {}:{}", targetHost, targetPort, e));
62-
103+
});
63104
};
64105
}
65106

src/test/java/top/meethigher/ReverseHttpProxyBugTest.java renamed to src/test/java/top/meethigher/proxy/http/ReverseHttpProxyBugTest.java

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package top.meethigher;
1+
package top.meethigher.proxy.http;
22

33
import io.vertx.core.Vertx;
44
import io.vertx.core.http.*;
@@ -7,8 +7,6 @@
77
import org.junit.Test;
88
import org.slf4j.Logger;
99
import org.slf4j.LoggerFactory;
10-
import top.meethigher.proxy.http.ProxyRoute;
11-
import top.meethigher.proxy.http.ReverseHttpProxy;
1210

1311
import java.time.Duration;
1412
import java.util.concurrent.TimeUnit;
@@ -93,6 +91,6 @@ public void reqClose() throws Exception {
9391
}
9492
});
9593

96-
TimeUnit.SECONDS.sleep(20);
94+
TimeUnit.SECONDS.sleep(20000);
9795
}
9896
}

src/test/java/top/meethigher/ReverseHttpProxyTest.java renamed to src/test/java/top/meethigher/proxy/http/ReverseHttpProxyTest.java

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,11 @@
1-
package top.meethigher;
1+
package top.meethigher.proxy.http;
22

33
import io.vertx.core.Vertx;
44
import io.vertx.core.http.PoolOptions;
55
import io.vertx.ext.web.Router;
66
import org.junit.Test;
77
import org.slf4j.Logger;
88
import org.slf4j.LoggerFactory;
9-
import top.meethigher.proxy.http.ProxyRoute;
10-
import top.meethigher.proxy.http.ReverseHttpProxy;
119

1210
import java.util.concurrent.TimeUnit;
1311

src/test/java/top/meethigher/batch-curl.sh renamed to src/test/java/top/meethigher/proxy/http/batch-curl.sh

Lines changed: 23 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -8,92 +8,100 @@ function log() {
88
echo "$(date +"%Y-%m-%d %H:%M:%S"): $1"
99
}
1010

11+
# 计算时间的函数
12+
function time_request() {
13+
start=$(date +%s%3N) # 获取当前时间的毫秒
14+
"$@" # 执行传入的命令
15+
end=$(date +%s%3N) # 获取当前时间的毫秒
16+
duration=$((end - start)) # 计算请求耗时
17+
echo -e "\n请求耗时:${duration}ms"
18+
}
1119

1220
# 1. 获取用户列表(GET)
1321
log "请求:获取用户列表"
14-
curl -X GET "$BASE_URL/users?page=2" -H "Accept: application/json"
22+
time_request curl -X GET "$BASE_URL/users?page=2" -H "Accept: application/json"
1523
echo -e "\n"
1624

1725
# 2. 获取单个用户(GET)
1826
log "请求:获取单个用户"
19-
curl -X GET "$BASE_URL/users/2" -H "Accept: application/json"
27+
time_request curl -X GET "$BASE_URL/users/2" -H "Accept: application/json"
2028
echo -e "\n"
2129

2230
# 3. 获取不存在的用户(GET - 404)
2331
log "请求:获取不存在的用户"
24-
curl -X GET "$BASE_URL/users/23" -H "Accept: application/json"
32+
time_request curl -X GET "$BASE_URL/users/23" -H "Accept: application/json"
2533
echo -e "\n"
2634

2735
# 4. 获取资源列表(GET)
2836
log "请求:获取资源列表"
29-
curl -X GET "$BASE_URL/unknown" -H "Accept: application/json"
37+
time_request curl -X GET "$BASE_URL/unknown" -H "Accept: application/json"
3038
echo -e "\n"
3139

3240
# 5. 获取单个资源(GET)
3341
log "请求:获取单个资源"
34-
curl -X GET "$BASE_URL/unknown/2" -H "Accept: application/json"
42+
time_request curl -X GET "$BASE_URL/unknown/2" -H "Accept: application/json"
3543
echo -e "\n"
3644

3745
# 6. 获取不存在的资源(GET - 404)
3846
log "请求:获取不存在的资源"
39-
curl -X GET "$BASE_URL/unknown/23" -H "Accept: application/json"
47+
time_request curl -X GET "$BASE_URL/unknown/23" -H "Accept: application/json"
4048
echo -e "\n"
4149

4250
# 7. 创建用户(POST)
4351
log "请求:创建用户"
44-
curl -X POST "$BASE_URL/users" \
52+
time_request curl -X POST "$BASE_URL/users" \
4553
-H "Content-Type: application/json" \
4654
-d '{"name": "morpheus", "job": "leader"}'
4755
echo -e "\n"
4856

4957
# 8. 更新用户(PUT)
5058
log "请求:更新用户"
51-
curl -X PUT "$BASE_URL/users/2" \
59+
time_request curl -X PUT "$BASE_URL/users/2" \
5260
-H "Content-Type: application/json" \
5361
-d '{"name": "morpheus", "job": "zion resident"}'
5462
echo -e "\n"
5563

5664
# 9. 更新用户(PATCH)
5765
log "请求:部分更新用户"
58-
curl -X PATCH "$BASE_URL/users/2" \
66+
time_request curl -X PATCH "$BASE_URL/users/2" \
5967
-H "Content-Type: application/json" \
6068
-d '{"name": "morpheus", "job": "senior developer"}'
6169
echo -e "\n"
6270

6371
# 10. 删除用户(DELETE)
6472
log "请求:删除用户"
65-
curl -X DELETE "$BASE_URL/users/2"
73+
time_request curl -X DELETE "$BASE_URL/users/2"
6674
echo -e "\n"
6775

6876
# 11. 用户登录(POST - 成功)
6977
log "请求:用户登录(成功)"
70-
curl -X POST "$BASE_URL/login" \
78+
time_request curl -X POST "$BASE_URL/login" \
7179
-H "Content-Type: application/json" \
7280
-d '{"email": "[email protected]", "password": "cityslicka"}'
7381
echo -e "\n"
7482

7583
# 12. 用户登录(POST - 失败)
7684
log "请求:用户登录(失败)"
77-
curl -X POST "$BASE_URL/login" \
85+
time_request curl -X POST "$BASE_URL/login" \
7886
-H "Content-Type: application/json" \
7987
-d '{"email": "[email protected]"}'
8088
echo -e "\n"
8189

8290
# 13. 用户注册(POST - 成功)
8391
log "请求:用户注册(成功)"
84-
curl -X POST "$BASE_URL/register" \
92+
time_request curl -X POST "$BASE_URL/register" \
8593
-H "Content-Type: application/json" \
8694
-d '{"email": "[email protected]", "password": "pistol"}'
8795
echo -e "\n"
8896

8997
# 14. 用户注册(POST - 失败)
9098
log "请求:用户注册(失败)"
91-
curl -X POST "$BASE_URL/register" \
99+
time_request curl -X POST "$BASE_URL/register" \
92100
-H "Content-Type: application/json" \
93101
-d '{"email": "sydney@fife"}'
94102
echo -e "\n"
95103

96104
# 15. 获取延迟响应的用户列表(GET - 3秒延迟)
97105
log "请求:获取延迟响应的用户列表"
98-
curl -X GET "$BASE_URL/users?delay=3" -H "Accept: application/json"
106+
time_request curl -X GET "$BASE_URL/users?delay=3" -H "Accept: application/json"
99107
echo -e "\n"

src/test/java/top/meethigher/ReverseTcpProxyTest.java renamed to src/test/java/top/meethigher/proxy/tcp/ReverseTcpProxyTest.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,15 @@
1-
package top.meethigher;
1+
package top.meethigher.proxy.tcp;
22

33
import io.vertx.core.Vertx;
44
import org.junit.Test;
5-
import top.meethigher.proxy.tcp.ReverseTcpProxy;
65

76
import java.util.concurrent.TimeUnit;
87

98
public class ReverseTcpProxyTest {
109

1110
@Test
1211
public void testVertxTCPReverseProxy() throws Exception {
13-
ReverseTcpProxy proxy = ReverseTcpProxy.create(Vertx.vertx(), "10.0.0.9", 5432);
12+
ReverseTcpProxy proxy = ReverseTcpProxy.create(Vertx.vertx(), "10.0.0.1", 8080);
1413
proxy.port(22).start();
1514
TimeUnit.MINUTES.sleep(10);
1615
proxy.stop();

src/test/java/top/meethigher/SimpleReverseTcpProxyTest.java renamed to src/test/java/top/meethigher/proxy/tcp/SimpleReverseTcpProxyTest.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
1-
package top.meethigher;
1+
package top.meethigher.proxy.tcp;
22

33
import org.junit.Test;
4-
import top.meethigher.proxy.tcp.SimpleReverseTcpProxy;
54

65
import java.util.concurrent.TimeUnit;
76

0 commit comments

Comments
 (0)