Dubbo的filter按需加载

首页 编程分享 EXPERIENCE 正文

Mr_Qi 转载 编程分享 2018-08-08 00:10:14

简介 天之内 两个小伙伴问我关于filter的按需加载的机制 有必要这边记录一下 关于filter的说明 ...


背景

一天之内 两个小伙伴问我关于filter的按需加载的机制 有必要这边记录一下

关于filter的说明

dubbo源码系列之filter的前生

dubbo源码系列之filter的今世

分析

关于dubbo中Activate的注解中存在如下几个属性

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE, ElementType.METHOD})
public @interface Activate {
    /**
     * Group过滤条件。
     * <br />
     * 包含{@link ExtensionLoaderIdgetActivateExtension}的group参数给的值,则返回扩展。
     * <br />
     * 如没有Group设置,则不过滤。
     */
    String[] group() default {};
 
    /**
     * Key过滤条件。包含{@link ExtensionLoaderIdgetActivateExtension}的URL的参数Key中有,则返回扩展。
     * <p />
     * 示例:<br/>
     * 注解的值 <code>@Activate("cache,validatioin")</code>,
     * 则{@link ExtensionLoaderIdgetActivateExtension}的URL的参数有<code>cache</code>Key,或是<code>validatioin</code>则返回扩展。
     * <br/>
     * 如没有设置,则不过滤。
     */
    String[] value() default {};
 
    /**
     * 排序信息,可以不提供。
     */
    String[] before() default {};
 
    /**
     * 排序信息,可以不提供。
     */
    String[] after() default {};
 
    /**
     * 排序信息,可以不提供。
     */
    int order() default 0;
}

其中 before,after,order可以用来调整filter的顺序 

而group用来描述生效的side【provider,consumer】

public static final String  PROVIDER                           = "provider";
 
public static final String  CONSUMER                           = "consumer";

那么还剩下一个关键的属性value

private boolean isActive(Activate activate, URL url) {
    String[] keys = activate.value();
    if (keys == null || keys.length == 0) {
        return true;
    }
    for (String key : keys) {
        for (Map.Entry<String, String> entry : url.getParameters().entrySet()) {
            String k = entry.getKey();
            String v = entry.getValue();
            if ((k.equals(key) || k.endsWith("." + key))
                    && ConfigUtils.isNotEmpty(v)) {
                return true;
            }
        }
    }
    return false;
}

可以看出当value为空或者size为0那么此时isActive就返回true 也就是说filter将会生效。

那么当url中参数包含对应的value的值或者以.XXX【XXX为对应的参数值】也将生效

其他场景也就是isActivate返回false 将不会生效~

那么如何设置对应的filter的参数呢???

protected <T> ServiceBean<T> registerService(RegistryConfig registryConfig, ApplicationConfig applicationConfig, ProviderConfig providerConfig, ProtocolConfig protocolConfig, Dubbo dubbo, Class<T> interfaceClazz, T t) {
    ServiceBean<T> ref = new ServiceBean<>();
    ref.setInterface(interfaceClazz);
    ref.setRegistry(registryConfig);
    ref.setApplication(applicationConfig);
    ref.setProvider(providerConfig);
    ref.setRef(t);
    ref.setProtocol(protocolConfig);
    ref.setGroup(dubbo.getGroup());
    ref.setFilter("clientProvider");
    return ref;
}

filter可以增加参数了~

转载链接:https://my.oschina.net/qixiaobo025/blog/1929832


Tags:


本篇评论 —— 揽流光,涤眉霜,清露烈酒一口话苍茫。


    声明:参照站内规则,不文明言论将会删除,谢谢合作。


      最新评论




ABOUT ME

Blogger:袅袅牧童 | Arkin

Ido:PHP攻城狮

WeChat:nnmutong

Email:nnmutong@icloud.com

标签云