SOFARPC 提供了一套良好的可扩展性机制,为各个模块提供 SPI 的能力。 SOFARPC 对请求与响应的过滤链处理方式是通过多个过滤器 Filter 来进行具体的拦截处理,该部分可由用户自定义 Filter 扩展,自定义 Filter 的执行顺序在内置 Filter 之后。具体方式如下:

Bolt Filter

  • 新建自定义 Filter 。
  1. public class CustomFilter extends Filter {
  2. @Override
  3. public boolean needToLoad(FilterInvoker invoker) {
  4. return true;
  5. }
  6. @Override
  7. public SofaResponse invoke(FilterInvoker invoker, SofaRequest request) throws SofaRpcException {
  8. SofaResponse response = invoker.invoke(request);
  9. return response;
  10. }
  11. }
  • 生效该自定义 Filter 到拦截器链中。这一步具体方式有三种。方式1:API方式。该种方式能够生效到指定的 provider 或 consumer 。
  1. // 服务提供者
  2. providerConfig.setFilterRef(Arrays.asList(new CustomFilter()));
  3. // 服务调用者
  4. consumerConfig.setFilterRef(Arrays.asList(new CustomFilter()));

方式2:在类上加上 @Extension 注解+配置扩展文件方式。

  1. @Extension("customer")
  2. public class CustomFilter extends Filter {
  3. @Override
  4. public boolean needToLoad(FilterInvoker invoker) {
  5. return true;
  6. }
  7. @Override
  8. public SofaResponse invoke(FilterInvoker invoker, SofaRequest request) throws SofaRpcException {
  9. SofaResponse response = invoker.invoke(request);
  10. return response;
  11. }
  12. }

新建扩展文件 META-INF/services/sofa-rpc/com.alipay.sofa.rpc.filter.Filter 。内容如下:

  1. customer=com.alipay.sofa.rpc.custom.CustomFilter

编码注入。

  1. // 服务提供者
  2. providerConfig.setFilter(Arrays.asList("customer"));
  3. // 服务调用者
  4. consumerConfig.setFilter(Arrays.asList("customer"));

方式三:在类上加上 @Extension 注解+ @AutoActive 注解方式+配扩展文件方式。该种方式利用 @AutoActive 注解代替了上述第二中方式的编码注入步骤,能够生效于所有 provider 或 consumer 。其中 providerSide 参数表示是否生效于服务端, consumerSide 参数表示是否生效于客户端。

  1. @Extension("customer")
  2. @AutoActive(providerSide = true, consumerSide = true)
  3. public class customerFilter extends Filter {
  4. // ...
  5. }