From 79c27ad13c940a15b160520c70c12d11cdfb2a15 Mon Sep 17 00:00:00 2001 From: hengyunabc Date: Thu, 22 Oct 2020 17:11:31 +0800 Subject: [PATCH] add tunnel-common module. #1548 --- pom.xml | 1 + tunnel-client/pom.xml | 5 ++ .../arthas/tunnel/client/TunnelClient.java | 7 ++- .../TunnelClientSocketClientHandler.java | 22 ++++---- tunnel-common/pom.xml | 34 ++++++++++++ .../arthas/tunnel/common/MethodConstants.java | 52 +++++++++++++++++++ .../arthas/tunnel/common/URIConstans.java | 25 +++++++++ tunnel-server/pom.xml | 21 ++++++++ .../server/TunnelSocketFrameHandler.java | 21 +++++--- 9 files changed, 168 insertions(+), 20 deletions(-) create mode 100644 tunnel-common/pom.xml create mode 100644 tunnel-common/src/main/java/com/alibaba/arthas/tunnel/common/MethodConstants.java create mode 100644 tunnel-common/src/main/java/com/alibaba/arthas/tunnel/common/URIConstans.java diff --git a/pom.xml b/pom.xml index 25173136c..de6b9b578 100644 --- a/pom.xml +++ b/pom.xml @@ -58,6 +58,7 @@ spy common + tunnel-common tunnel-client core agent diff --git a/tunnel-client/pom.xml b/tunnel-client/pom.xml index 3aecf161b..8b35fd2e1 100644 --- a/tunnel-client/pom.xml +++ b/tunnel-client/pom.xml @@ -16,6 +16,11 @@ arthas-common ${project.version} + + com.taobao.arthas + arthas-tunnel-common + ${project.version} + org.slf4j diff --git a/tunnel-client/src/main/java/com/alibaba/arthas/tunnel/client/TunnelClient.java b/tunnel-client/src/main/java/com/alibaba/arthas/tunnel/client/TunnelClient.java index e6b22636f..9e917a35f 100644 --- a/tunnel-client/src/main/java/com/alibaba/arthas/tunnel/client/TunnelClient.java +++ b/tunnel-client/src/main/java/com/alibaba/arthas/tunnel/client/TunnelClient.java @@ -9,6 +9,9 @@ import javax.net.ssl.SSLException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import com.alibaba.arthas.tunnel.common.MethodConstants; +import com.alibaba.arthas.tunnel.common.URIConstans; + import io.netty.bootstrap.Bootstrap; import io.netty.channel.ChannelFuture; import io.netty.channel.ChannelFutureListener; @@ -57,9 +60,9 @@ public class TunnelClient { public ChannelFuture connect(boolean reconnect) throws SSLException, URISyntaxException, InterruptedException { QueryStringEncoder queryEncoder = new QueryStringEncoder(this.tunnelServerUrl); - queryEncoder.addParam("method", "agentRegister"); + queryEncoder.addParam(URIConstans.METHOD, MethodConstants.AGENT_REGISTER); if (id != null) { - queryEncoder.addParam("id", id); + queryEncoder.addParam(URIConstans.ID, id); } // ws://127.0.0.1:7777/ws?method=agentRegister final URI agentRegisterURI = queryEncoder.toUri(); diff --git a/tunnel-client/src/main/java/com/alibaba/arthas/tunnel/client/TunnelClientSocketClientHandler.java b/tunnel-client/src/main/java/com/alibaba/arthas/tunnel/client/TunnelClientSocketClientHandler.java index 11179ac0f..60c774a15 100644 --- a/tunnel-client/src/main/java/com/alibaba/arthas/tunnel/client/TunnelClientSocketClientHandler.java +++ b/tunnel-client/src/main/java/com/alibaba/arthas/tunnel/client/TunnelClientSocketClientHandler.java @@ -2,26 +2,24 @@ package com.alibaba.arthas.tunnel.client; import java.net.URI; -import java.net.URL; import java.util.List; import java.util.Map; -import java.util.concurrent.Executors; import java.util.concurrent.TimeUnit; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import com.alibaba.arthas.tunnel.common.MethodConstants; +import com.alibaba.arthas.tunnel.common.URIConstans; + import io.netty.channel.ChannelFuture; import io.netty.channel.ChannelHandlerContext; import io.netty.channel.ChannelPromise; -import io.netty.channel.EventLoopGroup; import io.netty.channel.SimpleChannelInboundHandler; -import io.netty.channel.nio.NioEventLoopGroup; import io.netty.handler.codec.http.QueryStringDecoder; import io.netty.handler.codec.http.QueryStringEncoder; import io.netty.handler.codec.http.websocketx.TextWebSocketFrame; import io.netty.handler.codec.http.websocketx.WebSocketFrame; -import io.netty.util.concurrent.DefaultThreadFactory; /** * @@ -57,25 +55,25 @@ public class TunnelClientSocketClientHandler extends SimpleChannelInboundHandler QueryStringDecoder queryDecoder = new QueryStringDecoder(text); Map> parameters = queryDecoder.parameters(); - List methodList = parameters.get("method"); + List methodList = parameters.get(URIConstans.METHOD); String method = null; if (methodList != null && !methodList.isEmpty()) { method = methodList.get(0); } - if ("agentRegister".equals(method)) { - List idList = parameters.get("id"); + if (MethodConstants.AGENT_REGISTER.equals(method)) { + List idList = parameters.get(URIConstans.ID); if (idList != null && !idList.isEmpty()) { this.tunnelClient.setId(idList.get(0)); } registerPromise.setSuccess(); } - if ("startTunnel".equals(method)) { + if (MethodConstants.START_TUNNEL.equals(method)) { QueryStringEncoder queryEncoder = new QueryStringEncoder(this.tunnelClient.getTunnelServerUrl()); - queryEncoder.addParam("method", "openTunnel"); - queryEncoder.addParam("clientConnectionId", parameters.get("clientConnectionId").get(0)); - queryEncoder.addParam("id", parameters.get("id").get(0)); + queryEncoder.addParam(URIConstans.METHOD, MethodConstants.OPEN_TUNNEL); + queryEncoder.addParam(URIConstans.CLIENT_CONNECTION_ID, parameters.get(URIConstans.CLIENT_CONNECTION_ID).get(0)); + queryEncoder.addParam(URIConstans.ID, parameters.get(URIConstans.ID).get(0)); final URI forwardUri = queryEncoder.toUri(); diff --git a/tunnel-common/pom.xml b/tunnel-common/pom.xml new file mode 100644 index 000000000..7e36d659e --- /dev/null +++ b/tunnel-common/pom.xml @@ -0,0 +1,34 @@ + + + 4.0.0 + + com.taobao.arthas + arthas-all + ${revision} + ../pom.xml + + arthas-tunnel-common + arthas-tunnel-common + + + + + + + + arthas-tunnel-common + + + org.apache.maven.plugins + maven-compiler-plugin + + 1.6 + 1.6 + UTF-8 + true + + + + + + diff --git a/tunnel-common/src/main/java/com/alibaba/arthas/tunnel/common/MethodConstants.java b/tunnel-common/src/main/java/com/alibaba/arthas/tunnel/common/MethodConstants.java new file mode 100644 index 000000000..26162d639 --- /dev/null +++ b/tunnel-common/src/main/java/com/alibaba/arthas/tunnel/common/MethodConstants.java @@ -0,0 +1,52 @@ +package com.alibaba.arthas.tunnel.common; + +/** + * tunnel client和server之间通过 URI来通迅,在URI里定义了一个 method的参数,定义不同的行为 + * + * @author hengyunabc 2020-10-22 + * + */ +public class MethodConstants { + + /** + * + *
+     * tunnel client启动时注册的 method
+     * 
+     * ws://192.168.1.10:7777/ws?method=agentRegister
+     * 
+     * tunnel server回应:
+     * 
+     * response:/?method=agentRegister&id=bvDOe8XbTM2pQWjF4cfw
+     * 
+     * id不指定,则随机生成
+     * 
+ */ + public static final String AGENT_REGISTER = "agentRegister"; + + /** + *
+     * tunnel server 通知 tunnel client启动一个新的连接
+     * 
+     * response:/?method=startTunnel&id=bvDOe8XbTM2pQWjF4cfw&clientConnectionId=AMku9EFz2gxeL2gedGOC
+     * 
+ */ + public static final String START_TUNNEL = "startTunnel"; + /** + *
+     * browser 通知tunnel server去连接 tunnel client
+     * 
+     * ws://192.168.1.10:7777/ws?method=connectArthas&id=bvDOe8XbTM2pQWjF4cfw
+     * 
+ */ + public static final String CONNECT_ARTHAS = "connectArthas"; + + /** + *
+     * tunnel client收到 startTunnel 指令之后,以下面的 URI新建一个连接:
+     * 
+     * ws://127.0.0.1:7777/ws/?method=openTunnel&clientConnectionId=AMku9EFz2gxeL2gedGOC&id=bvDOe8XbTM2pQWjF4cfw
+     * 
+ */ + public static final String OPEN_TUNNEL = "openTunnel"; +} diff --git a/tunnel-common/src/main/java/com/alibaba/arthas/tunnel/common/URIConstans.java b/tunnel-common/src/main/java/com/alibaba/arthas/tunnel/common/URIConstans.java new file mode 100644 index 000000000..fd8c7a8ab --- /dev/null +++ b/tunnel-common/src/main/java/com/alibaba/arthas/tunnel/common/URIConstans.java @@ -0,0 +1,25 @@ +package com.alibaba.arthas.tunnel.common; + +/** + * + * @author hengyunabc 2020-10-22 + * + */ +public class URIConstans { + + /** + * @see MethodConstants + */ + public static final String METHOD = "method"; + public static final String RESPONSE = "response"; + + /** + * agent id + */ + public static final String ID = "id"; + + /** + * tunnel server用于区分不同 tunnel client的内部 id + */ + public static final String CLIENT_CONNECTION_ID = "clientConnectionId"; +} diff --git a/tunnel-server/pom.xml b/tunnel-server/pom.xml index 7d5369ac1..65b5b8fe0 100644 --- a/tunnel-server/pom.xml +++ b/tunnel-server/pom.xml @@ -32,6 +32,11 @@ + + com.taobao.arthas + arthas-tunnel-common + ${project.version} + org.springframework.boot spring-boot-starter-webflux @@ -55,11 +60,27 @@ commons-lang3 + + junit + junit + test + + + org.assertj + assertj-core + test + org.springframework.boot spring-boot-starter-test test + + + org.junit.vintage + junit-vintage-engine + + io.projectreactor diff --git a/tunnel-server/src/main/java/com/alibaba/arthas/tunnel/server/TunnelSocketFrameHandler.java b/tunnel-server/src/main/java/com/alibaba/arthas/tunnel/server/TunnelSocketFrameHandler.java index d925a4a2e..1f129ff4a 100644 --- a/tunnel-server/src/main/java/com/alibaba/arthas/tunnel/server/TunnelSocketFrameHandler.java +++ b/tunnel-server/src/main/java/com/alibaba/arthas/tunnel/server/TunnelSocketFrameHandler.java @@ -17,6 +17,9 @@ import org.slf4j.LoggerFactory; import org.springframework.util.MultiValueMap; import org.springframework.web.util.UriComponentsBuilder; +import com.alibaba.arthas.tunnel.common.MethodConstants; +import com.alibaba.arthas.tunnel.common.URIConstans; + import io.netty.channel.Channel; import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; @@ -56,12 +59,12 @@ public class TunnelSocketFrameHandler extends SimpleChannelInboundHandler parameters = UriComponentsBuilder.fromUriString(uri).build().getQueryParams(); String method = parameters.getFirst("method"); - if ("connectArthas".equals(method)) { // form browser + if (MethodConstants.CONNECT_ARTHAS.equals(method)) { // form browser connectArthas(ctx, parameters); - } else if ("agentRegister".equals(method)) { // form arthas agent, register + } else if (MethodConstants.AGENT_REGISTER.equals(method)) { // form arthas agent, register agentRegister(ctx, uri); } - if ("openTunnel".equals(method)) { // from arthas agent open tunnel + if (MethodConstants.OPEN_TUNNEL.equals(method)) { // from arthas agent open tunnel String clientConnectionId = parameters.getFirst("clientConnectionId"); openTunnel(ctx, clientConnectionId); } @@ -95,8 +98,11 @@ public class TunnelSocketFrameHandler extends SimpleChannelInboundHandler