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

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

背景

在分布式系统中,服务之间的调用(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,将能够有效提升系统的开发效率和维护性。

相关文章:

  • 【Kubernetes知识点问答题】健康检查
  • 代码随想录打卡Day25
  • 远心镜头选型公式
  • windows C++-并行编程-将使用缩减变量的 OpenMP 循环转换为使用并发运行时
  • 71-java 导致线程上下文切换的原因
  • TensorRT-LLM高级用法
  • 2024 年高教社杯全国大学生数学建模竞赛 C 题 农作物的种植策略(详细思路+matlab代码+python代码+论文范例)
  • android系统源码12 修改默认桌面壁纸--SRO方式
  • ELK学习笔记(二)——使用K8S部署Kibana8.15.0
  • uniapp小程序下载缓存服务器上的图片
  • iPhone手机清理软件:照片清理功能全解析
  • Mysql数据库表结构迁移PostgreSQL
  • [论文笔记]Making Large Language Models A Better Foundation For Dense Retrieval
  • Nginx跨域运行案例:云台控制http请求,通过 http server 代理转发功能,实现跨域运行。(基于大华摄像头WEB无插件开发包)
  • Mac+Pycharm配置PyQt6教程
  • [微信小程序] 使用ES6特性Class后出现编译异常
  • Android 初级面试者拾遗(前台界面篇)之 Activity 和 Fragment
  • CSS 三角实现
  • JAVA并发编程--1.基础概念
  • Python代码面试必读 - Data Structures and Algorithms in Python
  • 闭包,sync使用细节
  • 翻译 | 老司机带你秒懂内存管理 - 第一部(共三部)
  • 讲清楚之javascript作用域
  • 我感觉这是史上最牛的防sql注入方法类
  • 学习使用ExpressJS 4.0中的新Router
  • - 转 Ext2.0 form使用实例
  • ​​​​​​​STM32通过SPI硬件读写W25Q64
  • ​ubuntu下安装kvm虚拟机
  • ‌JavaScript 数据类型转换
  • # Redis 入门到精通(九)-- 主从复制(1)
  • # 详解 JS 中的事件循环、宏/微任务、Primise对象、定时器函数,以及其在工作中的应用和注意事项
  • ### RabbitMQ五种工作模式:
  • $.ajax()参数及用法
  • (2)空速传感器
  • (C#)Windows Shell 外壳编程系列9 - QueryInfo 扩展提示
  • (C++)八皇后问题
  • (Java岗)秋招打卡!一本学历拿下美团、阿里、快手、米哈游offer
  • (php伪随机数生成)[GWCTF 2019]枯燥的抽奖
  • (附源码)计算机毕业设计SSM基于java的云顶博客系统
  • (论文阅读23/100)Hierarchical Convolutional Features for Visual Tracking
  • (三)docker:Dockerfile构建容器运行jar包
  • (原創) 未来三学期想要修的课 (日記)
  • .aanva
  • .NET CORE 3.1 集成JWT鉴权和授权2
  • .NET MVC、 WebAPI、 WebService【ws】、NVVM、WCF、Remoting
  • .Net Web窗口页属性
  • .NET 快速重构概要1
  • .net中应用SQL缓存(实例使用)
  • /bin/bash^M: bad interpreter: No such file or directory
  • @ComponentScan比较
  • @ModelAttribute 注解
  • @Query中countQuery的介绍
  • @RequestBody与@ResponseBody的使用
  • @Transactional 参数详解
  • [ SNOI 2013 ] Quare