dubbo自定义过滤器

2020-11-19 14:35:05 浏览数 (1)

代码语言: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复制
增加了调用链长度,影响程序性能;
每次添加服务暴露或者引用都需要
添加相应的配置信息(数据库配置
和应用配置)

0 人点赞