全部产品
云市场

自定义 Filter

更新时间:2020-02-18 16:40:49

自定义 Filter 类

继承 com.alipay.sofa.rpc.filter.Filter 类。

  1. package com.alipay.sofa.rpc.customfilter;
  2. import com.alipay.sofa.rpc.core.exception.SofaRpcException;
  3. import com.alipay.sofa.rpc.core.request.SofaRequest;
  4. import com.alipay.sofa.rpc.core.response.SofaResponse;
  5. import com.alipay.sofa.rpc.filter.Filter;
  6. import com.alipay.sofa.rpc.filter.FilterInvoker;
  7. import com.alipay.sofa.rpc.log.Logger;
  8. import com.alipay.sofa.rpc.log.LoggerFactory;
  9. public class CustomEchoFilter extends Filter {
  10. /**
  11. * Logger for CustomEchoFilter
  12. **/
  13. private static final Logger LOGGER = LoggerFactory.getLogger(CustomEchoFilter.class);
  14. @Override
  15. public boolean needToLoad(FilterInvoker invoker) {
  16. // 判断一些条件,自己决定是否加载这个 Filter
  17. return true;
  18. }
  19. @Override
  20. public SofaResponse invoke(FilterInvoker invoker, SofaRequest request) throws SofaRpcException {
  21. // 调用前打印请求
  22. LOGGER.info("echo request : {}, {}", request.getInterfaceName() + "." + request.getMethod(),
  23. request.getMethodArgs());
  24. // 继续调用
  25. SofaResponse response = invoker.invoke(request);
  26. // 调用后打印返回值
  27. if (response == null) {
  28. return response;
  29. } else if (response.isError()) {
  30. LOGGER.info("server rpc error: {}", response.getErrorMsg());
  31. } else {
  32. Object ret = response.getAppResponse();
  33. if (ret instanceof Throwable) {
  34. LOGGER.error("server biz error: {}", (Throwable) ret);
  35. } else {
  36. LOGGER.info("echo response : {}", response.getAppResponse());
  37. }
  38. }
  39. return response;
  40. }
  41. }

配置对单个服务发布者(消费者)生效的 Filter

  1. <!-- 配置一个自定义 Filter -->
  2. <bean id="customEchoFilter" class="com.alipay.sofa.rpc.customfilter.CustomEchoFilter"/>
  3. <property name="filed1" value="xxxx" /> <!-- 假如有一些自己的字段赋值 -->
  4. </bean>
  5. <bean id="xxServiceImpl" class="com.alipay.xxx.XXServiceImpl" />
  6. <!-- 配置这个服务发布者的 Filter,支持配置多个,彼此以逗号分开 -->
  7. <sofa:service id="xxServiceExport" ref="xxServiceImpl" interface="com.alipay.xxx.XXService">
  8. <sofa:binding.bolt>
  9. <sofa:global-attrs filter="customEchoFilter"/> <!-- 设置到这里 -->
  10. </sofa:binding.bolt>
  11. </sofa:service>
  12. <!-- 配置这个服务引用者的 Filter,支持配置多个,彼此以逗号分开 -->
  13. <sofa:reference id="xxServiceRef" interface="com.alipay.xxx.XXService">
  14. <sofa:binding.bolt>
  15. <sofa:global-attrs filter="customEchoFilter"/> <!-- 设置到这里 -->
  16. </sofa:binding.bolt>
  17. </sofa:reference>

全局 Filter

全局 Filter 的 XML 配置方式和非全局 Filter 配置相似,示例如下:

  1. <!-- 方式一:配置一个自定义 Filter -->
  2. <bean id="customEchoFilter" class="com.alipay.sofa.rpc.customfilter.CustomEchoFilter">
  3. <property name="filed1" value="xxxx" /> <!-- 假如有一些自己的字段赋值 -->
  4. </bean>
  5. <!-- 方式二:标记这个 Filter 为全局 Filter -->
  6. <sofa:rpc-global-filter ref="customEchoFilter" />
  7. <!-- 方式三:标记这个 Filter 为全局 Filter -->
  8. <sofa:rpc-global-filter class="com.alipay.sofa.rpc.customfilter.CustomEchoFilter" />
  9. <!-- 无需任何配置 -->
  10. <sofa:service ... />
  11. <!-- 无需任何配置 -->
  12. <sofa:reference ... />