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);}} |
---|
我们自定义了过滤器,还的按照
dubbo spi机制,还得需要配置
代码语言:javascript复制其中添加配置
1 | consumerFilter=com.zhenai.crm.financial.filter.ConsumerFilter |
---|
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();}}} |
---|
同消费端一样,需要添加配置
(添加到过滤器链)
1 | ipWhiteFilter=com.zhenai.crm.common.filter.AuthorityFilter |
---|
添加引用dubbo-provider.xml
1 | <dubbo:provider timeout="${dubbo.timeout}" retries="0" filter="ipWhiteFilter"/> |
---|
这样,消费端通过过滤器提供身份信息,
并将其身份信息装配到dubbo上下文中,
服务端自定义过滤器
从上下文拿到消费方的身份信息,
并和数据库或者缓存中的实际配置比对,
如果合法就允许调用对应
的服务,如果非法就直接返回相应错误信息.
优点:
代码语言:javascript复制可以打印调用方和服务方的请求和
调用情况,可以用来查看调用信息和
分析错误日志;
对模块服务做监控和权限管控,
防止非法调用
缺点:
代码语言:javascript复制增加了调用链长度,影响程序性能;
每次添加服务暴露或者引用都需要
添加相应的配置信息(数据库配置
和应用配置)