From c5f4e06df1b31748d7f2df33c9467be28c1da1de Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=85=AD=E5=A6=82?= <8775@163.com> Date: Wed, 12 Mar 2025 01:13:48 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96dubbo=20filter?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sop/support/constant/SopConstants.java | 1 + .../support/context/DefaultOpenContext.java | 4 + .../support/context/DefaultWebContext.java | 4 + .../sop/support/context/OpenContext.java | 5 + .../gitee/sop/support/context/WebContext.java | 4 + .../dubbo/DubboProviderTraceFilter.java | 106 +++++++++++------- .../com/gitee/sop/support/util/NetUtil.java | 50 +++++++++ 7 files changed, 135 insertions(+), 39 deletions(-) create mode 100644 sop-support/sop-service-support/src/main/java/com/gitee/sop/support/util/NetUtil.java diff --git a/sop-support/sop-service-support/src/main/java/com/gitee/sop/support/constant/SopConstants.java b/sop-support/sop-service-support/src/main/java/com/gitee/sop/support/constant/SopConstants.java index 06bd7e6b..9b6a823c 100644 --- a/sop-support/sop-service-support/src/main/java/com/gitee/sop/support/constant/SopConstants.java +++ b/sop-support/sop-service-support/src/main/java/com/gitee/sop/support/constant/SopConstants.java @@ -18,5 +18,6 @@ public final class SopConstants { public static final String OPEN_CONTEXT = "sop.open-context"; public static final String WEB_CONTEXT = "sop.web-context"; public static final String DEFAULT_VERSION = "1.0"; + public static final String SPRING_APPLICATION_NAME = "spring.application.name"; } diff --git a/sop-support/sop-service-support/src/main/java/com/gitee/sop/support/context/DefaultOpenContext.java b/sop-support/sop-service-support/src/main/java/com/gitee/sop/support/context/DefaultOpenContext.java index c557c62a..246b03e0 100755 --- a/sop-support/sop-service-support/src/main/java/com/gitee/sop/support/context/DefaultOpenContext.java +++ b/sop-support/sop-service-support/src/main/java/com/gitee/sop/support/context/DefaultOpenContext.java @@ -57,4 +57,8 @@ public class DefaultOpenContext extends OpenContext implements Serializable { public void initContext() { this.setContext(this); } + + public void remove() { + this.clear(); + } } diff --git a/sop-support/sop-service-support/src/main/java/com/gitee/sop/support/context/DefaultWebContext.java b/sop-support/sop-service-support/src/main/java/com/gitee/sop/support/context/DefaultWebContext.java index e80dd3a8..b6c3da03 100644 --- a/sop-support/sop-service-support/src/main/java/com/gitee/sop/support/context/DefaultWebContext.java +++ b/sop-support/sop-service-support/src/main/java/com/gitee/sop/support/context/DefaultWebContext.java @@ -64,4 +64,8 @@ public class DefaultWebContext extends WebContext implements Serializable { public void initContext() { this.setContext(this); } + + public void remove() { + this.clear(); + } } diff --git a/sop-support/sop-service-support/src/main/java/com/gitee/sop/support/context/OpenContext.java b/sop-support/sop-service-support/src/main/java/com/gitee/sop/support/context/OpenContext.java index aee78ff4..ced300d0 100755 --- a/sop-support/sop-service-support/src/main/java/com/gitee/sop/support/context/OpenContext.java +++ b/sop-support/sop-service-support/src/main/java/com/gitee/sop/support/context/OpenContext.java @@ -63,4 +63,9 @@ public abstract class OpenContext { public static OpenContext current() { return THREAD_LOCAL.get(); } + + protected void clear() { + THREAD_LOCAL.remove(); + } + } diff --git a/sop-support/sop-service-support/src/main/java/com/gitee/sop/support/context/WebContext.java b/sop-support/sop-service-support/src/main/java/com/gitee/sop/support/context/WebContext.java index d86d491c..f818f4f6 100644 --- a/sop-support/sop-service-support/src/main/java/com/gitee/sop/support/context/WebContext.java +++ b/sop-support/sop-service-support/src/main/java/com/gitee/sop/support/context/WebContext.java @@ -75,4 +75,8 @@ public abstract class WebContext { public static WebContext current() { return THREAD_LOCAL.get(); } + + protected void clear() { + THREAD_LOCAL.remove(); + } } diff --git a/sop-support/sop-service-support/src/main/java/com/gitee/sop/support/dubbo/DubboProviderTraceFilter.java b/sop-support/sop-service-support/src/main/java/com/gitee/sop/support/dubbo/DubboProviderTraceFilter.java index f0a748a8..ba3e0404 100644 --- a/sop-support/sop-service-support/src/main/java/com/gitee/sop/support/dubbo/DubboProviderTraceFilter.java +++ b/sop-support/sop-service-support/src/main/java/com/gitee/sop/support/dubbo/DubboProviderTraceFilter.java @@ -4,7 +4,7 @@ import com.alibaba.fastjson2.JSON; import com.gitee.sop.support.constant.SopConstants; import com.gitee.sop.support.context.DefaultOpenContext; import com.gitee.sop.support.context.DefaultWebContext; -import com.gitee.sop.support.context.WebContext; +import com.gitee.sop.support.util.NetUtil; import lombok.extern.slf4j.Slf4j; import org.apache.dubbo.common.constants.CommonConstants; import org.apache.dubbo.common.extension.Activate; @@ -16,6 +16,9 @@ import org.apache.dubbo.rpc.RpcContext; import org.apache.dubbo.rpc.RpcContextAttachment; import org.apache.dubbo.rpc.RpcException; import org.apache.dubbo.rpc.RpcServiceContext; +import org.springframework.core.env.Environment; + +import java.net.SocketException; /** * @author 六如 @@ -24,42 +27,24 @@ import org.apache.dubbo.rpc.RpcServiceContext; @Activate(group = {CommonConstants.PROVIDER}) public class DubboProviderTraceFilter implements Filter { + private Environment environment; + + private String ip; + + public void setEnvironment(Environment environment) { + this.environment = environment; + try { + this.ip = NetUtil.getIntranetIp(); + } catch (SocketException e) { + throw new RuntimeException(e); + } + } + @Override public Result invoke(Invoker invoker, Invocation invocation) throws RpcException { - initOpenContext(); - initWebContext(); - long startTime = System.currentTimeMillis(); - long endTime = 0; - try { - Result result = invoker.invoke(invocation); - endTime = System.currentTimeMillis(); - return result; - } finally { - trace(invocation, startTime, endTime); - } - } + DefaultOpenContext openContext = initOpenContext(); + DefaultWebContext webContext = initWebContext(); - private void initOpenContext() { - // 从 ServerAttachment 中读取的参数是从 Client 中传递过来的 - RpcContextAttachment serverAttachment = RpcContext.getServerAttachment(); - Object objectAttachment = serverAttachment.getObjectAttachment(SopConstants.OPEN_CONTEXT); - if (objectAttachment instanceof DefaultOpenContext) { - DefaultOpenContext openContext = (DefaultOpenContext) objectAttachment; - openContext.initContext(); - } - } - - private void initWebContext() { - RpcContextAttachment serverAttachment = RpcContext.getServerAttachment(); - Object objectAttachment = serverAttachment.getObjectAttachment(SopConstants.WEB_CONTEXT); - if (objectAttachment instanceof DefaultWebContext) { - DefaultWebContext webContext = (DefaultWebContext) objectAttachment; - webContext.initContext(); - } - } - - private void trace(Invocation invocation, long startTime, long endTime) { - // 如果是服务提供端 RpcServiceContext serviceContext = RpcContext.getServiceContext(); // 获取客户端IP String fromIP = serviceContext.getRemoteHost(); @@ -71,11 +56,54 @@ public class DubboProviderTraceFilter implements Filter { String methodName = serviceContext.getMethodName(); // 调用参数值 String param = JSON.toJSONString(serviceContext.getArguments()); - // 超过500毫秒告警 - long spend = (endTime == 0 ? System.currentTimeMillis() : endTime) - startTime; - if (log.isWarnEnabled() && spend > 500) { - log.warn("[sop_trace][dubbo_server][time_warn] Dubbo 耗时告警({}ms), from={}({}), methodName={}.{}, param={}", - spend, fromApp, fromIP, interfaceName, methodName, param); + String currentApp = environment.getProperty(SopConstants.SPRING_APPLICATION_NAME); + String currentIp = this.ip; + String traceId = openContext == null ? "" : openContext.getTraceId(); + if (log.isInfoEnabled()) { + log.info("[dhf_trace][dubbo_server][{}] 收到请求, from={}({}) -> current={}({}), methodName={}.{}, param={}", + traceId, fromApp, fromIP, currentApp, currentIp, interfaceName, methodName, param); + } + + long startTime = System.currentTimeMillis(); + try { + return invoker.invoke(invocation); + } finally { + if (openContext != null) { + openContext.remove(); + } + if (webContext != null) { + webContext.remove(); + } + // 超过500毫秒告警 + long spend = System.currentTimeMillis() - startTime; + if (log.isWarnEnabled() && spend > 500) { + log.warn("[dhf_trace][dubbo_server][time_warn][{}] Dubbo 耗时告警({}ms), from={}({}) -> current={}({}) , methodName={}.{}, param={}", + traceId, spend, fromApp, fromIP, currentApp, currentIp, interfaceName, methodName, param); + } } } + + private DefaultOpenContext initOpenContext() { + // 从 ServerAttachment 中读取的参数是从 Client 中传递过来的 + RpcContextAttachment serverAttachment = RpcContext.getServerAttachment(); + Object objectAttachment = serverAttachment.getObjectAttachment(SopConstants.OPEN_CONTEXT); + if (objectAttachment instanceof DefaultOpenContext) { + DefaultOpenContext openContext = (DefaultOpenContext) objectAttachment; + openContext.initContext(); + return openContext; + } + return null; + } + + private DefaultWebContext initWebContext() { + RpcContextAttachment serverAttachment = RpcContext.getServerAttachment(); + Object objectAttachment = serverAttachment.getObjectAttachment(SopConstants.WEB_CONTEXT); + if (objectAttachment instanceof DefaultWebContext) { + DefaultWebContext webContext = (DefaultWebContext) objectAttachment; + webContext.initContext(); + return webContext; + } + return null; + } + } diff --git a/sop-support/sop-service-support/src/main/java/com/gitee/sop/support/util/NetUtil.java b/sop-support/sop-service-support/src/main/java/com/gitee/sop/support/util/NetUtil.java new file mode 100644 index 00000000..d6099651 --- /dev/null +++ b/sop-support/sop-service-support/src/main/java/com/gitee/sop/support/util/NetUtil.java @@ -0,0 +1,50 @@ +package com.gitee.sop.support.util; + +import java.net.InetAddress; +import java.net.NetworkInterface; +import java.net.SocketException; +import java.util.Enumeration; + +/** + * @author 六如 + */ +public class NetUtil { + + /** + * 获取本机的内网ip地址 + * + * @return 返回内网ip + * @throws SocketException 异常 + */ + public static String getIntranetIp() throws SocketException { + String localip = null;// 本地IP,如果没有配置外网IP则返回它 + String netip = null;// 外网IP + Enumeration netInterfaces = NetworkInterface.getNetworkInterfaces(); + InetAddress ip = null; + boolean finded = false;// 是否找到外网IP + while (netInterfaces.hasMoreElements() && !finded) { + NetworkInterface ni = netInterfaces.nextElement(); + Enumeration address = ni.getInetAddresses(); + while (address.hasMoreElements()) { + ip = address.nextElement(); + if (!ip.isSiteLocalAddress() + && !ip.isLoopbackAddress() + && !ip.getHostAddress().contains(":")) {// 外网IP + netip = ip.getHostAddress(); + finded = true; + break; + } else if (ip.isSiteLocalAddress() + && !ip.isLoopbackAddress() + && !ip.getHostAddress().contains(":")) {// 内网IP + localip = ip.getHostAddress(); + } + } + } + if (netip != null && !"".equals(netip)) { + return netip; + } else { + return localip; + } + } + +}