網(wǎng)站首頁(yè) 編程語(yǔ)言 正文
詳解如何自定義Dubbo Filter(含dubbo2.7.X及以上版本和2.6.X及以下版本兩種寫(xiě)法)
作者:禿禿愛(ài)健身 更新時(shí)間: 2022-06-06 編程語(yǔ)言一、前言
前一段時(shí)間做了一個(gè)日志審計(jì)模塊,其中會(huì)對(duì)HTTP調(diào)用、Dubbo接口之前做鏈路追蹤,針對(duì)HTTP調(diào)用Dubbo接口、Dubbo接口中調(diào)用Dubbo接口的場(chǎng)景采用自定義Dubbo Filter(Provider/Consumer)的方式傳遞鏈路入口信息、操作用戶、鏈路ID。其中牽扯到Dubbo RpcContext的使用,對(duì)著RpcContext以及遇到的坑,在下一篇文章中討論;
二、自定義Filter
官方文檔:https://dubbo.apache.org/zh/docsv2.7/dev/impls/filter/。
我們注意到在https://mvnrepository.com/artifact/org.apache.dubbo/dubbo中,org.apache.dubbo
組織下的dubbo版本最低只有2.7.0
;
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo</artifactId>
<version>2.7.0</version>
</dependency>
那么dubbo2.7.0以下的版本呢?在mvnrepository
中搜索dubbo,我們可以看到還存在一個(gè)com.alibaba
組織下的dubbo;
細(xì)想一下,dubbo最開(kāi)始是沒(méi)開(kāi)源的;看來(lái)dubbo2.7.0之下的版本應(yīng)該依賴(lài)都在com.alibaba
組織下:
誰(shuí)閑著沒(méi)事還會(huì)去看老版本呢?巧了老項(xiàng)目用dubbo2.6.X、dubbo2.5.X都太正常了;
博主就遇到了,業(yè)務(wù)方引入我的日志審計(jì)SDK說(shuō),說(shuō)用不了;博主作為一個(gè)新程序員,學(xué)的基本都是新版本、新技術(shù),也只有通過(guò)老項(xiàng)目才會(huì)去了解老版本;在此總結(jié)一下。
1、最新版本自定義Filter(dubbo2.7.X及以上版本)
1)實(shí)現(xiàn)Filter
package com.saint.dubbo;
import lombok.extern.slf4j.Slf4j;
import org.apache.dubbo.common.constants.CommonConstants;
import org.apache.dubbo.common.extension.Activate;
import org.apache.dubbo.rpc.*;
/**
* @author Saint
*/
@Slf4j
@Activate(group = {CommonConstants.PROVIDER})
public class DubboProviderFilter implements Filter {
@Override
public Result invoke(Invoker<?> invoker, Invocation invocation) throws RpcException {
// 服務(wù)端從dubbo上下文中取出traceContext信息
String jsonStr = null;
......
return invoker.invoke(invocation);
}
}
2)Filter實(shí)現(xiàn)類(lèi)映射到Spring容器
在resources
目錄下增加META-INF/dubbo/org.apache.dubbo.rpc.Filter
文件;
內(nèi)容如下:
providerFilter=com.saint.dubbo.DubboProviderFilter
其中:
- providerFilter 為將要在dubbo配置文件或yml文件中配置的Filter名,想寫(xiě)啥寫(xiě)啥;
-
com.saint.dubbo.DubboProviderFilter
為我們自定義的Filter類(lèi);
假如我要寫(xiě)多個(gè)自定義的Filter呢?官方這里并沒(méi)有說(shuō),很多博文也沒(méi)說(shuō);其實(shí)再加一行就行。
providerFilter=com.saint.dubbo.DubboProviderFilter
consumerFilter=com.saint.dubbo.DubboConsumerFilter
3)Filter實(shí)現(xiàn)類(lèi)關(guān)聯(lián)到Dubbo Consumer / Provider
這里有兩種方式(推薦使用第二種):
1> 在dubbo的xml配置文件中添加如下配置:
<dubbo:provider filter="providerFilter" />
<dubbo:consumer filter="consumerFilter" />
2> 在property/yaml配置文件中的添加如下配置:
dubbo:
consumer:
filter: consumerFilter
provider:
filter: providerFilter
如果針對(duì)一個(gè)consumer或provider有多個(gè)filter呢?以英文,隔開(kāi)即可;
dubbo:
consumer:
filter: consumerFilter,userConsumerFilter
provider:
filter: providerFilter
2、未開(kāi)源前的版本自定義Filter(dubbo2.6.X及以下版本)
Dubbo2.6.X及以下版本
與 Dubbo2.7.X及以上版本
在代碼實(shí)現(xiàn)上的唯一區(qū)別點(diǎn)在于實(shí)現(xiàn)Filter的方式;Filter實(shí)現(xiàn)類(lèi)映射到Spring容器的方式 和 Filter實(shí)現(xiàn)類(lèi)關(guān)聯(lián)到Dubbo Consumer / Provider的方式均一樣。
1)實(shí)現(xiàn)Filter
package com.saint.dubbo;
import lombok.extern.slf4j.Slf4j;
import com.alibaba.dubbo.common.Constants;
import com.alibaba.dubbo.common.extension.Activate;
import com.alibaba.dubbo.rpc.*;
/**
* @author Saint
*/
@Slf4j
@Activate(group = {Constants.CONSUMER})
public class DubboProviderFilter implements Filter {
@Override
public Result invoke(Invoker<?> invoker, Invocation invocation) throws RpcException {
// 服務(wù)端從dubbo上下文中取出traceContext信息
String jsonStr = null;
......
return invoker.invoke(invocation);
}
}
這里和2.7.X及以上版本的區(qū)別如下:
- 主要是引的包不一樣;
Dubbo2.6.X及以下版本
使用的是com.alibaba.dubbo
包,而Dubbo2.7.X及以上版本
使用的是org.apache.dubbo
包; - 其次,指定@Activate的group屬性時(shí),常量類(lèi)不一樣;
Dubbo2.6.X及以下版本
使用Constants
常量類(lèi),Dubbo2.7.X及以上版本
使用CommonConstants
接口;
如下操作和Dubbo2.7.X一毛一樣!!!
2)Filter實(shí)現(xiàn)類(lèi)映射到Spring容器
在resources
目錄下增加META-INF/dubbo/org.apache.dubbo.rpc.Filter
文件;
內(nèi)容如下:
providerFilter=com.saint.dubbo.DubboProviderFilter
其中:
- providerFilter 為將要在dubbo配置文件或yml文件中配置的Filter名,想寫(xiě)啥寫(xiě)啥;
-
com.saint.dubbo.DubboProviderFilter
為我們自定義的Filter類(lèi);
假如我要寫(xiě)多個(gè)自定義的Filter呢?官方這里并沒(méi)有說(shuō),很多博文也沒(méi)說(shuō);其實(shí)再加一行就行。
providerFilter=com.saint.dubbo.DubboProviderFilter
consumerFilter=com.saint.dubbo.DubboConsumerFilter
3)Filter實(shí)現(xiàn)類(lèi)關(guān)聯(lián)到Dubbo Consumer / Provider
這里有兩種方式(推薦使用第二種):
1> 在dubbo的xml配置文件中添加如下配置:
<dubbo:provider filter="providerFilter" />
<dubbo:consumer filter="consumerFilter" />
2> 在property/yaml配置文件中的添加如下配置:
dubbo:
consumer:
filter: consumerFilter
provider:
filter: providerFilter
如果針對(duì)一個(gè)consumer或provider有多個(gè)filter呢?以英文,隔開(kāi)即可;
dubbo:
consumer:
filter: consumerFilter,userConsumerFilter
provider:
filter: providerFilter
三、總結(jié)
dubbo之所以有兩種實(shí)現(xiàn)方式的根本原因,在于2018年2月份dubbo開(kāi)源(阿里捐獻(xiàn)給了Apache)后group由com.alibaba
變?yōu)榱?code>org.apache;此外還有一些代碼上的優(yōu)化:比如 Dubbo2.6.X及以下版本常量采用Class類(lèi)的靜態(tài)常量維護(hù),而Dubbo2.7.X及以上版本常量采用Interface接口中維護(hù)常量。
希望這邊文章對(duì)同樣維護(hù)老項(xiàng)目的兄弟有所幫助。
原文鏈接:https://blog.csdn.net/Saintmm/article/details/124046257
相關(guān)推薦
- 2023-11-23 pyside6打開(kāi)文件夾路徑或選擇文件的方式分享
- 2022-06-21 C語(yǔ)言字符串函數(shù)與內(nèi)存函數(shù)精講_C 語(yǔ)言
- 2022-05-25 Flutter實(shí)現(xiàn)倒計(jì)時(shí)功能_Android
- 2022-04-02 jquery實(shí)現(xiàn)邊框特效_jquery
- 2022-07-13 Python中常用序列數(shù)據(jù)結(jié)構(gòu)
- 2022-06-18 Elasticsearches通過(guò)坐標(biāo)位置實(shí)現(xiàn)對(duì)附近人的搜索_其它綜合
- 2022-06-13 docker容器的四種端口映射演示分析_docker
- 2022-04-15 使用python測(cè)試prometheus的實(shí)現(xiàn)_python
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲(chǔ)小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過(guò)濾器
- Spring Security概述快速入門(mén)
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯(cuò)誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡(jiǎn)單動(dòng)態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對(duì)象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支