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

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

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: 5000parameters.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 机制携带到对端进行验签,验签通过才进行业务逻辑处理。如下图所示

相关文章:

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

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

计算机视觉与深度学习 | PSO-MVMD粒子群算法优化多元变分模态分解(Matlab完整代码和数据)

以下是一个基于PSO优化多元变分模态分解(MVMD)的Matlab示例代码框架,包含模拟数据生成和分解结果可视化。用户可根据实际需求调整参数。 %% 主程序:PSO优化MVMD参数 clc; clear; close all;% 生成模拟多变量信号 fs = 1000; % 采样频率 t = 0:1/fs:...

搭建自己的语音对话系统:开源 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;正在掀起一场智能电机控制的技术革命。 爆款基…...

vue2 中的过滤器以及vue3中的替换方案

在 Vue 2 中&#xff0c;过滤器&#xff08;filters&#xff09; 是一种非常实用的语法糖&#xff0c;用于在模板中对数据进行格式化输出处理。我们来深入理解过滤器的原理、使用方式、最佳实践以及其局限性。 vue2 &#x1f9e0; 本质是什么&#xff1f; Vue 2 的过滤器是一…...

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

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

瑞萨单片机笔记

1.CS for CC map文件中显示变量地址 Link Option->List->Output Symbol information 2.FDL库函数 pfdl_status_t R_FDL_Write(pfdl_u16 index, __near pfdl_u08* buffer, pfdl_u16 bytecount) pfdl_status_t R_FDL_Read(pfdl_u16 index, __near pfdl_u08* buffer, pfdl_…...

300. 最长递增子序列【 力扣(LeetCode) 】

文章目录 零、原题链接一、题目描述二、测试用例三、解题思路3.1 动态规划3.2 贪心 二分 四、参考代码4.1 动态规划4.2 贪心 二分 零、原题链接 300. 最长递增子序列 一、题目描述 给你一个整数数组 nums &#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 码的检测与坐标轴…...

2024CCPC辽宁省赛 个人补题 ABCEGJL

Dashboard - 2024 CCPC Liaoning Provincial Contest - Codeforces 过题难度 B A J C L E G 铜奖 4 953 银奖 6 991 金奖 8 1664 B&#xff1a; 模拟题 // Code Start Here string s;cin >> s;reverse(all(s));cout << s << endl;A&#xff1a;很…...

#6 百日计划第六天 java全栈学习

今天学的啥 上午 算法byd图论 图遍历dfs bfs 没学懂呵呵 找到两个良心up 图码 labuladong 看算法还好 尚硅谷讲的太浅了 那你问我 下午呢 下午 java 看了会廖雪峰的教程 回顾基础 小林coding Java基础八股文 还有集合的八股文 有的不是很懂 今天把Java基础算是完…...

AOP的代理模式

AOP的代理模式 1. AOP的实现方式 Spring AOP 主要通过两种动态代理技术实现&#xff1a; JDK动态代理&#xff1a;基于接口的代理&#xff0c;要求目标类必须实现至少一个接口。通过反射机制在运行时生成代理类&#xff08;实现目标接口&#xff09;&#xff0c;并重写接口…...

解决leetcode第3548题.等和矩阵分割II

3548.等和矩阵分割II 难度&#xff1a;困难 问题描述&#xff1a; 给你一个由正整数组成的mxn矩阵grid。你的任务是判断是否可以通过一条水平或一条垂直分割线将矩阵分割成两部分&#xff0c;使得&#xff1a; 分割后形成的每个部分都是非空的。 两个部分中所有元素的和相…...

深入解析自然语言处理中的语言转换方法

在数字化浪潮席卷全球的今天&#xff0c;自然语言处理&#xff08;Natural Language Processing&#xff0c;NLP&#xff09;作为人工智能领域的核心技术之一&#xff0c;正深刻地改变着我们与机器交互的方式。其中&#xff0c;语言转换方法更是 NLP 的关键组成部分&#xff0c…...

redis 进行缓存实战-18

使用 Redis 进行缓存 Redis 通常被认为只是一个数据存储&#xff0c;但它的速度和内存中特性使其成为缓存的绝佳选择。缓存是一种技术&#xff0c;通过将经常访问的数据存储在快速的临时存储位置来提高应用程序性能。通过使用 Redis 作为缓存&#xff0c;您可以显著减少主数据…...

JFace中MVC的表的单元格编辑功能的实现

一、实现流程 在JFace中实现MVC模式的表格编辑功能通常需要以下步骤&#xff1a; 1、启用编辑模式&#xff1a; 调用TableVierer对象的setCellModifier()方法&#xff0c;设置一个ICellModifier对象&#xff0c;以便在表格中启用编辑模式。实现ICellModifier接口的canModify(…...

在 Excel xll 自动注册操作 中使用东方仙盟软件2————仙盟创梦IDE

// 获取当前工作表名称string sheetName (string)XlCall.Excel(XlCall.xlfGetDocument, 7);// 构造动态名称&#xff08;例如&#xff1a;Sheet1!MyNamedCell&#xff09;string fullName $"{sheetName}!MyNamedCell";// 获取引用并设置值var namedRange (ExcelRe…...

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…...

解决 MySQL 表结构修改中锁定异常的全链路实战指南:从表结构设计到版本调优

引言 在 MySQL 中执行ALTER TABLE修改表结构&#xff08;如新增字段、调整字段类型&#xff09;时&#xff0c;锁定异常是最常见的阻碍。无论是 5.7 的 “锁等待超时”、8.0 的 “MDL 锁阻塞”&#xff0c;还是高并发下的 “长事务死锁”&#xff0c;本质都是表结构修改需要获…...

动态规划应用场景 + 代表题目清单(模板加上套路加上题单)

1. 序列型DP&#xff08;Sequence DP&#xff09; ✅ 应用场景 单个或多个序列&#xff08;数组/字符串&#xff09;&#xff0c;求最优子结构。 常见问题&#xff1a;最长递增子序列、最长公共子序列、回文子序列。 &#x1f9e0; 套路总结 单序列&#xff1a;dp[i] max(…...

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

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

nvm版本管理下pnpm 安装失败问题解决

检查当前使用的 Node.js 是否由 nvm 管理 nvm current 应显示类似 18.16.0 这样的版本号&#xff0c;而不是 system。如果是 system&#xff0c;说明你正在使用系统中其他位置的 Node.js 而不是 nvm 管理的版本。 切换回 nvm 管理的版本 nvm use 18.16.0清除 npm 缓存和全局安装…...

C++高频面试考点 -- 智能指针

C高频面试考点 – 智能指针 C11中引入智能指针的概念&#xff0c;方便堆内存管理。这是因为使用普通指针&#xff0c;容易造成堆内存泄漏&#xff0c;二次释放&#xff0c;程序发生异常时内存泄漏等问题。 智能指针在C11版本之后提供&#xff0c;包含在头文件<memory>中…...

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;所以二者如果统一的话能稍微提高一点效率。 软件安装 需要安装的软…...

C# AutoMapper对象映射详解

引言 在现代软件开发中&#xff0c;特别是采用分层架构的应用程序&#xff0c;我们经常需要在不同的对象类型之间进行转换。例如&#xff0c;从数据库实体&#xff08;Entity&#xff09;转换为数据传输对象&#xff08;DTO&#xff09;&#xff0c;或者从视图模型&#xff08…...

Keil5 MDK LPC1768 RT-Thread KSZ8041NL uIP1.3.1实现UDP网络通讯(服务端接收并发数据)

作为服务端&#xff0c;嵌入式软件实现流程&#xff1a; [上位机A/B/C/...] ↓ UDP [uIP 协议栈接收] ↓ [udp_appcall()] |-> 复制数据 |-> 保存源IP/端口 |-> 推送到接收队列 …...

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

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