目的

通过自定义filter,在dubbo接口被调用的时候,打印入参信息、请求接口名称和返回值信息,这样可以避免在每个接口中手动打印接口请求的入参等日志,实现统一打印日志的方式有多种,这里只是为了学习自定义filter,所以以这个为例

应用

要实现自定义filter,需要有以下几个步骤

1.自定义filter实现类

@Activate(group = "provider")
public class DubboProviderLogFilter implements Filter {@Overridepublic Result invoke(Invoker<?> invoker, Invocation invocation) throws RpcException {System.out.println("打印日志:interface:" + invoker.getInterface().getSimpleName() + ";methodName:" + invocation.getMethodName()+ ";argument:" + invocation.getArguments());Result result = invoker.invoke(invocation);System.out.println("打印返回结果");System.out.println(result != null ? result.getValue() : "返回结果为空");return result;}
}

2.配置filter

这里的目录不能错,并且必须是这种样子的

这里踩了一个坑,在启动的时候,一直提示

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'providers:dubbo:xxx': Error setting property values; nested exception is org.springframework.beans.PropertyBatchUpdateException; nested PropertyAccessExceptions (1) are:
PropertyAccessException 1: org.springframework.beans.MethodInvocationException: Property 'filter' threw exception; nested exception is java.lang.IllegalStateException: No such extension requestFilter for filter/com.alibaba.dubbo.rpc.Filterat org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:1650)at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1357)at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:582)at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:502)at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:312)at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:228)at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:310)at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:200)at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:760)at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:868)at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:549)at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:759)at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:395)at org.springframework.boot.SpringApplication.run(SpringApplication.java:327)at org.springframework.boot.SpringApplication.run(SpringApplication.java:1255)at org.springframework.boot.SpringApplication.run(SpringApplication.java:1243)at
Caused by: org.springframework.beans.PropertyBatchUpdateException: Failed properties: Property 'filter' threw exception; nested exception is java.lang.IllegalStateException: No such extension requestFilter for filter/com.alibaba.dubbo.rpc.Filterat org.springframework.beans.AbstractPropertyAccessor.setPropertyValues(AbstractPropertyAccessor.java:123)at org.springframework.beans.AbstractPropertyAccessor.setPropertyValues(AbstractPropertyAccessor.java:77)at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:1646)... 16 common frames omitted

这个报错,最后,根据 dubbo启动失败 这个同学的博客,才发现,原来是META-INF.dubbo.internal的目录有问题

dubbo指定了三个路径可以设置自定义filter,dubbo在启动的时候,会从这三个目录下去加载filter信息,分别是:

loadDirectory(extensionClasses, DUBBO_INTERNAL_DIRECTORY);
loadDirectory(extensionClasses, DUBBO_DIRECTORY);
loadDirectory(extensionClasses, SERVICES_DIRECTORY);private static final String SERVICES_DIRECTORY = "META-INF/services/";private static final String DUBBO_DIRECTORY = "META-INF/dubbo/";private static final String DUBBO_INTERNAL_DIRECTORY = DUBBO_DIRECTORY + "internal/";

3.使filter生效

有三种方式
1.上面自定义filter,在filter实现类添加@Activate(group = “provider"注解,并指定服务提供者还是消费者端生效
2.如果不设置该注解,可以在服务提供者的注解中设置filter属性

3.在xml配置文件中,统一设置filter
<dubbo:provider filter=”"/>或<dubbo:consumer filter=""/> 通过filter来配置要使用的filter,这种是针对所有的服务提供者或者服务消费者

4. 服务提供者代码

@Service(timeout = 3500)
public class ProviderServiceImpl implements ProviderService {@Overridepublic Order getOrderById(Integer orderId) {System.out.println("orderId是:" + orderId);Order order = new Order(1, "testOrderType", "testOrderName");return order;}
}

5.效果

打印日志:interface:ProviderService;methodName:getOrderById;argument:[Ljava.lang.Object;@47a504d4
orderId是:1
打印返回结果
Order{orderId=1, orderType='testOrderType', orderName='testOrderName'}

这样的话,就可以通过filter机制,在dubbo服务调用的时候,统一打印日志,无需在每次新增dubbo接口的时候,记录日志
同理,也可以自定义filter,统一对异常进行处理 等等

dubbo 自定义filter相关推荐

  1. dubbo 自定义过滤器,打印接口调用信息

    dubbo提供了web filter类似的com.alibaba.dubbo.rpc.Filter,这样,我们可以在dubbo提供的服务提供方和消费方都可以自定义过滤 器,从而可以获得方法调用的时间或 ...

  2. Spring Security 入门(四):自定义-Filter

    前文导读 - Spring Security入门(一):登录与退出 - Spring Security入门(二):基于数据库验证 - Spring Security入门(三):密码加密 本文解决问题 ...

  3. Dubbo自定义日志拦截器

    前言 上一篇文章 Spring aop+自定义注解统一记录用户行为日志 记录了 web层中通过自定义注解配合Spring aop自动记录用户行为日志的过程.那么按照分布式架构中Dubbo服务层的调用过 ...

  4. Dubbo之Filter链原理

    本文来说下Dubbo的Filter链原理 文章目录 概述 构造Filter链 Consumer ConsumerContextFilter ActiveLimitFilter FutureFilter ...

  5. Dubbo自定义日志拦截器 1

    前言 上一篇文章 Spring aop+自定义注解统一记录用户行为日志 记录了 web层中通过自定义注解配合Spring aop自动记录用户行为日志的过程.那么按照分布式架构中Dubbo服务层的调用过 ...

  6. dubbo 自定义路由_高性能可扩展分布式RPC框架Dubbo内核原理揭秘

    一.前言 整体来说,一个公司业务系统的演进流程基本都是从单体应用到多体应用.在单体应用时,不同业务模块相互调用直接在本地 JVM 进程内就可以完成;而变为多个应用时,相互之间进行通信的方式就不能简单的 ...

  7. 自定义Filter引起的 Failed to invoke the method 问题解决

    自定义Filter引起的 Failed to invoke the method 问题解决 一:问题的表现和最终结论 1 问题的表现: 2 最终结论: 二:解决过程详述 1 看日志 2 问题溯源 3 ...

  8. Dubbo使用Filter

    在项目中使用自定义的Dubbo过滤器 实现org.apache.dubbo.rpc.Filter接口可以自定义Filter实现类,并添加@Active注解(等同于xml配置)使filter可以被扫描到 ...

  9. 聊聊dubbo的Filter

    序 本文主要研究一下dubbo的Filter Filter dubbo-2.7.2/dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc ...

  10. 【SpringBoot】SpringBoot拦截器实战和 Servlet3.0自定义Filter、Listener

    =================6.SpringBoot拦截器实战和 Servlet3.0自定义Filter.Listener ============ 1.深入SpringBoot2.x过滤器Fi ...

最新文章

  1. 一作解读Microbiome:所谓的“富集培养”获得的微生物真的都是被“富集”出来的吗?
  2. 【经典书】图论,322页pdf
  3. 二维数组的查找 java_二维数组中的查找
  4. Chrome 浏览器扩展 - Dark Web - Dark Theme for Chrome
  5. 三星 P600 android,顶级硬件S pen笔手写—三星P600_三星 Galaxy Note 10.1 2014 Edition P600_平板电脑市场-中关村在线...
  6. HDOJ-1014 Uniform Generator
  7. 基于JAVA+SpringBoot+Mybatis+MYSQL的疾病报销管理系统
  8. html在线快递单号打印,HTML 快递打印模板
  9. navicat循环执行上下两行相减sql语句_十步完全理解SQL,小白也可以做到!
  10. 自学编程、玩 vlog,90 后程序员们的冠军之路
  11. [转载]Mapx常见问题
  12. 登录业务的演变、单点登录(SSO)的三种解决方案
  13. 微信小程序公农历转换的实现
  14. 【项目管理】人力资源管理之四:双因素理论和期望理论
  15. iOS开发中有关图片裁切的问题
  16. python知识:装饰器@property有啥用途?
  17. Ubuntu下 百度在线语音合成使用
  18. 房子装修真的好累~~
  19. 浙江单招单考计算机类本科学校,浙江单考单招能报考哪些大学
  20. angular 自定义组件的双向数据绑定

热门文章

  1. linux命令hexdump,Linux中hexdump命令起什么作用呢?
  2. 谷歌浏览器禁止右滑返回历史_早报:拼多多加大百亿补贴力度;嫦娥五号择机返回地球;贾跃亭再成被执行人;微信订阅号页面改版...
  3. cpu_time()函数
  4. 中调用view_在 View 上使用挂起函数
  5. css 点击效果_纯 CSS 实现吸附效果
  6. antd + react model自定义footer_阿里开源可插拔的企业级React应用框架——UmiJS
  7. 本地Git仓库关联Github项目
  8. Backpropagation Algorithm 的梯度
  9. 一阶线性微分方程的初等积分法例题
  10. hillstone debug 抓包