Dorado 自定义过滤器

优质
小牛编辑
131浏览
2023-12-01
  • Dorado支持在Client或Server端创建自定义的过滤器并指定过滤器的优先级生成过滤器链路。
  • Dorado支持全局生效的Filter和单个配置生效的Filter,具体使用方式见下面说明。

1.过滤器接口定义

package com.meituan.dorado.rpc.handler.filter;
/**
 * 过滤器接口, 可自行实现
 * 
 * 全局生效Filter,通过SPI配置
 * 
 * 局部生效Filter,通过config配置
 * 
 * 注意:同一个Filter重复添加无效, 只执行一次
 */
@SPI
public interface Filter extends Role {
​
    RpcResult filter(RpcInvocation invocation, FilterHandler nextHandler) throws Throwable;
​
    /**
     * 值越大 优先级越高, 接口调用最先执行
     */
    int getPriority();
}

2.自定义过滤器

public class AccessLogFilter implements Filter {
    private final static Logger logger = LoggerFactory.getLogger(AccessLogFilter.class);
​
    @Override
    public RpcResult filter(RpcInvocation invocation, FilterHandler nextHandler) throws Throwable {
        // 1. (可选)接口调用前的逻辑
        logger.info("AccessLogFilter request({}.{})", invocation.getServiceInterface().getName(), invocation.getMethod().getName());
        // 2. 重点,执行下一个Filter或真实的调用
        RpcResult result = nextHandler.handle(invocation);
        // 3. (可选)接口调用后的逻辑
        logger.info("AccessLogFilter response({}.{})", invocation.getServiceInterface().getName(), invocation.getMethod().getName());
        return result;
    }
​
    @Override
    public int getPriority() {
        // 4. 设置优先级,值越大 优先级越高, 该Filter越先执行,强烈不建议设置为最大值
        return 0;
    }
​
    @Override
    public RpcRole getRole() {
        // 5. 决定是调用端还是服务端的Filter,此处是服务端
        return RpcRole.PROVIDER;
    }
}

3.配置说明

  • 支持全局生效和局部生效,但Filter不会重复添加,全局配置优先生效。根据你的Filter生效范围决定配置方式:

3.1 全局生效Filter

新建扩展文件 META-INF/services/com.meituan.dorado.rpc.handler.filter.Filter

## 你的过滤器实现
com.meituan.dorado.rpc.handler.filter.AccessLogFilter

3.2 针对生效Filter

  • 局部生效,即某一个ReferenceConfig或ProviderConfig配置了,只在该调用端或服务端实例中生效,其他实例不会添加该Filter,前提是没在全局配置

以调用端举例:(服务端同)

<bean id="clientProxy" class="com.meituan.dorado.config.service.spring.ReferenceBean" destroy-method="destroy">
  <!-- ...省略其他配置... -->
  <property name="filters">
    <list>
      <bean class="com.meituan.dorado.rpc.handler.filter.AccessLogFilter" />
    </list>
  </property>
</bean>