Dubbo Filter机制概述

exception=com.alibaba.dubbo.rpc.filter.ExceptionFilter

executelimit=com.alibaba.dubbo.rpc.filter.ExecuteLimitFilter

deprecated=com.alibaba.dubbo.rpc.filter.DeprecatedFilter

compatible=com.alibaba.dubbo.rpc.filter.CompatibleFilter

timeout=com.alibaba.dubbo.rpc.filter.TimeoutFilter

以其中一个来说明一下Filter的定义要素:

/**

  • EchoInvokerFilter

*/

@Activate(group = Constants.PROVIDER, order = -110000) // @2

public class EchoFilter implements Filter { // @1

@Override

public Result invoke(Invoker<?> invoker, Invocation inv) throws RpcException {

if (inv.getMethodName().equals(Constants.$ECHO) && inv.getArguments() != null && inv.getArguments().length == 1)

return new RpcResult(inv.getArguments()[0]);

return invoker.invoke(inv);

}

}

代码@1:实现com.alibaba.dubbo.rpc.Filter接口。

代码@2:添加Activate,其注解含义如下:

group: 所属组,String[],例如消费端、服务端。

value String[],如果指定该值,只有当消费者或服务提供者URL中包含属性名为value的键值对,该过滤器才处于激活状态。

before:String[],用于指定执行顺序,before指定的过滤器在该过滤器之前执行。

after:string[],用于指定执行顺序,after指定的过滤器在该过滤器之后执行。

order:用户指定顺序,值越小,越先执行。

除了支持默认的过滤器外,Dubbo还支持自定义Filter,可以通过service.filter指定过滤器,多个用英文逗号隔开,其配置方法为:

< dubbo:service …>

< dubbo:parameter key = “service.filter” value = “filter1,filer2,…”/>

< /dubbo:service>

当然,可以为所有服务提供者设置共用过滤器,其指定方法为:

< dubbo:provider …>

< dubbo:parameter key = “service.filter” value = “filter1,filer2,…”/>

< /dubbo:provider>

消费端自定义过滤器的key为reference.filter,其使用方法在< dubbo:reference/>标签或< dubbo:consumer/>标签下定义属性。

关于自定义Filter的解析代码如下:

ExtensionLoader#getActivateExtension

public List getActivateExtension(URL url, String key, String group) { // @1

String value = url.getParameter(key); // @2

return getActivateExtension(url, value == null || value.length() == 0 ? null : Constants.COMMA_SPLIT_PATTERN.split(value), group); // @3

}

代码@1:参数说明。

URL url:服务提供者或服务消费者url。

String key:过滤器属性key,服务提供者固定为:service.filter,服务消费者固定为reference.filter。

String group:服务提供者或服务消费者。

代码@2:从url中获取配置的自定义filter。

代码@3:如果value不为空,则将字符串调用split转换为数组,然后调用getActivateExtension方法,获取符合条件的过滤器。

ExtensionLoader#getActivateExtension

public List getActivateExtension(URL url, String[] values, String group) {

List exts = new ArrayList();

List names = values == null ? new ArrayList(0) : Arrays.asList(values);

if (!names.contains(Constants.REMOVE_VALUE_PREFIX + Constants.DEFAULT_KEY)) { // @1

getExtensionClasses(); // @2

for (Map.Entry<String, Activate> entry : cachedActivates.entrySet()) {

String name = entry.getKey();

Activate activate = entry.getValue();

if (isMatchGroup(group, activate.group())) { // @3

T ext = getExtension(name);

if (!names.contains(name)

&& !names.contains(Constants.REMOVE_VALUE_PREFIX + name) // @4

&& isActive(activate, url)) { // @5

exts.add(ext);

}

}

}

Collections.sort(exts, ActivateComparator.COMPARATOR);

}

List usrs = new ArrayList();

for (int i = 0; i < names.size(); i++) { // @6

《MySql面试专题》

全网火爆MySql 开源笔记,图文并茂易上手,阿里P8都说好

全网火爆MySql 开源笔记,图文并茂易上手,阿里P8都说好

《MySql性能优化的21个最佳实践》

全网火爆MySql 开源笔记,图文并茂易上手,阿里P8都说好

全网火爆MySql 开源笔记,图文并茂易上手,阿里P8都说好

全网火爆MySql 开源笔记,图文并茂易上手,阿里P8都说好

全网火爆MySql 开源笔记,图文并茂易上手,阿里P8都说好

《MySQL高级知识笔记》

全网火爆MySql 开源笔记,图文并茂易上手,阿里P8都说好

全网火爆MySql 开源笔记,图文并茂易上手,阿里P8都说好

全网火爆MySql 开源笔记,图文并茂易上手,阿里P8都说好

全网火爆MySql 开源笔记,图文并茂易上手,阿里P8都说好

全网火爆MySql 开源笔记,图文并茂易上手,阿里P8都说好

全网火爆MySql 开源笔记,图文并茂易上手,阿里P8都说好

全网火爆MySql 开源笔记,图文并茂易上手,阿里P8都说好

全网火爆MySql 开源笔记,图文并茂易上手,阿里P8都说好

全网火爆MySql 开源笔记,图文并茂易上手,阿里P8都说好

全网火爆MySql 开源笔记,图文并茂易上手,阿里P8都说好

文中展示的资料包括:**《MySql思维导图》《MySql核心笔记》《MySql调优笔记》《MySql面试专题》《MySql性能优化的21个最佳实践》《MySq高级知识笔记》**如下图

全网火爆MySql 开源笔记,图文并茂易上手,阿里P8都说好

关注我,点赞本文给更多有需要的人
14)]

[外链图片转存中…(img-F2IDSb9p-1719254209614)]

文中展示的资料包括:**《MySql思维导图》《MySql核心笔记》《MySql调优笔记》《MySql面试专题》《MySql性能优化的21个最佳实践》《MySq高级知识笔记》**如下图

[外链图片转存中…(img-RajfMItH-1719254209615)]

关注我,点赞本文给更多有需要的人

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值