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 {
    @Override
    public 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 {
    @Override
    public 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.ParamConsumerFilter
    paramProviderFilter=com.tianch.wormhole.component.dubbo.ParamProviderFilter

文章分享

如果这篇文章对你有帮助,欢迎分享给更多人!

dubbo微服务之间的隐式数据传递
https://tianch.com.cn/posts/tutorials/dubbo-wei-fu-wu-zhi-jian-de-yin-shi-shu-ju-chuan-di/
作者
田小晖
发布于
2022-02-20
许可协议
CC BY-NC-SA 4.0
相关文章智能推荐
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代码示例。
随机文章随机推荐
Profile Image of the Author
田小晖
记录技术成长,分享运维与开发经验。
公告
分类
标签
站点统计
文章
115
分类
8
标签
35
总字数
216,150
运行时长
0 天
最后活动
0 天前
站点信息
构建平台
Cloudflare Pages
博客版本
Firefly v6.15.6
文章许可
CC BY-NC-SA 4.0