dubbo微服务之间的隐式数据传递
409 字
2 分钟
dubbo微服务之间的隐式数据传递
利用dubbo的Attachment做隐式传递
在做全链路压测插件时,如何让流量标识在dubbo远程RPC调用时进行传递是一个需要解决的问题,就可以用dubbo的Attachment做隐式传递,服务A) —> (服务B —> )(服务C)等等.
-
上下文类
public class WormholeContextHolder {private static final InheritableThreadLocal<WormholeContext> wormholeContextThreadLocal = new InheritableThreadLocal<>();/*** 上下文流量标识*/public static final String WORMHOLE_REQUEST_MARK = "X-Wormhole-Header-Request";/*** @return com.hoolai.wormhole.core.context.WormholeContext* @description 获取上下文*/public static WormholeContext getContext() {return wormholeContextThreadLocal.get();}/*** @param key key* @return java.lang.String* @description 获取上下文中的属性*/public static String getProperty(String key) {WormholeContext wormholeContext = getContext();if (wormholeContext != null) {return wormholeContext.toString();}return null;}/*** @param context context* @description 设置上下文*/public static void setContext(WormholeContext context) {wormholeContextThreadLocal.set(context);}public static void setContext(String contextStr) {if (StringUtils.isNotEmpty(contextStr)) {setContext(new WormholeContext(contextStr));}}/*** @description 将上下文进行失效*/public static void invalidContext() {wormholeContextThreadLocal.remove();}} -
消费者
import org.apache.dubbo.common.constants.CommonConstants;import org.apache.dubbo.common.extension.Activate;import org.apache.dubbo.rpc.*;@Activate(group = CommonConstants.CONSUMER)public class ParamConsumerFilter implements Filter {@Overridepublic Result invoke(Invoker<?> invoker, Invocation invocation) throws RpcException {WormholeContext wormholeContext = WormholeContextHolder.getContext();if (wormholeContext != null) {RpcContext.getContext().setAttachment(WormholeContextHolder.WORMHOLE_REQUEST_MARK, wormholeContext.getWormholeValue());}return invoker.invoke(invocation);}} -
生产者
import org.apache.dubbo.common.constants.CommonConstants;import org.apache.dubbo.common.extension.Activate;import org.apache.dubbo.rpc.*;@Activate(group = CommonConstants.PROVIDER)public class ParamProviderFilter implements Filter {@Overridepublic Result invoke(Invoker<?> invoker, Invocation invocation) throws RpcException {String wormholeContext = RpcContext.getContext().getAttachment(WormholeContextHolder.WORMHOLE_REQUEST_MARK);if (StringUtils.isNotBlank(wormholeContext)) {RpcContext.getContext().setAttachment(WormholeContextHolder.WORMHOLE_REQUEST_MARK, wormholeContext);WormholeContextHolder.setContext(wormholeContext);}return invoker.invoke(invocation);}} -
过滤器的SPI配置
在资源文件夹下创建一个3层的文件夹
— dubbo — internal ,注意不要一块写中间加.分隔的形式,这样创建的是 META-INF.dubbo.internal,变成了一个文件夹.文件夹下创建一个名为
org.apache.dubbo.rpc.Filter的文件.配置这一块可以参考dubbo源码的过滤器部分文件内容如下,名称=类名
paramConsumerFilter=com.tianch.wormhole.component.dubbo.ParamConsumerFilterparamProviderFilter=com.tianch.wormhole.component.dubbo.ParamProviderFilter
文章分享
如果这篇文章对你有帮助,欢迎分享给更多人!
相关文章智能推荐
1
dubbo服务提供者无法捕捉自定义异常的问题解决
JavaDubbo服务调用过程中抛出的自定义异常捕获不到,总是抛出了一个RuntimeException包装了自定义异常,导致全局异常处理器捕捉不到自定义异常。
2
分布式锁详解:Redis与ZooKeeper实现原理与对比
Java详解分布式锁的三大核心要求与实现原理,手写set nx ex原子加锁、Lua原子释放锁,讲解Redisson看门狗自动续期、可重入,以及ZooKeeper临时顺序节点实现,最后对比Redis、ZooKeeper、数据库三种方案选型。
3
Java调用JS/TS与JS/TS调用Java完全指南
Java详解Java与JavaScript/TypeScript相互调用的各种方式:Nashorn、GraalJS脚本引擎调用JS函数与对象,TypeScript编译产物加载,JS中通过Java.type调用Java类、Java.extend继承接口,以及Bindings注入Java对象,附完整可运行代码与数据转换、性能注意事项。
4
布隆过滤器详解:原理、误判率与实战应用
中间件深入讲解布隆过滤器的原理:位数组+多个哈希函数如何实现O(k)判断,推导误判率公式与最优参数,对比Bitmap/HyperLogLog/Cuckoo Filter,手写Java实现并用Guava、Redis、Redisson实战缓存穿透防护、URL去重、黑名单拦截等场景。
5
Redis缓存穿透、缓存击穿、缓存雪崩的区别和解决方案
中间件深入剖析Redis缓存穿透、缓存击穿、缓存雪崩三者的区别与产生原因,并给出缓存空值、布隆过滤器、互斥锁、逻辑过期、过期时间随机化、多级缓存、高可用集群等解决方案,附Java代码示例。
随机文章随机推荐


