测试和生成公用一套zookeeper,怎么保证消费不冲突?
对于Java Web应用,spring的拦截器可以拦截Web接口的调用,而对于dubbo接口,spring的拦截器就不管用了。要实现此功能,需要dubbo提供Filter扩展
dubbo中filter过滤器的使用场景
1 、扩展Filter
实现com.alibaba.dubbo.rpc.Filter接口:
public class AuthorityFilter implements Filter {
private static final Logger LOGGER = LoggerFactory.getLogger(AuthorityFilter.class);
private IpWhiteList ipWhiteList;
//dubbo通过setter方式自动注入
public void setIpWhiteList(IpWhiteList ipWhiteList) {
this.ipWhiteList = ipWhiteList;
}
@Override
public Result invoke(Invoker<?> invoker, Invocation invocation) throws RpcException {
if (!ipWhiteList.isEnabled()) {
LOGGER.debug("白名单禁用");
return invoker.invoke(invocation);
}
String clientIp = RpcContext.getContext().getRemoteHost();
LOGGER.debug("访问ip为{}", clientIp);
List<String> allowedIps = ipWhiteList.getAllowedIps();
if (allowedIps.contains(clientIp)) {
return invoker.invoke(invocation);
} else {
return new RpcResult();
}
}
}
注意:只能通过setter方式来注入其他的bean,且不需要标注注解。具体请见
http://dubbo.io/developer-guide/%E6%89%A9%E5%B1%95%E7%82%B9%E5%8A%A0%E8%BD%BD.html
2、 配置文件
<dubbo:reference filter="xxx,yyy" /> <!-- 消费方调用过程拦截 -->
<dubbo:consumer filter="xxx,yyy"/> <!-- 消费方调用过程缺省拦截器,将拦截所有reference -->
<dubbo:service filter="xxx,yyy" /> <!-- 提供方调用过程拦截 -->
<dubbo:provider filter="xxx,yyy"/> <!-- 提供方调用过程缺省拦截器,将拦截所有service -->
3 、 扩展实例
- maven结构
src
|-main
|-java
|-com
|-xxx
|-XxxFilter.java (实现Filter接口)
|-resources
|-META-INF
|-dubbo
|-com.alibaba.dubbo.rpc.Filter (纯文本文件,内容为:xxx=com.xxx.XxxFilter)
XXXFilter.java
如前文META-INF/dubbo/com.alibaba.dubbo.rpc.Filter
xxxFilter=com.xxx.AuthorityFilter
- dubbo的provider配置文件
<dubbo:provider filter="xxxFilter" />