当前位置: 首页 > news >正文

调用链路传递隐式参数

在不修改方法签名与参数定义的情况下,可以通过 RpcContext 上的 setAttachment 和 getAttachment 在服务消费方和提供方之间进行参数的隐式传递。
隐式参数传递支持以下两个方向:

  • 从消费方到提供方,也就是在请求发起时,在方法参数之外通过 attachment 传递附加参数。
  • 从提供方到消费方,也就是在响应结果返回时,在响应结果之外通过 attachment 传递附加参数。

理解隐式参数传递的最直接方式 http header,它的工作方式与 http header 完全一致,在 GET 或 POST 请求体之外可以传递任意多个 header 参数。
在实现原理上,对于不同的协议,attachment 的实现方式略有不同:

  • 对于 triple 协议,attachment 会转换为标准的 http header 进行传输。
  • 对于 dubbo 协议,attachment 是编码在协议体的固定位置进行传输,具体请参见 dubbo 协议规范。
    在这里插入图片描述

注意

  • 在使用 triple 协议时,由于 http header 的限制,仅支持小写的 ascii 字符
  • path, group, version, dubbo, token, timeout 一些 key 是保留字段,传递 attachment 时应避免使用,尽量通过业务前缀等确保 key 的唯一性。

RpcContext 被拆分为四大模块(ServerContext、ClientAttachment、ServerAttachment 和 ServiceContext)。

  • ServiceContext:在 Dubbo 内部使用,用于传递调用链路上的参数信息,如 invoker 对象等
  • ClientAttachment:在 Client 端使用,往 ClientAttachment 中写入的参数将被传递到 Server 端
  • ServerAttachment:在 Server 端使用,从 ServerAttachment 中读取的参数是从 Client 中传递过来的
  • ServerContext:在 Client 端和 Server 端使用,用于从 Server 端回传 Client 端使用,Server 端写入到 ServerContext 的参数在调用结束后可以在 Client 端的 ServerContext 获取到

客户端

@Component
public class RpcContextTask implements CommandLineRunner {
    @DubboReference
    private GreetingsService greetingsService;

    @Override
    public void run(String... args) throws Exception {
        // 客户端写
        RpcContext.getClientAttachment().setAttachment("k1", "v1");
        String k1 = greetingsService.sayHello("k1");
        System.out.println("K1----->>>" +k1);
        // 读取服务端写入的数据
        String k2 = RpcContext.getServerContext().getAttachment("k2");
        System.out.println("K2----->>>:" + k2);
    }
}

服务端

@DubboService
public class RpcContextGreetingsServiceImpl implements GreetingsService {

    @Override
    public String sayHello(String name) {
        // 读取客户端写入的数据
        String k1 = RpcContext.getServerAttachment().getAttachment("k1");
        System.out.println("k1:" + k1);
        // 服务端写
        RpcContext.getServerContext().setAttachment("k2", "v2");
        return "hello " + name;
    }
}

相关文章:

  • 连接chatgpt的桌面语音助手
  • AD(Altium Designer)更换PCB文件的器件封装
  • ObjC属性assign/retain/copy的区别?不同编程语言的属性?ObjC语言obj->name和obj.name的区别?类成员变量?
  • javabean类,测试类,工具类都是什么?
  • 树莓派5介绍与系统安装
  • OpenCV vs MediaPipe:哪种方案更适合实时手势识别?
  • ubuntu桌面图标异常——主目录下的所有文件(如文档、下载等)全部显示在桌面
  • 【MLP多层感知机】
  • c++怎么将输入的一行字符根据“,“分割成字符串数组或者整型数组
  • @WebFilter 注解
  • DeepSeek处理多模态数据的技术要点和实现方式
  • 在CentOS系统上运行Ruby on Rails应用的详细步骤
  • Linux安装JDK
  • JavaScript基础-DOM事件流
  • CSS学习笔记
  • MySQL 入门大全:数据类型
  • 题单:排队接水1
  • ORACLE RAC ASM双存储架构下存储部分LUN异常的处理
  • 基于springboot的电影院管理系统(源码+lw+部署文档+讲解),源码可白嫖!
  • 4-Taurus平台 LCD驱动支持DRM框架移植
  • 我国核电总体规模首次跃居世界第一,发电量持续增长
  • 以军称若停火谈判无进展,将大幅扩大加沙军事行动
  • 弘扬 “上海精神”,上合组织政党论坛聚焦政党责任与使命
  • 【社论】以“法治之盾”护航每一份创新
  • 两部门:推动“青年驿站”为毕业生跨地区求职提供住宿优惠便利
  • 最大规模的陈逸飞大展启幕:回望他,回望一个时代