自定义过滤器
优质
小牛编辑
136浏览
2023-12-01
SOFARPC 提供了一套良好的可扩展性机制,为各个模块提供 SPI 的能力。 SOFARPC 对请求与响应的过滤链处理方式是通过多个过滤器 Filter 来进行具体的拦截处理,该部分可由用户自定义 Filter 扩展,自定义 Filter 的执行顺序在内置 Filter 之后。具体方式如下:
Bolt Filter
新建自定义 Filter 。
public class CustomFilter extends Filter { @Override public boolean needToLoad(FilterInvoker invoker) { return true; } @Override public SofaResponse invoke(FilterInvoker invoker, SofaRequest request) throws SofaRpcException { SofaResponse response = invoker.invoke(request); return response; } }
生效该自定义 Filter 到拦截器链中。这一步具体方式有三种。 方式1:API方式。该种方式能够生效到指定的 provider 或 consumer 。
// 服务提供者 providerConfig.setFilterRef(Arrays.asList(new CustomFilter())); // 服务调用者 consumerConfig.setFilterRef(Arrays.asList(new CustomFilter()));
方式2:在类上加上 @Extension 注解+配置扩展文件方式。
@Extension("customer") public class CustomFilter extends Filter { @Override public boolean needToLoad(FilterInvoker invoker) { return true; } @Override public SofaResponse invoke(FilterInvoker invoker, SofaRequest request) throws SofaRpcException { SofaResponse response = invoker.invoke(request); return response; } }
新建扩展文件 META-INF/services/sofa-rpc/com.alipay.sofa.rpc.filter.Filter 。内容如下:
customer=com.alipay.sofa.rpc.custom.CustomFilter
编码注入。
// 服务提供者 providerConfig.setFilter(Arrays.asList("customer")); // 服务调用者 consumerConfig.setFilter(Arrays.asList("customer"));
方式三:在类上加上 @Extension 注解+ @AutoActive 注解方式+配扩展文件方式。该种方式利用 @AutoActive 注解代替了上述第二中方式的编码注入步骤,能够生效于所有 provider 或 consumer 。其中 providerSide 参数表示是否生效于服务端, consumerSide 参数表示是否生效于客户端。
@Extension("customer") @AutoActive(providerSide = true, consumerSide = true) public class customerFilter extends Filter { // ... }