高性能RPC框架--Dubbo(五)

news2025/5/25 1:08:36

Filter:

filter过滤器动态拦截请求(request)或响应(response)以转换或使用请求或响应中包含的信息。同时对于filter过滤器不仅适合消费端而且还适合服务提供端。我们可以自定义在什么情况下去使用filter过滤器


@Activate(group = PROVIDER)
public class AccessLogFilter implements Filter {}

如上述代码就明确的定义了filter类所使用的场景

Activate注解则表示在哪种场景下去使用filter,Activate注解的属性有group,value ,order来更加精细的控制激活条件

dubbo:
  consumer:
    filter: "-accesslog,-tps"

@DubboReference(filter="-accesslog,-tps")
private DemoService demoService;

可以全局关闭加载filter,也可以精确到某个服务中不加载filter,当参数改为accesslog,tps的时候则表示的是可以全局自动使用filter,所有 rpc 调用均启用 filter

Filter定义:

public interface BaseFilter {
    /**
     * Always call invoker.invoke() in the implementation to hand over the request to the next filter node.
     */
    Result invoke(Invoker<?> invoker, Invocation invocation) throws RpcException;

    /**
     * This callback listener applies to both synchronous and asynchronous calls, please put logics that need to be executed
     * on return of rpc result in onResponse or onError respectively based on it is normal return or exception return.
     * <p>
     * There's something that needs to pay attention on legacy synchronous style filer refactor, the thing is, try to move logics
     * previously defined in the 'finally block' to both onResponse and onError.
     */
    interface Listener {

        /**
         * This method will only be called on successful remote rpc execution, that means, the service in on remote received
         * the request and the result (normal or exceptional) returned successfully.
         */
        void onResponse(Result appResponse, Invoker<?> invoker, Invocation invocation);

        /**
         * This method will be called on detection of framework exceptions, for example, TimeoutException, NetworkException
         * Exception raised in Filters, etc.
         */
        void onError(Throwable t, Invoker<?> invoker, Invocation invocation);
    }
}

基于以上 BaseFilter 定义,Dubbo 定义了两个 SPI 接口:ClusterFilter 与 Filter。这两个 SPI 实现能实现的效果基本是一致的,之所以定义两个主要是出于性能优化考虑,建议用户关注 Filter SPI 即可,仅在有严苛性能需求的情况下(如集群 provider 提供者实例数量庞大)才关注 ClusterFilter。ClusterFilter相比Filter提前作用

超时时间:

对于RPC调用可能对方服务已经出现问题了如果调用方一直等待就会造成资源的浪费(比如占用大量的线程池等)所以我们可以设置超时时间这样当超过这个时间之后就会自动释放此次调用

//全局
dubbo:
  provider:
    timeout: 5000

//指定服务消费端
@DubboReference(timeout=5000)
private DemoService demoService;

//指定服务提供端
@DubboService(timeout=5000)
public class DemoServiceImpl implements DemoService{}


//指定方法消费端
@DubboReference(methods = {@Method(name = "sayHello", timeout = 5000)})
private DemoService demoService;

//指定方法服务端
@DubboService(methods = {@Method(name = "sayHello", timeout = 5000)})
public class DemoServiceImpl implements DemoService{}

优先级:

  1. 方法级消费端配置(最高)
  2. 服务级消费端配置
  3. 方法级提供端配置
  4. 服务级提供端配置
  5. 全局默认配置(最低)

Deadline 机制

在多级调用的时候假如服务A调用服务B出现了超时那么A就会自动返回超时方案,那么此时如果服务B还在等待服务C的返回就会造成资源的浪费,特别是服务C后续如果还有调用端

因此Dubbo中采用了deadline机制,通过在调用链路中传递 deadline(deadline初始值等于超时时间,随着时间流逝而减少)可以确保调用链路只在有效期内执行,deadline 消耗殆尽之后,调用链路中其他尚未执行的任务将被取消。相当于A的超时时间辐射到整个调用链路中

默认情况下deadline是关闭的

//全局
dubbo:
  provider:
    timeout: 5000
    parameters.enable-timeout-countdown: true


//服务
@DubboReference(timeout=5000, parameters={"enable-timeout-countdown", "true"})
private DemoService demoService;

传递隐式参数:

当我们想要传递与业务无关的参数的时候可以通过 RpcContext 上的 setAttachment 和 getAttachment 在服务消费方和提供方之间进行参数的隐式传递。

隐式参数传递支持以下两个方向:

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

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

  • 对于 triple 协议,attachment 会转换为标准的 http header 进行传输。
  • 对于 dubbo 协议,attachment 是编码在协议体的固定位置进行传输。

Dubbo 中的 RpcContext 是一个 ThreadLocal 的临时状态记录器,当接收到 RPC 请求,或发起 RPC 请求时,RpcContext 的状态都会变化。比如:A 调 B,B 调 C,则 B 机器上,在 B 调 C 之前,RpcContext 记录的是 A 和 B 的信息,在 B 调 C 之后,RpcContext 记录的是 B 和 C 的信息。

//消费端
RpcContext.getClientAttachment().setAttachment("index", "1"); // 隐式传参,后面的远程调用都会隐式将这些参数发送到服务器端,类似cookie,比如用于框架集成
xxxService.xxx(); // 远程调用
// ...

//服务端
xxxService.xxx(); // 远程调用
String result = RpcContext.getServerContext().getAttachment("result");
// ...




public class XxxServiceImpl implements XxxService {

    public void xxx() {
        // 获取客户端隐式传入的参数,比如用于框架集成
        String index = RpcContext.getServerAttachment().getAttachment("index");
    }
}

请注意!setAttachment 设置的 KV 对,在完成下面一次远程调用会被清空,即多次远程调用要多次设置!这一点与 Dubbo2 中的行为是不一致的!

比如,对于 Dubbo2 而言,在 A 端设置的参数,调用 B 以后,如果 B 继续调用了 C,原来在 A 中设置的参数也会被带到 C 端过去(造成参数污染的问题)。对于 Dubbo3,B 调用 C 时的上下文是干净的,不会包含最开始在 A 中设置的参数。

安全策略:

权限控制:

通过令牌验证在注册中心控制权限,以决定要不要下发令牌给消费者, 可以防止消费者绕过注册中心访问提供者, 另外通过注册中心可灵活改变授权方式,而不需修改或升级提供者

<!--随机token令牌,使用UUID生成-->
<dubbo:provider token="true" />

<!--固定token令牌,相当于密码-->
<dubbo:provider token="123456" />



<!--随机token令牌,使用UUID生成-->
<dubbo:service interface="com.foo.BarService" token="true" />


<!--固定token令牌,相当于密码-->
<dubbo:service interface="com.foo.BarService" token="123456" />

服务鉴权:

类似支付之类的对安全性敏感的业务可能会有限制匿名调用的需求。在加固安全性方面,2.7.5 引入了基于 AK/SK 机制的认证鉴权机制,并且引入了鉴权服务中心,主要原理是消费端在请求需要鉴权的服务时,会通过 SK、请求元数据、时间戳、参数等信息来生成对应的请求签名,通过 Dubbo 的 Attahcment 机制携带到对端进行验签,验签通过才进行业务逻辑处理。如下图所示

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

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

相关文章

搭建自己的语音对话系统:开源 S2S 流水线深度解析与实战

网罗开发 &#xff08;小红书、快手、视频号同名&#xff09; 大家好&#xff0c;我是 展菲&#xff0c;目前在上市企业从事人工智能项目研发管理工作&#xff0c;平时热衷于分享各种编程领域的软硬技能知识以及前沿技术&#xff0c;包括iOS、前端、Harmony OS、Java、Python等…

feign调用指定服务ip端口

1 背景 在springcloud开发时候&#xff0c;同时修改了feign接口和调用方的代码&#xff0c;希望直接在某个环境调用修改的代码&#xff0c;而线上的服务又不希望被下线因为需要继续为其他访问页面的用户提供功能后端服务&#xff0c;有时候甚者包含你正在修改的功能。 2 修改…

【深尚想!爱普特APT32F1023H8S6单片机重构智能电机控制新标杆】

在智能家电与健康器械市场爆发的今天&#xff0c;核心驱动技术正成为产品突围的关键。传统电机控制方案面临集成度低、开发周期长、性能瓶颈三大痛点&#xff0c;而爱普特电子带来的APT32F1023H8S6单片机无感三合一方案&#xff0c;正在掀起一场智能电机控制的技术革命。 爆款基…

Unity EventCenter 消息中心的设计与实现

在开发过程中&#xff0c;想要传递信号和数据&#xff0c;就得在不同模块之间实现通信。直接通过单例调用虽然简单&#xff0c;但会导致代码高度耦合&#xff0c;难以维护。消息中心提供了一种松耦合的通信方式&#xff1a;发布者不需要知道谁接收事件&#xff0c;接收者不需要…

MySQL远程连接10060错误:防火墙端口设置指南

问题描述&#xff1a; 如果你通过本机服务器远程连接MySQL&#xff0c;出现10060错误&#xff0c;那可能是你的防火墙的问题 解决&#xff1a; 第一步&#xff1a;查看防火墙规则 通过以下命令查询&#xff0c;看ports是否开放了3306端口&#xff0c;目前只开放了22端口 f…

使用 OpenCV 实现 ArUco 码识别与坐标轴绘制

&#x1f3af; 使用 OpenCV 实现 ArUco 码识别与坐标轴绘制&#xff08;含Python源码&#xff09; Aruco 是一种广泛用于机器人、增强现实&#xff08;AR&#xff09;和相机标定的方形标记系统。本文将带你一步一步使用 Python OpenCV 实现图像中多个 ArUco 码的检测与坐标轴…

canal实现mysql数据同步

目录 1、canal下载 2、mysql同步用户创建和授权 3、canal admin安装和启动 4、canal server安装和启动 5、java 端集成监听canal 同步的mysql数据 6、java tcp同步只是其中一种方式&#xff0c;还可以通过kafka、rabbitmq等方式进行数据同步 1、canal下载 canal实现mysq…

易境通专线散拼系统:全方位支持多种专线物流业务!

在全球化电商快速发展的今天&#xff0c;跨境电商物流已成为电商运营中极为重要的环节。为了确保物流效率、降低运输成本&#xff0c;越来越多的电商卖家选择专线物流服务。专线物流作为五大主要跨境电商物流模式之一&#xff0c;通过固定的运输路线和流程&#xff0c;极大提高…

06 如何定义方法,掌握有参无参,有无返回值,调用数组作为参数的方法,方法的重载

1.调用方法 2.掌握有参函数 3.调用数组作为参数 一个例题&#xff1a;数组参数&#xff0c;返回值 方法的重载 两个例题&#xff1a;冒泡排序和九九乘法表的格式学习

使用vscode MSVC CMake进行C++开发和Debug

使用vscode MSVC CMake进行C开发和Debug 前言软件安装安装插件构建debuug方案一debug方案二其他 前言 一般情况下我都是使用visual studio来进行c开发的&#xff0c;但是由于python用的是vscode&#xff0c;所以二者如果统一的话能稍微提高一点效率。 软件安装 需要安装的软…

提升开发运维效率:原力棱镜游戏公司的 Amazon Q Developer CLI 实践

引言 在当今快速发展的云计算环境中&#xff0c;游戏开发者面临着新的挑战和机遇。为了提升开发效率&#xff0c;需要更智能的工具来辅助工作流程。Amazon Q Developer CLI 作为亚马逊云科技推出的生成式 AI 助手&#xff0c;为开发者提供了一种新的方式来与云服务交互。 Ama…

@Column 注解属性详解

提示&#xff1a;文章旨在说明 Column 注解属性如何在日常开发中使用&#xff0c;数据库类型为 MySql&#xff0c;其他类型数据库可能存在偏差&#xff0c;需要注意。 文章目录 一、name 方法二、unique 方法三、nullable 方法四、insertable 方法五、updatable 方法六、column…

基于 ESP32 与 AWS 全托管服务的 IoT 架构:MQTT + WebSocket 实现设备-云-APP 高效互联

目录 一、总体架构图 二、设备端(ESP32)低功耗设计(适配 AWS IoT) 1.MQTT 设置(ESP32 连接 AWS IoT Core) 2.低功耗策略总结(ESP32) 三、云端架构(基于 AWS Serverless + IoT Core) 1.AWS IoT Core 接入 2.云端 → APP:WebSocket 推送方案 流程: 3.数据存…

unity在urp管线中插入事件

由于在urp下&#xff0c;打包后传统的相机事件有些无法正确执行&#xff0c;这时候我们需要在urp管线中的特定时机进行处理一些事件&#xff0c;需要创建继承ScriptableRenderPass和ScriptableRendererFeature的脚本&#xff0c;示例如下&#xff1a; PluginEventPass&#xf…

docker安装es连接kibana并安装分词器

使用Docker部署Elasticsearch、Kibana并安装分词器有以下主要优点&#xff1a; 1. 快速部署与一致性 一键式部署&#xff1a;通过Docker Compose可以快速搭建完整的ELK栈环境 环境一致性&#xff1a;确保开发、测试和生产环境完全一致&#xff0c;避免"在我机器上能运行…

线性回归中涉及的数学基础

线性回归中涉及的数学基础 本文详细地说明了线性回归中涉及到的主要的数学基础。 如果数学基础很扎实可以直接空降博文: 线性回归&#xff08;一&#xff09;-CSDN博客 一、概率、似然与概率密度函数 1. 概率&#xff08;Probability&#xff09; 定义&#xff1a;概率是描述…

如何计算VLLM本地部署Qwen3-4B的GPU最小配置应该是多少?多人并发访问本地大模型的GPU配置应该怎么分配?

本文一定要阅读我上篇文章&#xff01;&#xff01;&#xff01; 超详细VLLM框架部署qwen3-4B加混合推理探索&#xff01;&#xff01;&#xff01;-CSDN博客 本文是基于上篇文章遗留下的问题进行说明的。 一、本文解决的问题 问题1&#xff1a;我明明只部署了qwen3-4B的模型…

Attu下载 Mac版与Win版

通过Git地址下载 Mac 版选择对于的架构进行安装 其中遇到了安装不成功&#xff0c;文件损坏等问题 一般是两种情况导致 1.安装版本不对 2.系统权限限制 https://www.cnblogs.com/similar/p/11280162.html打开terminal执行以下命令 sudo spctl --master-disable安装包Git下载地…

V2X协议|如何做到“车联万物”?【无线通信小百科】

1、什么是V2X V2X&#xff08;Vehicle-to-Everything&#xff09;即“车联万物”&#xff0c;是一项使车辆能够与周围环境实现实时通信的前沿技术。它允许车辆与其他交通参与者和基础设施进行信息交互。通过V2X&#xff0c;车辆不仅具备“远程感知”能力&#xff0c;还能在更大…

[测试_3] 生命周期 | Bug级别 | 测试流程 | 思考

目录 一、软件测试的生命周期&#xff08;重点&#xff09; 1、软件测试 & 软件开发生命周期 &#xff08;1&#xff09;需求分析 &#xff08;2&#xff09;测试计划 &#xff08;3&#xff09;测试设计与开发 &#xff08;4&#xff09;测试执行 &#xff08;5&am…