深入解析 Dubbo 的 attachments 机制及其应用场景

news2024/9/20 8:04:20

背景

在分布式系统中,服务之间的调用(RPC调用)是非常常见的。而在这种服务调用过程中,常常需要在不同服务之间传递一些上下文信息,比如用户身份信息、请求追踪ID、客户端IP等。Dubbo 提供的 attachments 机制,能够帮助开发者在 RPC 调用时隐式传递这些数据,而不需要修改接口方法签名。
在这里插入图片描述

通过分析架构图,我们可以看到,在服务调用链路中,使用 Dubbo 的 attachments 机制可以简化上下文信息的传递,并确保这些信息在整个链路中的透明传递。

什么是 Dubbo 的 attachments?

Dubbo 的 attachments 是一种隐式传参的机制,允许消费者和提供者之间传递一些额外的上下文信息。它类似于 HTTP 请求中的 Header,能够在不影响接口定义的情况下,将这些信息注入到调用链路中。

主要特点

  1. 隐式传参:无须更改方法参数列表,避免接口入侵。
  2. 透明传递:上下文信息可以在调用链路中的消费者和提供者之间自动传递。
  3. 动态扩展:可以方便地在调用链中添加或修改传递的信息。

架构设计

整个系统的架构流程如下:

  1. 前端请求:前端(例如 H5 页面)通过 HTTP 请求,将 userIduserName 等信息放入请求头中,发送给服务端。

  2. SpringMVC 拦截器:在服务端使用 SpringMVC 拦截器 (RpcContextInterceptor) 拦截请求,从 HTTP 请求头中提取上下文信息(例如 userIduserName),并将这些信息放入 ThreadLocal 中,供后续处理使用。

  3. Dubbo Consumer 端:当服务消费者发起 Dubbo 的 RPC 请求时,Dubbo 的 Filter 会拦截请求,从 ThreadLocal 中取出上下文信息,并将其设置到 Dubbo 的 attachments 中,类似于 HTTP 的 Header 机制。

  4. Dubbo Provider 端:在服务提供者端,Dubbo 的 Filter 会从 attachments 中提取上下文信息,并将这些信息存入 ThreadLocal,供后续业务逻辑使用。

  5. 透明传递:在 Provider 端的业务逻辑处理完后,若继续调用下游服务,同样可以使用 attachments 机制传递上下文信息,确保调用链路中的信息一致性。

关键技术点

  • ThreadLocal 与 TransmittableThreadLocalThreadLocal 在并发编程中用于保存每个线程独有的变量,而 TransmittableThreadLocal 可以在异步任务或线程池中传递上下文信息,确保父子线程之间的数据传递。

  • Dubbo 的 attachments 机制:通过 RpcContext.getContext().setAttachment() 来设置上下文信息,消费者和提供者之间的 RPC 调用过程中,这些信息可以透明地传递。

使用场景

1. 用户身份信息传递

在多层服务调用中,用户的身份信息需要贯穿整个调用链。例如,可以在前端 HTTP 请求中获取 userId,通过 Dubbo 的 attachments 机制将其传递到后端的每个服务中。

// Consumer 端
RpcContext.getContext().setAttachment("userId", "123456");

// Provider 端
String userId = RpcContext.getContext().getAttachment("userId");

2. 日志追踪

在分布式系统中,日志追踪是非常重要的,通过传递追踪ID,可以确保每个请求的日志可以完整记录整个调用链。可以在消费者端生成追踪ID,通过 attachments 传递到每个下游服务。

// Consumer 端
RpcContext.getContext().setAttachment("traceId", "abcdef123456");

// Provider 端
String traceId = RpcContext.getContext().getAttachment("traceId");

3. 客户端IP传递

在安全审计或用户行为分析中,可能需要传递客户端的 IP 地址。通过 attachments 机制,可以方便地将客户端 IP 地址从消费者传递到提供者端。

// Consumer 端
RpcContext.getContext().setAttachment("clientIp", "192.168.1.100");

// Provider 端
String clientIp = RpcContext.getContext().getAttachment("clientIp");

优势

  1. 解耦参数传递:无需将上下文信息作为显式的接口参数,减少了接口设计的复杂度。
  2. 透明传递:上下文信息能够自动传递,贯穿整个调用链,无需手动传递。
  3. 易扩展性:未来如果需要传递新的上下文信息,可以通过 attachments 轻松添加,而无需修改接口定义。

注意事项

虽然 Dubbo 的 attachments 机制非常实用,但在使用过程中也需要注意以下几点:

  1. 性能开销:虽然 attachments 提供了隐式传参的便利性,但过多或过大的 attachments 信息会增加网络传输的负担。因此需要尽量控制传递数据的大小。
  2. 上下文一致性:使用 ThreadLocal 时,需要注意线程间数据的传递和清理,尤其是在异步调用或并发场景下,避免数据混乱。
  3. 清理工作:每次 RPC 调用完成后,及时清理 RpcContext 中的数据,避免上下文污染或内存泄露。

总结

Dubbo 的 attachments 机制提供了一种非常灵活且非侵入的方式,用于在服务消费者和服务提供者之间传递上下文信息。通过这种机制,开发者可以在不修改接口参数的情况下,轻松地在调用链中传递用户身份、日志追踪ID、客户端IP等信息。

在分布式系统中,合理利用 Dubbo 的 attachments 机制,能够极大简化上下文信息的传递过程,并提高系统的扩展性和灵活性。

如果您正在开发复杂的分布式应用程序或微服务系统,充分理解并利用 Dubbo 的 attachments,将能够有效提升系统的开发效率和维护性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2113252.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SysML图例-洗衣机

DDD领域驱动设计批评文集>> 《软件方法》强化自测题集>> 《软件方法》各章合集>> 对于许多学习SysML和MBSE的同学来说,比较头痛的问题之一是: 各种各样的教程里给出的案例,图都是画好了的!如何从零开始用建模…

LTspice模拟CCM和DCM模式的BUCK电路实验及参数计算

关于BUCK电路的原理可以参考硬件工程师炼成之路写的《 手撕Buck!Buck公式推导过程》.实验内容是将12V~5V的Buck电路仿真,要求纹波电压小于15mv. CCM和DCM的区别: CCM:在一个开关周期内,电感电流从不会到0. DCM:在开关周期内,电感电流总会到0.…

缓存类型以及读写策略

缓存(Cache)是一种高效的数据存储技术,旨在提高数据访问速度。 它将频繁访问或最近使用的数据临时存储在更快速但较小的存储介质(如内存)中,以减少从较慢的存储设备(如硬盘或远程服务器&#x…

聊一聊大型网站稳定性建设思路

目录 架构阶段的稳定性建设项目 编码阶段的稳定性建设 测试阶段的稳定性建设 发布阶段的稳定性建设 运行阶段的稳定性建设项目 故障发生时的稳定性建设 网站稳定性的建设是一项综合的系统工程,就像人的健康一样,如果平时不注意健康饮食、不注意锻炼…

浙大数据结构:02-线性结构4 Pop Sequence

这道题我们采用数组来模拟堆栈和队列。 简单说一下大致思路,我们用栈来存1234.....,队列来存输入的一组数据,栈与队列进行匹配,相同就pop 机翻 1、条件准备 stk是栈,que是队列。 tt指向的是栈中下标,fr…

C++入门(05-2)从命令行执行C++编译器_GCC

文章目录 GCC编译器1. 下载MinGW-w64,安装(不推荐)2. 使用MSYS2安装MinGW-w64(推荐)2.1 安装MSYS22.2 初始化和更新2.3 安装MinGW-w64编译器2.3 在MSYS2 Shell中导航到代码目录2.4 使用 g 编译2.5 运行可执行文件 GCC编…

【Qt】qt发布Release版本,打包.exe可执行文件

前言:Qt编译的可执行程序,如果直接运行,会出现0xc000007b报错,或者“由于占不到Qt5Network.dll,无法继续执行代码。重新安装程序可能会解决此问题”的报错,因为缺少相关的依赖包和动态库。 1、第一步:找到…

仕考网:大三能考公务员吗?

本科生在大三阶段不具备报考资格,因为尚未完成学业并不是应届生。专科生在大三时则属于应届生,有资格参加公务员考试。 公务员报考条件包括: 1.国籍; 2.年龄于18至35周岁之间,对于当年毕业的硕士或博士研究生,年龄限…

Python: #!/usr/bin/python3 #!/usr/bin/env python3

只能放在第一行,第二行就没有效果了。 1. 路径不同 #!/usr/bin/python3&& #!/usr/bin/env python3写在脚本语言第一行的目的是 想要以什么可执行程序去运行这个文件中的代码。 #!/usr/bin/python3是告诉操作系统执行这个脚本的时候,调用/usr/bin…

Linux之ebpf(3)uprobe与ebpf

Linux之ebpf(3)uprobe简要使用 Author: Once Day Date: 2024年9月5日 一位热衷于Linux学习和开发的菜鸟,试图谱写一场冒险之旅,也许终点只是一场白日梦… 漫漫长路,有人对你微笑过嘛… 全系列文章可参考专栏: Linux基础知识_Once-Day的博客…

心脑血管科张景龙医生:冠状动脉狭窄的症状与检查方法

冠状动脉狭窄作为一种常见的心血管疾病,其症状的出现往往与心肌供血不足密切相关。了解这些症状以及如何进行准确的检查,对于及早发现、诊断和治疗冠状动脉狭窄至关重要。本文将详细介绍冠状动脉狭窄的常见症状及检查方法。 冠状动脉狭窄的常见症状 1、…

电路笔记 控制(PID):Proportional–integral–derivative controller 比例-积分-微分控制器与仿真

PID控制(Proportional-Integral-Derivative Control)是一种常用的反馈控制算法,广泛应用于自动控制系统中。PID控制器通过对比例、积分和微分三项的计算,生成控制输出来调节系统的行为,以使其达到期望的目标值。 PID控…

利用人类反馈优化文本摘要质量

人工智能咨询培训老师叶梓 转载标明出处 精准评估和提升模型生成文本的质量,尤其是自动文摘的质量,成为了一个日益突出的挑战。传统的评估方法,如ROUGE指标,虽然在一定程度上能够衡量摘要的相关性,但往往无法全面反映…

Java算法:最大间距

前言 在处理数据密集型应用时,提高查询性能显得尤为关键。 解决最大间隔问题——即确定一组数值中最宽的相邻元素距离——是此类任务中的一大挑战。 该问题不仅在算法竞赛中常见,也是软件工程师面试的一个焦点,解决方法多样,包…

【B题第三套完整论文已出】2024数模国赛B题第三套完整论文+可运行代码参考(无偿分享)

基于多阶段优化的电子产品质量控制与成本管理研究 摘要 随着现代制造业和智能化生产的发展,质量控制和生产优化问题成为工业管理中的重要研究课题。本文针对电子产品生产过程中质量控制和成本优化中的问题,基于系统优化和决策分析思想,通过…

【C++ Primer Plus习题】12.1

大家好,这里是国中之林! ❥前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站。有兴趣的可以点点进去看看← 问题: 解答: main.cpp #include <iostream> #include "Cow.h" u…

空气能热泵热水器

空气能热泵热水器压缩机把低温低压气态冷媒转换成高压高温气态&#xff0c;压缩机压缩功能转化的热量为q1&#xff0c;高温高压的气态冷媒与水进行热交换&#xff0c;高压的冷媒在常温下被冷却、冷凝为液态。这过程中&#xff0c;冷媒放出热量用来加热水&#xff0c;使水升温变…

机器学习数学公式推导之降维

文章目录 降维线性降维-主成分分析 PCA损失函数SVD 与 PCoASVD 的基本形式SVD 的计算p-PCA 小结 P22 (系列五) 降维1-背景 本文参考 B站UP: shuhuai008 &#x1f339;&#x1f339; 降维 我们知道&#xff0c;解决过拟合的问题除了正则化和添加数据之外&#xff0c;降维就是最…

数据链路层与ARP协议

一.认识识以太网 "以太网" 不是一种具体的网络, 而是一种技术标准; 既包含了数据链路层的内 容, 也包含了一些物理层的内容. 例如: 规定了网络拓扑结构, 访问控制方式, 传输速率等; 以太网中的网线必须使用双绞线; 传输速率有 10M, 100M, 1000M 等; 以太网是当前应用…

【最新华为OD机试E卷-支持在线评测】机器人活动区域(100分)多语言题解-(Python/C/JavaScript/Java/Cpp)

🍭 大家好这里是春秋招笔试突围 ,一枚热爱算法的程序员 ✨ 本系列打算持续跟新华为OD-E/D卷的三语言AC题解 💻 ACM金牌🏅️团队| 多次AK大厂笔试 | 编程一对一辅导 👏 感谢大家的订阅➕ 和 喜欢💗 🍿 最新华为OD机试D卷目录,全、新、准,题目覆盖率达 95% 以上,…