日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學(xué)無(wú)先后,達(dá)者為師

網(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;
請(qǐng)?zhí)砑訄D片描述
細(xì)想一下,dubbo最開(kāi)始是沒(méi)開(kāi)源的;看來(lái)dubbo2.7.0之下的版本應(yīng)該依賴(lài)都在com.alibaba組織下:
請(qǐng)?zhí)砑訄D片描述

誰(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接口;
    請(qǐng)?zhí)砑訄D片描述
    請(qǐng)?zhí)砑訄D片描述

如下操作和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

欄目分類(lèi)
最近更新