前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >dubbo自定义过滤器

dubbo自定义过滤器

作者头像
叔牙
发布2020-11-19 14:35:05
9790
发布2020-11-19 14:35:05
举报
文章被收录于专栏:一个执拗的后端搬砖工
代码语言:javascript
复制
dubbo提供了web filter类似的
com.alibaba.dubbo.rpc.Filter,
这样,我们可以在dubbo提供的服务
提供方和消费方都可以自定义过滤器,
从而可以获得方法调用的时间或参数、
返回结果及异常信息。以及对服务
调用的权限管控.也可以打印出重要的
服务调用堆栈信息.
代码语言:javascript
复制
接下来我们将根据实际案例来展示
dubbo自定义过滤器的使用和优缺点
消费端
代码语言:javascript
复制
过滤器具体实现(为客户端添加
身份信息)

123456789101112

public class ConsumerFilter implements Filter {@Overridepublic Result invoke(Invoker<?> invoker, Invocation invocation) throws RpcException {String application = invoker.getUrl().getParameter("application");//客户端应用名String clientId = invoker.getUrl().getParameter("clientId");//客户端应用名RpcContext.getContext().setAttachment("application",application);RpcContext.getContext().setAttachment("clientId",clientId);return invoker.invoke(invocation);}}

代码语言:javascript
复制
我们自定义了过滤器,还的按照
dubbo spi机制,还得需要配置
代码语言:javascript
复制
其中添加配置

1

consumerFilter=com.zhenai.crm.financial.filter.ConsumerFilter

代码语言:javascript
复制
dubbo-consumer.xml添加配置

1

<dubbo:consumer timeout="${dubbo.timeout}" check="false" filter="consumerFilter"/>

服务端
代码语言:javascript
复制
过滤器实现(对客户端身份验证和鉴权)

1234567891011121314151617181920212223

public class AuthorityFilter implements Filter {private static final Logger LOGGER = LoggerFactory.getLogger(AuthorityFilter.class);@Overridepublic Result invoke(Invoker<?> invoker, Invocation invocation) throws RpcException {String application = invocation.getAttachments().get("application");//客户端应用名/* Map<String,String> stringMap = invocation.getAttachments();Map<String,String> params = invoker.getUrl().getParameters();*/String service = invoker.getInterface().getName();//接口名字String clientIp = RpcContext.getContext().getRemoteHost();//客户端ip//String clientId = invocation.getAttachment("clientId");//客户端分配的IDif (AccessControlUtils.hasPermission(service, application, clientIp)) {return invoker.invoke(invocation);} else {LOGGER.warn("no permission to access service=" + service + "|clientIp=" + clientIp + "|application=" + application);throw new RuntimeException("no permission to access service=" + service + "|clientIp=" + clientIp + "|application=" + application);//return new RpcResult();}}}

代码语言:javascript
复制
同消费端一样,需要添加配置
(添加到过滤器链)

1

ipWhiteFilter=com.zhenai.crm.common.filter.AuthorityFilter

代码语言:javascript
复制
添加引用dubbo-provider.xml

1

<dubbo:provider timeout="${dubbo.timeout}" retries="0" filter="ipWhiteFilter"/>

代码语言:javascript
复制
这样,消费端通过过滤器提供身份信息,
并将其身份信息装配到dubbo上下文中,
服务端自定义过滤器
从上下文拿到消费方的身份信息,
并和数据库或者缓存中的实际配置比对,
如果合法就允许调用对应
的服务,如果非法就直接返回相应错误信息.

优点:

代码语言:javascript
复制
可以打印调用方和服务方的请求和
调用情况,可以用来查看调用信息和
分析错误日志;
对模块服务做监控和权限管控,
防止非法调用

缺点:

代码语言:javascript
复制
增加了调用链长度,影响程序性能;
每次添加服务暴露或者引用都需要
添加相应的配置信息(数据库配置
和应用配置)
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2017-07-17,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 PersistentCoder 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 消费端
  • 服务端
相关产品与服务
日志服务
日志服务(Cloud Log Service,CLS)是腾讯云提供的一站式日志服务平台,提供了从日志采集、日志存储到日志检索,图表分析、监控告警、日志投递等多项服务,协助用户通过日志来解决业务运维、服务监控、日志审计等场景问题。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档