From d64869a839badb2183c17c08ca4d37b82a0af636 Mon Sep 17 00:00:00 2001 From: flzj_kl Date: Mon, 4 Nov 2024 21:00:20 +0800 Subject: [PATCH] feat: update native agent proxy register logic --- labs/cluster-management/README.md | 20 ++++---- .../asserts/cluster_management_single.png | Bin 30926 -> 30105 bytes ...ntManagementNativeAgentProxyDiscovery.java | 35 ++------------ .../NativeAgentManagementWebBootstrap.java | 24 ++++++++-- .../http/HttpNativeAgentProxyHandler.java | 17 ------- ...entManagementNativeAgentProxyRegistry.java | 44 +----------------- .../server/NativeAgentProxyBootstrap.java | 41 ++++++++-------- 7 files changed, 52 insertions(+), 129 deletions(-) diff --git a/labs/cluster-management/README.md b/labs/cluster-management/README.md index b2022bb52..32a20673b 100644 --- a/labs/cluster-management/README.md +++ b/labs/cluster-management/README.md @@ -7,28 +7,26 @@ ![](asserts/cluster_management_single.png) ## 单体模式启动native-agent-management-web -native-agent的管理页面 -启动参数 - -| 参数 | 必填 | 解释 | -|----------------------|-----|-------------------------------------| -| port | N | http端口 ,默认3939 | +native-agent的管理页面,启动需要指定prxoy地址,启动参数 +| 参数 | 必填 | 解释 | +|---------------|-----|-----------------------| +| port | N | http端口 ,默认3939 | +| proxy-address | Y | native-agent-proxy的地址 | example: ```shell -java -jar native-agent-management-web.jar +java -jar native-agent-management-web.jar --proxy-address 161.169.97.114:2233 ``` ## 单体模式启动native-agent-proxy -proxy会向native-agent-management-web注册自己 +proxy启动参数 | 参数 | 必填 | 解释 | |--------------------|-----|--------------------------------------| | port | N | http/ws端口 ,默认2233 | -| ip | Y | proxy的ip | -| management-address | Y | native-agent-manangement-web的地址,用于注册 | + ```shell -java -jar native-agent-proxy.jar --ip 127.0.0.1 --management-address 127.0.0.1:3939 +java -jar native-agent-proxy.jar ``` ## 单体模式启动native-agent diff --git a/labs/cluster-management/asserts/cluster_management_single.png b/labs/cluster-management/asserts/cluster_management_single.png index a733e6beb7ced86df74702975c29f97bfef88182..1c25b636e02f15225f9e49bd3611e0cec74980ef 100644 GIT binary patch literal 30105 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 bA7qgHSkWX;bfq-N&M_3_)MP7UOrQS`moi7% diff --git a/labs/cluster-management/native-agent-management-web/src/main/java/com/alibaba/arthas/nat/agent/management/web/discovery/impl/NativeAgentManagementNativeAgentProxyDiscovery.java b/labs/cluster-management/native-agent-management-web/src/main/java/com/alibaba/arthas/nat/agent/management/web/discovery/impl/NativeAgentManagementNativeAgentProxyDiscovery.java index 480e13010..56cdbc20c 100644 --- a/labs/cluster-management/native-agent-management-web/src/main/java/com/alibaba/arthas/nat/agent/management/web/discovery/impl/NativeAgentManagementNativeAgentProxyDiscovery.java +++ b/labs/cluster-management/native-agent-management-web/src/main/java/com/alibaba/arthas/nat/agent/management/web/discovery/impl/NativeAgentManagementNativeAgentProxyDiscovery.java @@ -2,14 +2,8 @@ package com.alibaba.arthas.nat.agent.management.web.discovery.impl; import com.alibaba.arthas.nat.agent.management.web.discovery.NativeAgentProxyDiscovery; -import java.time.LocalDateTime; -import java.util.ArrayList; +import java.util.Arrays; import java.util.List; -import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.Executors; -import java.util.concurrent.ScheduledExecutorService; -import java.util.concurrent.TimeUnit; /** * @description: NativeAgentManagementNativeAgentProxyDiscovery(Σ(っ °Д °;)っ 好长的类名) @@ -18,32 +12,11 @@ import java.util.concurrent.TimeUnit; */ public class NativeAgentManagementNativeAgentProxyDiscovery implements NativeAgentProxyDiscovery { - /** - * key: native agent ip : http port : ws port , value: expiration time - */ - private static Map nativeAgentProxyMap = new ConcurrentHashMap<>(); - private final static int INITIAL_DELAY_SECONDS = 5; - private final static int PERIOD_SECONDS = 5; - - public static void storageNativeAgent(String address, LocalDateTime expirationTime) { - nativeAgentProxyMap.put(address, expirationTime); - } - - public static void nativeAgentProxyCheckScheduled () { - ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1); - Runnable task = () -> { - LocalDateTime now = LocalDateTime.now(); - nativeAgentProxyMap.forEach((key, expirationTime) ->{ - if (now.isAfter(expirationTime)) { - nativeAgentProxyMap.remove(key); - } - }); - }; - scheduler.scheduleAtFixedRate(task, INITIAL_DELAY_SECONDS, PERIOD_SECONDS, TimeUnit.SECONDS); - } + public static String proxyAddress; @Override public List listNativeAgentProxy(String address) { - return new ArrayList<>(nativeAgentProxyMap.keySet()); + return Arrays.asList(proxyAddress); } + } diff --git a/labs/cluster-management/native-agent-management-web/src/main/java/com/alibaba/arthas/nat/agent/management/web/server/NativeAgentManagementWebBootstrap.java b/labs/cluster-management/native-agent-management-web/src/main/java/com/alibaba/arthas/nat/agent/management/web/server/NativeAgentManagementWebBootstrap.java index a11f8679c..22e4de156 100644 --- a/labs/cluster-management/native-agent-management-web/src/main/java/com/alibaba/arthas/nat/agent/management/web/server/NativeAgentManagementWebBootstrap.java +++ b/labs/cluster-management/native-agent-management-web/src/main/java/com/alibaba/arthas/nat/agent/management/web/server/NativeAgentManagementWebBootstrap.java @@ -30,7 +30,7 @@ import java.util.Arrays; */ @Name("arthas-native-agent-management-web") @Summary("Bootstrap Arthas Native Management Web") -@Description("EXAMPLES:\n" + "java -jar native-agent-management-web.jar\n" +@Description("EXAMPLES:\n" + "java -jar native-agent-management-web.jar --proxy-address 161.169.97.114:2233\n" + "java -jar native-agent-management-web.jar --registration-type etcd --registration-address 161.169.97.114:2379\n" + "java -jar native-agent-management-web.jar --port 3939 --registration-type etcd --registration-address 161.169.97.114:2379\n" + "https://arthas.aliyun.com/doc\n") @@ -38,6 +38,7 @@ public class NativeAgentManagementWebBootstrap { private static final Logger logger = LoggerFactory.getLogger(NativeAgentManagementWebBootstrap.class); private static final int DEFAULT_NATIVE_AGENT_MANAGEMENT_WEB_PORT = 3939; private Integer port; + private String proxyAddress; public static String registrationType; public static String registrationAddress; @@ -47,6 +48,12 @@ public class NativeAgentManagementWebBootstrap { this.port = port; } + @Option(longName = "proxy-address") + @Description("native agent proxy address") + public void setProxyAddress(String proxyAddress) { + this.proxyAddress = proxyAddress; + } + @Option(longName = "registration-type") @Description("registration type") public void setRegistrationType(String registrationType) { @@ -82,10 +89,12 @@ public class NativeAgentManagementWebBootstrap { throw new RuntimeException("Failed to verify the bootstrap parameters. " + "Please read the documentation and check the parameters you entered"); } - if (nativeAgentManagementWebBootstrap.getRegistrationType() == null && nativeAgentManagementWebBootstrap.getRegistrationAddress() == null) { + if (nativeAgentManagementWebBootstrap.getRegistrationType() == null + && nativeAgentManagementWebBootstrap.getRegistrationAddress() == null + && nativeAgentManagementWebBootstrap.getProxyAddress() != null) { nativeAgentManagementWebBootstrap.setRegistrationType("native-agent-management"); nativeAgentManagementWebBootstrap.setRegistrationAddress("127.0.0,1:" + nativeAgentManagementWebBootstrap.getPortOrDefault()); - NativeAgentManagementNativeAgentProxyDiscovery.nativeAgentProxyCheckScheduled(); + NativeAgentManagementNativeAgentProxyDiscovery.proxyAddress = nativeAgentManagementWebBootstrap.getProxyAddress(); } // Start the http server logger.info("start the http server... httPort:{}", nativeAgentManagementWebBootstrap.getPortOrDefault()); @@ -121,12 +130,13 @@ public class NativeAgentManagementWebBootstrap { private static boolean checkBootstrapParams(NativeAgentManagementWebBootstrap managementBootstrap) { String address = managementBootstrap.getRegistrationAddress(); String type = managementBootstrap.getRegistrationType(); + String proxyAddress = managementBootstrap.getProxyAddress(); // single - if (address == null && type == null) { + if (address == null && type == null && proxyAddress != null) { return true; } // cluster - if (address != null && type != null) { + if (address != null && type != null && proxyAddress == null) { return true; } return false; @@ -148,6 +158,10 @@ public class NativeAgentManagementWebBootstrap { return registrationAddress; } + public String getProxyAddress() { + return proxyAddress; + } + public Integer getPort() { return port; } diff --git a/labs/cluster-management/native-agent-management-web/src/main/java/com/alibaba/arthas/nat/agent/management/web/server/http/HttpNativeAgentProxyHandler.java b/labs/cluster-management/native-agent-management-web/src/main/java/com/alibaba/arthas/nat/agent/management/web/server/http/HttpNativeAgentProxyHandler.java index 4b0098294..22187931b 100644 --- a/labs/cluster-management/native-agent-management-web/src/main/java/com/alibaba/arthas/nat/agent/management/web/server/http/HttpNativeAgentProxyHandler.java +++ b/labs/cluster-management/native-agent-management-web/src/main/java/com/alibaba/arthas/nat/agent/management/web/server/http/HttpNativeAgentProxyHandler.java @@ -34,27 +34,10 @@ public class HttpNativeAgentProxyHandler { return responseFindAvailableProxyAddress(ctx, request); } - if ("register".equals(operation)) { - String addressInfo = (String) bodyMap.get("nativeAgentProxyAddress"); - String expirationTimeStr = (String) bodyMap.get("expirationTime"); - return doRegisterNativeAgentProxy(request, addressInfo, expirationTimeStr); - } return null; } - private FullHttpResponse doRegisterNativeAgentProxy(FullHttpRequest request, String addressInfo, String expirationTimeStr) { - LocalDateTime expirationTime = LocalDateTime.parse(expirationTimeStr, DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSS")); - NativeAgentManagementNativeAgentProxyDiscovery.storageNativeAgent(addressInfo, expirationTime); - DefaultFullHttpResponse response = new DefaultFullHttpResponse( - request.getProtocolVersion(), - HttpResponseStatus.OK, - Unpooled.copiedBuffer("success", StandardCharsets.UTF_8) - ); - fillCorsHead(response); - return response; - } - public FullHttpResponse responseFindAvailableProxyAddress(ChannelHandlerContext ctx, FullHttpRequest request) { String availableProxyAddress = findAvailableProxyAddress(); diff --git a/labs/cluster-management/native-agent-proxy/src/main/java/com/alibaba/arthas/nat/agent/proxy/registry/impl/NativeAgentManagementNativeAgentProxyRegistry.java b/labs/cluster-management/native-agent-proxy/src/main/java/com/alibaba/arthas/nat/agent/proxy/registry/impl/NativeAgentManagementNativeAgentProxyRegistry.java index a8fa6f4c5..d16d450a8 100644 --- a/labs/cluster-management/native-agent-proxy/src/main/java/com/alibaba/arthas/nat/agent/proxy/registry/impl/NativeAgentManagementNativeAgentProxyRegistry.java +++ b/labs/cluster-management/native-agent-proxy/src/main/java/com/alibaba/arthas/nat/agent/proxy/registry/impl/NativeAgentManagementNativeAgentProxyRegistry.java @@ -1,16 +1,6 @@ package com.alibaba.arthas.nat.agent.proxy.registry.impl; -import com.alibaba.arthas.nat.agent.common.utils.OkHttpUtil; import com.alibaba.arthas.nat.agent.proxy.registry.NativeAgentProxyRegistry; -import okhttp3.Response; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.io.IOException; -import java.time.LocalDateTime; -import java.util.concurrent.Executors; -import java.util.concurrent.ScheduledExecutorService; -import java.util.concurrent.TimeUnit; /** * @description: NativeAgentManagementNativeAgentProxyRegistry(...好长的类名) @@ -19,41 +9,9 @@ import java.util.concurrent.TimeUnit; */ public class NativeAgentManagementNativeAgentProxyRegistry implements NativeAgentProxyRegistry { - private static final Logger logger = LoggerFactory.getLogger(NativeAgentManagementNativeAgentProxyRegistry.class); - private final int INITIAL_DELAY_SECONDS = 5; - private final int PERIOD_SECONDS = 5; - private final int TIME_OUT_SECONDS = 15; - @Override public void register(String address, String k, String v) { - registerProxy(address, k, v); - logger.info("register to native agent management success, native agent proxy address:{}", k); - sendHeadBeat(address, k, v); - } - - private void sendHeadBeat(String address, String k, String v) { - ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1); - Runnable task = () -> { - registerProxy(address, k, v); - }; - scheduler.scheduleAtFixedRate(task, INITIAL_DELAY_SECONDS, PERIOD_SECONDS, TimeUnit.SECONDS); - } - - private void registerProxy (String address, String k, String v) { - try { - String url = "http://" + address + "/api/native-agent-proxy"; - LocalDateTime expirationTime = LocalDateTime.now().plusSeconds(TIME_OUT_SECONDS); - String jsonBody = "{" + - "\"operation\": \"register\"," + - "\"nativeAgentProxyAddress\":\""+ k +"\", " + - "\"expirationTime\": \"" + expirationTime+ "\"}"; - Response response = OkHttpUtil.postAndResponse(url, jsonBody); - if (response.code() != 200) { - throw new RuntimeException("Register failed! response code: " + response.code()); - } - } catch (IOException e) { - throw new RuntimeException(e); - } + // do nothing } } diff --git a/labs/cluster-management/native-agent-proxy/src/main/java/com/alibaba/arthas/nat/agent/proxy/server/NativeAgentProxyBootstrap.java b/labs/cluster-management/native-agent-proxy/src/main/java/com/alibaba/arthas/nat/agent/proxy/server/NativeAgentProxyBootstrap.java index a72e2b617..784e4a1a2 100644 --- a/labs/cluster-management/native-agent-proxy/src/main/java/com/alibaba/arthas/nat/agent/proxy/server/NativeAgentProxyBootstrap.java +++ b/labs/cluster-management/native-agent-proxy/src/main/java/com/alibaba/arthas/nat/agent/proxy/server/NativeAgentProxyBootstrap.java @@ -32,7 +32,7 @@ import java.util.Arrays; */ @Name("arthas-native-agent-proxy") @Summary("Bootstrap Arthas Native Agent Proxy") -@Description("EXAMPLES:\n" + "java -jar native-agent-proxy.jar --ip 127.0.0.1 --management-address 127.0.0.1:3939\n" +@Description("EXAMPLES:\n" + "java -jar native-agent-proxy.jar\n" + "java -jar native-agent-proxy.jar --ip 151.159.27.114 --management-registration-type etcd --management-registration-address 161.169.97.114:2379 --agent-registration-type etcd --agent-registration-address 161.169.97.114:2379\n" + "java -jar native-agent-proxy.jar --ip 151.159.27.114 --port 2233 --management-registration-type etcd --management-registration-address 161.169.97.114:2379 --agent-registration-type etcd --agent-registration-address 161.169.97.114:2379\n" + "https://arthas.aliyun.com/doc\n") @@ -48,7 +48,7 @@ public class NativeAgentProxyBootstrap { public static String agentRegistrationType; public static String managementRegistrationAddress; public static String agentRegistrationAddress; - private static String managementAddress; + @Option(longName = "port") @Description("native agent proxy http/ws port, default 2233") @@ -56,7 +56,7 @@ public class NativeAgentProxyBootstrap { this.port = port; } - @Option(longName = "ip", required = true) + @Option(longName = "ip") @Description("ip") public void setIp(String ip) { this.ip = ip; @@ -86,12 +86,6 @@ public class NativeAgentProxyBootstrap { this.agentRegistrationAddress = agentRegistrationAddress; } - @Option(longName = "management-address") - @Description("native agent management address") - public void setManagementAddress(String managementAddress) { - this.managementAddress = managementAddress; - } - public static void main(String[] args) { // Print welcome message WelcomeUtil.printProxyWelcomeMsg(); @@ -117,11 +111,13 @@ public class NativeAgentProxyBootstrap { throw new RuntimeException("Failed to verify the registration parameters. " + "Please read the documentation and check the parameters you entered"); } - if (nativeAgentProxyBootstrap.getManagementAddress() != null) { + if (managementRegistrationType == null + && managementRegistrationAddress == null + && agentRegistrationType == null + && agentRegistrationAddress ==null) { nativeAgentProxyBootstrap.setAgentRegistrationType("native-agent-proxy"); nativeAgentProxyBootstrap.setManagementRegistrationType("native-agent-management"); nativeAgentProxyBootstrap.setAgentRegistrationAddress("127.0.0.1:" + nativeAgentProxyBootstrap.getPortOrDefault()); - nativeAgentProxyBootstrap.setManagementRegistrationAddress(nativeAgentProxyBootstrap.getManagementAddress()); NativeAgentProxyNativeAgentDiscovery.nativeAgentCheckScheduled(); } try { @@ -173,20 +169,24 @@ public class NativeAgentProxyBootstrap { } private static boolean checkRegisterParams(NativeAgentProxyBootstrap nativeAgentProxyBootstrap) { + String ip = nativeAgentProxyBootstrap.getIp(); String managementRegistrationType = nativeAgentProxyBootstrap.getManagementRegistrationType(); String managementRegistrationAddress = nativeAgentProxyBootstrap.getManagementRegistrationAddress(); String agentRegistrationType = nativeAgentProxyBootstrap.getAgentRegistrationType(); String agentRegistrationAddress = nativeAgentProxyBootstrap.getAgentRegistrationAddress(); - String managementAddress = nativeAgentProxyBootstrap.getManagementAddress(); - if (managementAddress != null - && (managementRegistrationType == null && managementRegistrationAddress == null - && agentRegistrationType == null && agentRegistrationAddress ==null)) { + // single + if (managementRegistrationType == null + && managementRegistrationAddress == null + && agentRegistrationType == null + && agentRegistrationAddress ==null) { return true; } - - if (managementAddress == null - && (managementRegistrationType != null && managementRegistrationAddress != null - && agentRegistrationType != null && agentRegistrationAddress != null)) { + // cluster + if (ip != null + && managementRegistrationType != null + && managementRegistrationAddress != null + && agentRegistrationType != null + && agentRegistrationAddress != null) { return true; } @@ -217,9 +217,6 @@ public class NativeAgentProxyBootstrap { return agentRegistrationAddress; } - public String getManagementAddress() { - return managementAddress; - } public String getIp() { return ip;