From c7c7e4cf98c2c9be020ee18833a3f14ab8e2f054 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 23:13:22 +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 --- .../support/dubbo/SopDubboConsumerFilter.java | 69 +++++++++++++++++++ .../internal/org.apache.dubbo.rpc.Filter | 1 + 2 files changed, 70 insertions(+) create mode 100644 sop-support/sop-service-support/src/main/java/com/gitee/sop/support/dubbo/SopDubboConsumerFilter.java diff --git a/sop-support/sop-service-support/src/main/java/com/gitee/sop/support/dubbo/SopDubboConsumerFilter.java b/sop-support/sop-service-support/src/main/java/com/gitee/sop/support/dubbo/SopDubboConsumerFilter.java new file mode 100644 index 00000000..714fd23d --- /dev/null +++ b/sop-support/sop-service-support/src/main/java/com/gitee/sop/support/dubbo/SopDubboConsumerFilter.java @@ -0,0 +1,69 @@ +package com.gitee.sop.support.dubbo; + +import com.alibaba.fastjson2.JSON; +import com.gitee.sop.support.constant.SopConstants; +import com.gitee.sop.support.context.OpenContext; +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; +import org.apache.dubbo.rpc.Filter; +import org.apache.dubbo.rpc.Invocation; +import org.apache.dubbo.rpc.Invoker; +import org.apache.dubbo.rpc.Result; +import org.apache.dubbo.rpc.RpcContext; +import org.apache.dubbo.rpc.RpcException; +import org.apache.dubbo.rpc.RpcServiceContext; +import org.springframework.core.env.Environment; + +import java.net.SocketException; +import java.util.Optional; + +/** + * @author 六如 + */ +@Slf4j +@Activate(group = {CommonConstants.CONSUMER}) +public class SopDubboConsumerFilter implements Filter { + + private Environment environment; + + private String ip = "unknown_ip"; + + public void setEnvironment(Environment environment) { + this.environment = environment; + try { + this.ip = NetUtil.getIntranetIp(); + } catch (SocketException e) { + log.warn("获取内网IP失败", e); + } + } + + @Override + public Result invoke(Invoker invoker, Invocation invocation) throws RpcException { + RpcServiceContext serviceContext = RpcContext.getServiceContext(); + // 获取最后一次调用的提供方IP地址 + String targetIP = serviceContext.getRemoteHost(); + // 获取服务端应用名称 + String targetApp = serviceContext.getRemoteApplicationName(); + // 调用的接口 + String interfaceName = serviceContext.getInterfaceName(); + // 获取调用的方法 + String methodName = serviceContext.getMethodName(); + String param = JSON.toJSONString(serviceContext.getArguments()); + + String currentApp = environment.getProperty(SopConstants.SPRING_APPLICATION_NAME); + String currentIp = this.ip; + + OpenContext current = OpenContext.current(); + String traceId = Optional.ofNullable(current).map(OpenContext::getTraceId).orElse(""); + + if (log.isInfoEnabled()) { + log.info("[sop_trace][dubbo_client][{}] 发送请求, current={}({}) -> target={}({}), methodName={}.{}, param={}", + traceId, currentApp, currentIp, targetApp, targetIP, interfaceName, methodName, param); + } + + return invoker.invoke(invocation); + } + +} diff --git a/sop-support/sop-service-support/src/main/resources/META-INF/dubbo/internal/org.apache.dubbo.rpc.Filter b/sop-support/sop-service-support/src/main/resources/META-INF/dubbo/internal/org.apache.dubbo.rpc.Filter index 3d69c34c..0e097699 100644 --- a/sop-support/sop-service-support/src/main/resources/META-INF/dubbo/internal/org.apache.dubbo.rpc.Filter +++ b/sop-support/sop-service-support/src/main/resources/META-INF/dubbo/internal/org.apache.dubbo.rpc.Filter @@ -1 +1,2 @@ sopDubboProviderFilter=com.gitee.sop.support.dubbo.SopDubboProviderFilter +sopDubboConsumerFilter=com.gitee.sop.support.dubbo.SopDubboConsumerFilter