Dubbo服务调用扩展点Filter的介绍与使用

Dubbo源码解析:Dubbo过滤器 自定义Filter 我们先手动定义一个Filter,用来统计服务端每个接口的执行时间。 实现Filter接口 在resources/META-INF/dubbo文件夹下新建org.apache.dubbo.rpc.Filter文件 在org.apache.dubbo.rpc.Filter文件中写上Filter的路径 @Slf4j @Activate(group = PROVIDER) public class CostFilter implements Filter { @Override . 阅读详情

扩展点介绍

在这里插入图片描述
如上图所示,从服务调用的角度来看,Dubbo 在链路中提供了丰富的扩展点,覆盖了负载均衡方式、选址前后的拦截器、服务端处理拦截器等。 简单来说 Dubbo 发起远程调用的时候,主要工作流程可以分为消费端和服务端两个部分。

消费端的工作流程如下:

  • 通过 Stub 接收来自用户的请求,并且封装在 Invocation 对象中

  • 将 Invocation 对象传递给 ClusterFilter(扩展点)做选址前的请求预处理,如请求参数的转换、请求日志记录、限流等操作都是在此阶段进行的

  • 将 Invocation 对象传递给 Cluster(扩展点)进行集群调用逻辑的决策,如快速失败模式、安全失败模式等决策都是在此阶段进行的

    • Cluster 调用 Directory 获取所有可用的服务端地址信息
    • Directory 调用 StateRouter(扩展点,推荐使用) 和 Router(扩展点) 对服务端的地址信息进行路由筛选,此阶段主要是从全量的地址信息中筛选出本次调用允许调用到的目标,如基于打标的流量路由就是在此阶段进行的
    • Cluster 获得从 Directory 提供的可用服务端信息后,会调用 LoadBalance (扩展点)从多个地址中选择出一个本次调用的目标,如随机调用、轮询调用、一致性哈希等策略都是在此阶段进行的
    • Cluster 获得目标的 Invoker 以后将 Invocation 传递给对应的 Invoker,并等待返回结果,如果出现报错则执行对应的决策(如快速失败、安全失败等)
  • 经过上面的处理,得到了带有目标地址信息的 Invoker,会再调用 Filter(扩展点)进行选址后的请求处理(由于在消费端侧创建的 Filter 数量级和服务端地址量级一致,如无特殊需要建议使用 ClusterFilter 进行扩展拦截,以提高性能)

  • 最后 Invocation 会被通过网络发送给服务端
    服务端的工作流程如下:

  • 服务端通信层收到请求以后,会将请求传递给协议层构建出 Invocation

  • 将 Invocation 对象传递给 Filter (扩展点)做服务端请求的预处理,如服务端鉴权、日志记录、限流等操作都是在此阶段进行的

  • 将 Invocation 对象传递给动态代理做真实的服务端调用

介绍完扩展点后,下面以拦截扩展点为例介绍具体使用

拦截点

官方接口: org.apache.dubbo.rpc.Filter

@SPI(scope = ExtensionScope.MODULE)
public interface Filter extends BaseFilter {
}

在项目中实现该接口,自定义逻辑:

@Slf4j
@Activate(group = CommonConstants.CONSUMER)
public class ParamFilter implements Filter {
    @Override
    public Result invoke(Invoker<?> invoker, Invocation invocation) throws RpcException {
		// 这里可以获取到消费者请求的相关信息,如服务名、请求的方法名、以及请求的参数
		// 实际应用:做一些参数检查以及转换等等操作
        log.info("Service-Name: " + invocation.getServiceName() + " Method: " + invocation.getMethodName() + " Parameter: " + Arrays.toString(invocation.getArguments()));
        // 将请求发送给服务端
        return invoker.invoke(invocation);
    }
}

编写Filter的配置文件:
在这里插入图片描述

文件名:org.apache.dubbo.rpc.Filter
内容:

MyFilter=com.mxf.filter.ParamFilter

MyFilter: 是自定义Filter的一个别名,可以自定义
在application.yaml中配置该接口:

dubbo:
  application:
    name: shop-service-consumer
  protocol:
    name: dubbo
    port: -1
  registry:
    id: nacos-registry
    address: nacos://192.168.11.233:8848
  config-center:
    address: nacos://192.168.11.233:8848
  metadata-report:
    address: nacos://192.168.11.233:8848
  consumer:			  #在消费端的拦截扩展点
    filter: MyFilter  # 注意名称要和签名定义的一致

重启项目演示

可以使用Postman请求相关接口,就可以看到输出日志:

2022-11-23 11:39:36.463  INFO 8988 --- [nio-8082-exec-1] com.mxf.filter.ParamFilter               : Service-Name: com.mxf.service.ShopService Method: queryByName Parameter: [xiao]

在这里插入图片描述

可以看到在消费端自定义的拦截扩展点已经生效,可以获取到相关信息

Dubbo实现负载均衡的扩展

官方提供的接口:
在这里插入图片描述

  • RandomLoadBalance:随机策略的LB
  • RoundRobinLoadBalance:轮询策略的LB
  • LeastActiveLoadBalance:最少活跃调用数策略的LB:举例有两台服务器,一台正在处理的任务数很多也就是负载高,那么当前负载策略就会尽量少的给这台服务器分配任务;反之,如果一台服务器处理的任务数少,就尽量优先给它分配任务。
  • ConsistentHashLoadBalance:一致性Hash策略的LB:。一致性Hash,相同参数的请求总是发到同一提供者,当某一台提供者挂时,原本发往该提供者的请求,基于虚拟节点,平摊到其它提供者,不会引起剧烈变动。
  • ShortestResponseLoadBalance:最短响应优先策略的LB
    除了以上Dubbo提供的五种默认实现的负载均衡策略,也可以自定义负载均衡策略,只要实现Dubbo提供的LoadBalance接口,自定义实现select即可:
@SPI(RandomLoadBalance.NAME)
public interface LoadBalance {

    /**
     * select one invoker in list.
     *
     * @param invokers   invokers.
     * @param url        refer url
     * @param invocation invocation.
     * @return selected invoker.
     */
    @Adaptive("loadbalance")
    <T> Invoker<T> select(List<Invoker<T>> invokers, URL url, Invocation invocation) throws RpcException;

}

用法:以轮询策略为例
第一步编写配置文件:
在这里插入图片描述
文件名:org.apache.dubbo.rpc.cluster.LoadBalance

RRLB=org.apache.dubbo.rpc.cluster.loadbalance.RoundRobinLoadBalance

RRLB是自定义的负载均衡名称
在application.yaml中配置LB:

dubbo:
  consumer:	# 在消费端的LB
    loadbalance: RRLB

OK,到此配置完成,当启动多个服务提供者,用一个消费者去调用,就是采取轮询的策略均匀请求到服务提供者上
其余四种实现方式一样。

待更新

集群扩展
路由扩展

Hive数据迁移 【迁移背景】 本次需要将老集群的hive数据(共30多张表)迁移至新集群中。 老集群版本为CDH5.13,未启用kerberos; 新集群版本为CDH5.14,启用了kerberos。 由于cloudera官方文档说明,在5.x的版本不支持从未启用kerberos的集群与启用了kerberos的集群之间的数据复制。因此无法通过bdr方式进行数据同步。于是采用手工方式进行测试验证。 第一步... 阅读详情

相关推荐

SAP中常见的Debug方式

原文链接:https://mp.weixin.qq.com/s/wT4kThFKYV0PQYhCqpXRWg 大家可以关注我个人公众号,所有分享内容,会在公众号第一时间推送,且阅读排版更好。 愿大家的学习,轻松且愉快。 如果大家觉得有用,希望转发关注,谢谢 导读 SAP系统在企业的应用时,都不会只使用标准功能。 通常情况下,基于特殊的行业需求,以及某些业务部门的管理需求等,都会额外开发出一些增强,报表,对话功能,接口等,从而保证系统的正常运转。 标准知识的逻辑,我们...

Kerwin-G的博客 1万+

Dubbo接口中的Filter

如果是http请求的话,filter很容易就能写出来,现在项目全部换成dubbo接口,也想使用拦截器进行统一操作预处理,就需要用到dubbo里的filter。 自定义的filter需要去实现org.apache.dubbo.rpc.Filter接口,同时实现接口里边的invoke方法。 具体步骤如下 1.编写filter类,该类实现org.apache.dubbo.rpc.Filter接口以及接口的invoke方法。 @Slf4j public class DubboFilter implements Fi

weixin_45614626的博客 1794

winget安装提示:执行此命令时发生意外错误: InternetOpenUrl() failed. 0x80072efd

当我们使用Winget包管理器安装应用,提示错误:执行此命令时发生意外错误: InternetOpenUrl() failed. 0x80072efd 该怎么处理呢?请听我娓娓道来。

Linux I Tell U 8136

dubbo复习:(18)服务端Filter

用来在服务响应返回到客户端之前进行额外处理。三、配置文件中指定Filter。二、SPI注入Filter。一、定义Filter。

amadeus_liu2的博客 534

Playwright Java环境配置避坑指南:浏览器路径、类加载与离线部署

Playwright作为现代端到端测试框架,其Java SDK突破了传统Selenium的Driver管理模式,将Chromium/Firefox/WebKit内核视为可编程运行时资源。其核心原理在于SDK与浏览器二进制分离——Maven仅管理Java字节码,而浏览器需独立下载、校验与沙箱加载。这一设计带来显著技术价值:跨平台一致性、进程隔离安全性及多浏览器并行能力;典型应用场景涵盖Spring Boot集成测试、金融级离线CI/CD、Kubernetes容器化部署及Air-Gapped封闭环境。然而,因J

weixin_32956805的博客 675

OpenCV C++ 图像处理实战 ——《基于轮廓比对的缺陷检测》

本文使用OpenCV C++ 实现基于轮廓比对的缺陷检测。

Zero___Chen的博客 1144

dubbo org.apache.dubbo.rpc.Filter 不生效的原因

dubbo Filter 不生效

weixin_42554209的博客 1335

基于YOLOv5s的RK3588多线程部署16FPS暴涨到120FPS 轻量化深度学习部署实战教程(包括性能优化与加速)37

本文介绍了如何在RK3588平台上利用线程池优化YOLOv5模型的推理性能。RK3588内置3个NPU核心,支持多核并行处理。作者设计了一个线程池架构:1个线程负责数据读取,10个线程处理NPU运算,1个线程输出结果。该架构包含任务队列、线程管理和工作线程三个核心组件,通过合理设置线程数、任务队列大小等参数确保性能稳定。文章提供了详细的C++实现代码,包括线程池初始化、任务提交、结果获取等功能模块,并讨论了多线程同步和内存管理的关键技术要点。该方案可显著提升深度学习模型在嵌入式设备上的部署效率。

FJN110的博客 9225

Dubbo Filter用法详解

Filter是Dubbo中使用较为频繁的组件,其作用在于对所指定的请求进行过滤,功能非常类似于AOP,可以实现诸如请求过滤器和全局异常捕获器等组件。本文首先会讲解Filter的用法,然后会从源码的角度讲解其实现原理。 1. 用法示例 对于Filter的划分,根据其面向的对象不同,可以分为service端和consumer端;根据其所作用的范围的不同,则可以分为单个服务过滤器(单个service或reference)和全局过滤器(整个provider或consumer)。Filter的指定方式主要有三种:

m0_67393295的博客 2024

Temporal Noise Reduction(TNR)时序去噪技术解析:原理、平台实践与工程调优路径

随着高画质夜景拍照和高清视频拍摄需求的持续增长,图像传感器在低照度环境下输出信号的噪声问题日益突出。相比空间域降噪(SNR),时序去噪(Temporal Noise Reduction, TNR)利用帧间信息进行融合处理,具备更高的信噪比提升效率及更强的边缘保护能力,已成为移动影像ISP链路中的核心环节。本文系统剖析TNR的算法原理、平台实现机制与工程调试路径,并基于实际开发案例分析其在不同场景下的效果差异及调优方法,为工程师提供从理论到实操的完整路径参考。

努力分享一些人工智能、计算机视觉、影像等相关的知识干货! 3197

816华为OD机试真题 新系统 - 电池充电时间计算 (Java/Py/C/C++/Js/Go)

816华为OD机试真题 新系统 - 电池充电时间计算 (Java/Py/C/C++/Js/Go)

算法大师! 469

Dubbo服务调用扩展点学习及实践

Dubbo 拦截器扩展自定义实现

qq_42070135的博客 455

通过InoDriverShop伺服调试软件连接汇川SV660F系列伺服的具体方法示例

通过InoDriverShop伺服调试软件连接汇川SV660F系列伺服的具体方法示例

Robot_PLC_HMI_Automation 1万+

dubbo远程调用,拦截输出调用的入参和返回值(使用dubbo的Filter的方式) (二)

前面写了一篇博客dubbo中拦截返回值和参数(针对consumer端),那个是没有使用filter来实现的,现在使用dubbo官方的filter来实现,必之前的配置多点 先看官方文档的扩展介绍 官方介绍 ......... 调用拦截扩展 扩展说明 服务提供方和服务消费方调用过程拦截,Dubbo 本身的大多功能均基于此扩展点实现,每次远程方法执行,该拦截都会被执行,请注意对性能的影响...

你一个人,就不想到别处看看? ---- 我怕一转身连你也不见了...... 4175

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

Dubbo-SPI

定义:SPI(Service Provider Interface)是JDK内置的服务提供发现机制,用于动态替换和发现服务实现,实现模块解耦,使第三方服务装配逻辑与调用者业务代码分离。应用:被众多框架用于扩展点设计,如Dubbo中大量使用SPI实现协议、负载均衡等功能的定制化扩展。

qq_25863845的博客 428

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

dubbo Filter

官方说明: 调用拦截扩展 扩展说明 服务提供方和服务消费方调用过程拦截,Dubbo 本身的大多功能均基于此扩展点实现,每次远程方法执行,该拦截都会被执行,请注意对性能的影响。 约定: 用户自定义 filter 默认在内置 filter 之后。 特殊值default,表示缺省扩展点插入的位置。比如:filter="xxx,default,yyy",表示xxx在缺省 filter...

weixin_30345577的博客 94

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

Dubbo 源码分析17 Dubbo Filter机制

  代码@1:参数说明。   URL url:服务提供者或服务消费者url。   String key:过滤器属性key,服务提供者固定为:service.filter,服务消费者固定为reference.filter。   String group:服务提供者或服务消费者。   代码@2:从url中获取配置的自定义filter。   代码@3:如果value不为空,则将字符串调用...

郭传志的博客 227

Dubbo中SPI机制和拦截器

SPI SPI简介 SPI 全称为 (Service Provider Interface) ,是JDK内置的一种服务提供发现机制。 目前有不少框架用它来做服务的扩展发现,简单来说,它就是一种动态替换发现的机制。使用SPI机制的优势是实现解耦,使得第三方服务模块的装配控制逻辑与调用者的业务代码分离。 JDK中的SPI Java中如果想要使用SPI功能,先提供标准服务接口,然后再提供相关接口实现和调用者。这样就可以通过SPI机制中约定好的信息进行查询相应的接口实现。 SPI遵循如下约定: 1、当服务提供者

Kiven_ch的博客 3815

Dubbo学习(四)——SPI

温故而知新,可以为师矣 本文为拉钩教育java高薪培训班学习笔记与总结 1. SPI 1.1 SPI简介 SPI 全称为 (Service Provider Interface) ,是JDK内置的一种服务提供发现机制。 目前有不少框架用它 来做服务的扩展发现,简单来说,它就是一种动态替换发现的机制。使用SPI机制的优势是实现解耦, 使得第三方服务模块的装配控制逻辑与调用者的业务代码分离。 1.2 JDK中的SPI Java中如果想要使用SPI功能,先提供标准服务接口,然后再提供相关接口实现和

weixin_43922655的博客 193

Dubbo(54)如何实现Dubbo的安全认证?

首先,我们定义一个安全认证接口,并实现该接口。// 模拟一个token存储static {@Override在目录下创建一个名为通过以上步骤,我们成功地在Dubbo中实现了安全认证。定义安全认证接口和实现:定义一个安全认证接口,并实现该接口。实现Dubbo的认证Filter:实现一个Dubbo的Filter,用于在服务调用之前进行认证。配置Dubbo使用自定义Filter:在目录下创建配置文件,并添加自定义Filter的映射关系。在服务提供者和消费者中传递认证信息。

qq_43012298的博客 846

Dubbo——扩展点详解

扩展点整体架构 1. RPC层扩展点 按照完整的Dubbo结构分层,RPC层可以分为四层:Config、Proxy、Registry、Cluster。由于Config属于API范畴,因此只关注Proxy、Registry、Cluster三层的扩展点。 1.1 Proxy层扩展点 Proxy层主要的扩展接口是ProxyFactory。Dubbo中的ProxyFactory有两种默认实现:Javassist和JDK,用户可以自行扩展自己的实现,如CGLIB。Dubbo默认选择Javassist作为默认字节码生

吴声子夜歌的博客 3511

Dubbo扩展点注解之@Activate

@Activate称为自动激活扩展点注解,主要使用在有多个扩展点实现、需要同时根据不同条件被激活的场景中,如Filter需要多个同时激活,因为每个Filter实现的是不同的功能。 @Activate的参数 参数名 效果 String[] group() URL中的分组如果匹配则激活 String[] value() URL中如果包含该key值,则会激活 Strin...

学无止境 1万+

Dubbo Filter 过滤器(拦截器)的使用——dubbo.rpc.Filter

com.alibaba.dubbo.rpc.Filter简介 咱们先说说 “Filter”,顾名思义 过滤器,在我们平时的工作中也是一员猛将。 在之前的文章中我也介绍了在Spring中类似的HandlerInterceptor的使用方法。 com.alibaba.dubbo.rpc.Filter它换了个马甲,干的依然是守门(过滤器)的活儿,不过是跑去阿里上班了,在dubbo干起了守门保安,做事低调...

“实用”是软件压倒一切的要素 3万+

Dubbo之Filter链原理

本文来说下Dubbo的Filter链原理 文章目录概述 概述

wh柒八九的博客 1781

Dubbo学习记录(十六)--服务调用【二】 - Invoker的调用、ProxyFactory、Protocol、Filter,Exchanger, Transporter扩展点

我们只有一个结果,那就是胜利, 还有另外一个结果, 就是死亡, 死亡不属于工人阶级。

玄霄 1212

给dubbo接口添加白名单——dubbo Filter的使用

在开发中,有时候需要限制访问的权限,白名单就是一种方法。对于Java Web应用,Spring的拦截器可以拦截Web接口的调用;而对于dubbo接口,Spring的拦截器就不管用了。 dubbo提供了Filter扩展,可以通过自定义Filter来实现这个功能。本文通过一个事例来演示如何实现dubbo接口的IP白名单。 扩展Filter 实现com.alibaba.dubbo.rpc.

Coding a Life 6万+
上一篇: Dubbo3.0入门-Java版
下一篇: Nacos安装及入门
JavaWizard-M
博客等级 码龄6年 3159粉丝 148原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值