From 6edd86816b472e56a52fa52de986fd320204f754 Mon Sep 17 00:00:00 2001 From: amos wong Date: Sat, 10 May 2025 21:20:26 +0800 Subject: [PATCH] master --- .gitignore | 43 +++++++ pom.xml | 119 ++++++++++++++++++ .../java/com/deepinnet/tag/EnvContext.java | 20 +++ .../tag/constants/TagKeyConstants.java | 6 + .../tag/filter/DubboConsumerTagFilter.java | 33 +++++ .../tag/filter/DubboProviderTagFilter.java | 28 +++++ .../deepinnet/tag/filter/RestTagFilter.java | 50 ++++++++ .../internal/org.apache.dubbo.rpc.Filter | 1 + ...che.dubbo.rpc.cluster.filter.ClusterFilter | 1 + src/main/resources/META-INF/spring.factories | 1 + 10 files changed, 302 insertions(+) create mode 100644 .gitignore create mode 100644 pom.xml create mode 100644 src/main/java/com/deepinnet/tag/EnvContext.java create mode 100644 src/main/java/com/deepinnet/tag/constants/TagKeyConstants.java create mode 100644 src/main/java/com/deepinnet/tag/filter/DubboConsumerTagFilter.java create mode 100644 src/main/java/com/deepinnet/tag/filter/DubboProviderTagFilter.java create mode 100644 src/main/java/com/deepinnet/tag/filter/RestTagFilter.java create mode 100644 src/main/resources/META-INF/dubbo/internal/org.apache.dubbo.rpc.Filter create mode 100644 src/main/resources/META-INF/dubbo/internal/org.apache.dubbo.rpc.cluster.filter.ClusterFilter create mode 100644 src/main/resources/META-INF/spring.factories diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..141084d --- /dev/null +++ b/.gitignore @@ -0,0 +1,43 @@ +target/ +!.mvn/wrapper/maven-wrapper.jar +!**/src/main/**/target/ +!**/src/test/**/target/ + +### IntelliJ IDEA ### +.idea +.idea/modules.xml +.idea/jarRepositories.xml +.idea/compiler.xml +.idea/libraries/ +*.iws +*.iml +*.ipr + +### Eclipse ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ +build/ +!**/src/main/**/build/ +!**/src/test/**/build/ + +### VS Code ### +.vscode/ + +### Mac OS ### +.DS_Store + +#日志文件 +logs +/.idea/ diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..4cfcf8a --- /dev/null +++ b/pom.xml @@ -0,0 +1,119 @@ + + + 4.0.0 + + + spring-boot-starter-parent + org.springframework.boot + 2.6.0 + + + com.deepinnet + deepinnet-dubbo-tag-starter + 1.0.4-SNAPSHOT + + + 1.2.7 + 8 + 8 + UTF-8 + + + + + org.apache.dubbo + dubbo + 3.1.4 + provided + + + + com.alibaba + transmittable-thread-local + 2.14.2 + + + + org.springframework.boot + spring-boot-starter-aop + + + + org.springframework.boot + spring-boot-starter-web + + + org.apache.logging.log4j + log4j-to-slf4j + + + + + + org.springframework + spring-context + provided + + + + org.apache.commons + commons-lang3 + 3.12.0 + provided + + + + org.projectlombok + lombok + 1.18.24 + provided + + + + ch.qos.logback + logback-classic + ${logback.version} + provided + + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.5.1 + + 1.8 + 1.8 + UTF-8 + + + + + maven-source-plugin + 3.0.1 + + true + + + + compile + + jar + + + + + + + org.apache.maven.plugins + maven-deploy-plugin + 2.8.2 + + + + \ No newline at end of file diff --git a/src/main/java/com/deepinnet/tag/EnvContext.java b/src/main/java/com/deepinnet/tag/EnvContext.java new file mode 100644 index 0000000..21545d9 --- /dev/null +++ b/src/main/java/com/deepinnet/tag/EnvContext.java @@ -0,0 +1,20 @@ +package com.deepinnet.tag; + +import com.alibaba.ttl.TransmittableThreadLocal; + +public class EnvContext { + + private static final ThreadLocal DUBBO_TAG_CONTEXT = TransmittableThreadLocal.withInitial(() -> ""); + + public static void setDubboTag(String dubboTag) { + DUBBO_TAG_CONTEXT.set(dubboTag); + } + + public static String getDubboTag() { + return DUBBO_TAG_CONTEXT.get(); + } + + public static void remove() { + DUBBO_TAG_CONTEXT.remove(); + } +} diff --git a/src/main/java/com/deepinnet/tag/constants/TagKeyConstants.java b/src/main/java/com/deepinnet/tag/constants/TagKeyConstants.java new file mode 100644 index 0000000..6b0c0fd --- /dev/null +++ b/src/main/java/com/deepinnet/tag/constants/TagKeyConstants.java @@ -0,0 +1,6 @@ +package com.deepinnet.tag.constants; + +public interface TagKeyConstants { + + String TAG_KEY = "dubbo.tag"; +} diff --git a/src/main/java/com/deepinnet/tag/filter/DubboConsumerTagFilter.java b/src/main/java/com/deepinnet/tag/filter/DubboConsumerTagFilter.java new file mode 100644 index 0000000..1fd0833 --- /dev/null +++ b/src/main/java/com/deepinnet/tag/filter/DubboConsumerTagFilter.java @@ -0,0 +1,33 @@ +package com.deepinnet.tag.filter; + + +import com.deepinnet.tag.EnvContext; +import com.deepinnet.tag.constants.TagKeyConstants; +import org.apache.commons.lang3.StringUtils; +import org.apache.dubbo.common.constants.CommonConstants; +import org.apache.dubbo.common.extension.Activate; +import org.apache.dubbo.rpc.Invocation; +import org.apache.dubbo.rpc.Invoker; +import org.apache.dubbo.rpc.Result; +import org.apache.dubbo.rpc.RpcException; +import org.apache.dubbo.rpc.cluster.filter.ClusterFilter; + +/** + * 用于传递dubbo调用链路中的tag的过滤器 + * 必须实现ClusterFilter。不能通过扩展Filter的方式来进行流量的打标的原因是因为Dubbo的调用链中到Filter这里就已经完成了路由选址和负载均衡 + */ +@Activate(group = CommonConstants.CONSUMER) +public class DubboConsumerTagFilter implements ClusterFilter { + + @Override + public Result invoke(Invoker invoker, Invocation invocation) throws RpcException { + String tagValue = EnvContext.getDubboTag(); + // 设置到上下文中,在后续调用链路中传递 + if (StringUtils.isNotBlank(tagValue)) { + invocation.setAttachment(TagKeyConstants.TAG_KEY, tagValue); + } + + // 继续执行 + return invoker.invoke(invocation); + } +} diff --git a/src/main/java/com/deepinnet/tag/filter/DubboProviderTagFilter.java b/src/main/java/com/deepinnet/tag/filter/DubboProviderTagFilter.java new file mode 100644 index 0000000..a31576f --- /dev/null +++ b/src/main/java/com/deepinnet/tag/filter/DubboProviderTagFilter.java @@ -0,0 +1,28 @@ +package com.deepinnet.tag.filter; + + +import com.deepinnet.tag.EnvContext; +import com.deepinnet.tag.constants.TagKeyConstants; +import org.apache.commons.lang3.StringUtils; +import org.apache.dubbo.common.constants.CommonConstants; +import org.apache.dubbo.common.extension.Activate; +import org.apache.dubbo.rpc.*; + +/** + * 用于传递dubbo调用链路中的tag的过滤器 + * 必须实现ClusterFilter。不能通过扩展Filter的方式来进行流量的打标的原因是因为Dubbo的调用链中到Filter这里就已经完成了路由选址和负载均衡 + */ +@Activate(group = CommonConstants.PROVIDER) +public class DubboProviderTagFilter implements Filter { + + @Override + public Result invoke(Invoker invoker, Invocation invocation) throws RpcException { + String tagValue = invocation.getAttachment(TagKeyConstants.TAG_KEY); + if (StringUtils.isNotBlank(tagValue)) { + EnvContext.setDubboTag(tagValue); + } + + // 继续执行 + return invoker.invoke(invocation); + } +} diff --git a/src/main/java/com/deepinnet/tag/filter/RestTagFilter.java b/src/main/java/com/deepinnet/tag/filter/RestTagFilter.java new file mode 100644 index 0000000..4e053ae --- /dev/null +++ b/src/main/java/com/deepinnet/tag/filter/RestTagFilter.java @@ -0,0 +1,50 @@ +package com.deepinnet.tag.filter; + +import com.deepinnet.tag.EnvContext; +import com.deepinnet.tag.constants.TagKeyConstants; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.springframework.web.context.request.RequestAttributes; +import org.springframework.web.context.request.RequestContextHolder; + +import javax.servlet.*; +import javax.servlet.http.HttpServletRequest; +import java.io.IOException; + +/** + * tag的rest请求过滤器,将tag从请求头中取出,放入EnvContext中 + */ +@Slf4j +public class RestTagFilter implements Filter { + + @Override + public void init(FilterConfig filterConfig) throws ServletException { + Filter.super.init(filterConfig); + log.info("Web 过滤器:restTagFilter 初始化"); + } + + @Override + public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { + try { + HttpServletRequest request = (HttpServletRequest) servletRequest; + String tagValue = request.getHeader(TagKeyConstants.TAG_KEY); + if (StringUtils.isNotBlank(tagValue)) { + RequestAttributes requestAttributes = RequestContextHolder.currentRequestAttributes(); + requestAttributes.setAttribute(TagKeyConstants.TAG_KEY, tagValue, RequestAttributes.SCOPE_REQUEST); + RequestContextHolder.setRequestAttributes(requestAttributes, true); + // 设置tag + EnvContext.setDubboTag(tagValue); + } + + filterChain.doFilter(servletRequest, servletResponse); + } finally { + EnvContext.remove(); + } + } + + @Override + public void destroy() { + Filter.super.destroy(); + log.info("Web 过滤器:restTagFilter 销毁"); + } +} \ No newline at end of file diff --git a/src/main/resources/META-INF/dubbo/internal/org.apache.dubbo.rpc.Filter b/src/main/resources/META-INF/dubbo/internal/org.apache.dubbo.rpc.Filter new file mode 100644 index 0000000..99fba83 --- /dev/null +++ b/src/main/resources/META-INF/dubbo/internal/org.apache.dubbo.rpc.Filter @@ -0,0 +1 @@ +dubboProviderTagFilter=com.deepinnet.tag.filter.DubboProviderTagFilter \ No newline at end of file diff --git a/src/main/resources/META-INF/dubbo/internal/org.apache.dubbo.rpc.cluster.filter.ClusterFilter b/src/main/resources/META-INF/dubbo/internal/org.apache.dubbo.rpc.cluster.filter.ClusterFilter new file mode 100644 index 0000000..ccb8f55 --- /dev/null +++ b/src/main/resources/META-INF/dubbo/internal/org.apache.dubbo.rpc.cluster.filter.ClusterFilter @@ -0,0 +1 @@ +dubboConsumerTagFilter=com.deepinnet.tag.filter.DubboConsumerTagFilter \ No newline at end of file diff --git a/src/main/resources/META-INF/spring.factories b/src/main/resources/META-INF/spring.factories new file mode 100644 index 0000000..5b7edee --- /dev/null +++ b/src/main/resources/META-INF/spring.factories @@ -0,0 +1 @@ +org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.deepinnet.tag.filter.RestTagFilter \ No newline at end of file