调用链路传递隐式参数

news/2025/3/24 15:40:31/

在不修改方法签名与参数定义的情况下,可以通过 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 {@DubboReferenceprivate GreetingsService greetingsService;@Overridepublic 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 {@Overridepublic String sayHello(String name) {// 读取客户端写入的数据String k1 = RpcContext.getServerAttachment().getAttachment("k1");System.out.println("k1:" + k1);// 服务端写RpcContext.getServerContext().setAttachment("k2", "v2");return "hello " + name;}
}

http://www.ppmy.cn/news/1582377.html

相关文章

收数据花式画图plt实战

目录 Python plt想把纵坐标化成对数形式代码 子图ax. 我又有ax scatter,又有ax plot,都要去对数 数字接近0,取对数没有定义,怎么办 创建数据 添加一个小的常数以避免对数未定义的问题 创建一个figure和一个子图ax 在子图a…

Java 大视界 -- Java 大数据在智能体育赛事直播数据分析与观众互动优化中的应用(142)

💖亲爱的朋友们,热烈欢迎来到 青云交的博客!能与诸位在此相逢,我倍感荣幸。在这飞速更迭的时代,我们都渴望一方心灵净土,而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识,也…

SAP SD学习笔记33 - 预詑品(寄售物料),预詑品引渡(KB),预詑品出库(KE)

上一章讲了Service品目。 SAP SD学习笔记32 - Service品目(服务产品)-CSDN博客 本章继续讲SAP SD的知识 - 预詑品(寄售物料)。 目录 1,预詑品概要 1-1,预詑品(寄售物料)的概念 1-2,预詑品的4种业务 1-3,受托品与…

【愚公系列】《高效使用DeepSeek》024-儿童教育

🌟【技术大咖愚公搬代码:全栈专家的成长之路,你关注的宝藏博主在这里!】🌟 📣开发者圈持续输出高质量干货的"愚公精神"践行者——全网百万开发者都在追更的顶级技术博主! 👉 江湖人称"愚公搬代码",用七年如一日的精神深耕技术领域,以"…

2维压缩感知SL0重构实现算法

压缩感知:2维压缩感知SL0重构算法,涉及两个测量矩阵,两个方向进行。 列表 SL0_2D_2/Lena.bmp , 66616 SL0_2D_2/SL0_2D.m , 778 SL0_2D_2/SL0_2D_Test.m , 601

前沿分享|处理LLM幻觉问题-CoN|笔记链:增强检索增强语言模型的鲁棒性

检索增强语言模型(RALMs)在大型语言模型的能力方面取得了重大进步,特别是在减少事实幻觉方面,这得益于外部知识来源的利用。 然而,检索到的信息的可靠性并不总是有保证。 检索到无关数据可能导致误导性回答&#xff…

Python模块化设计 ——函数调用

1.以下代码的输出结果是()。 def young(age): if 25 <=age<=30: print(“作为一个老师,你很年轻”) elif age <25: print(“作为一个老师,你太年轻了”) elif age>=60: print(“作为一个老师,你可以退休了”) else: print(“作为一个老师,你很有爱心”) young(42) …

在 Ubuntu 20.04 上重新启动网络

参考链接&#xff1a; 如何在 Ubuntu 22.04 上重新启动网络 执行以下两条命令&#xff0c;ok sudo nmcli networking off sudo nmcli networking on