再dubbo中,我们需要做一个过滤器,可以用来做类似于spring aop的操作,可以对调用dubbo的服务进行过滤,添加黑白名单等服务。我们需要将过滤器的配置,在
META-INF/dubbo/com.alibaba.dubbo.rpc.Filter
里面,配置过滤器。
代码地址
https://gitee.com/yellowcong/springboot-demo/tree/master/springboot-dubbo
过滤器配置
1. 创建过滤器
创建一个过滤器,需要实现com.alibaba.dubbo.rpc.Filter
接口, 这个接口,有点像InvocationHandler
。注解@Activate
是dubbo 提供的一个框架,有三种生效方式
@Activate// 无条件自动激活
@Activate(“xxx”)// 当配置了xxx参数,并且参数为有效值时激活,比如配了
@Activate(group =“provider”, value =“xxx”) 只对提供方激活,group可选"provider"或"consumer"
package com.yellowcong.dubbo.filter;
import com.alibaba.dubbo.common.extension.Activate;
import com.alibaba.dubbo.rpc.Filter;
import com.alibaba.dubbo.rpc.Invocation;
import com.alibaba.dubbo.rpc.Invoker;
import com.alibaba.dubbo.rpc.Result;
import com.alibaba.dubbo.rpc.RpcContext;
import com.alibaba.dubbo.rpc.RpcException;
/**
* 代码创建: yellowcong <br/>
* 创建日期: 2019年3月30日 <br/>
* 功能描述: 实现 com.alibaba.dubbo.rpc.Filter 接口
*/
// @Activate 无条件自动激活
@Activate
public class DubboLogFilter implements Filter{
@Override
public Result invoke(Invoker<?> invoker, Invocation invocation) throws RpcException {
// TODO Auto-generated method stub
Result rs = null;
try {
String clientIp = RpcContext.getContext().getRemoteHost();
rs = invoker.invoke(invocation);
System.out.println("远程地址ip"+clientIp);
}catch (Exception e) {
// TODO: handle exception
}
return rs;
}
}
2. 配置com.alibaba.dubbo.rpc.Filter
我们需要再resources 目录下面新建META-INF/dubbo/com.alibaba.dubbo.rpc.Filter
配置文件,然后添加如下配置。
dubboLogFilter=com.yellowcong.dubbo.filter.DubboLogFilter
这个为啥需要放到META-INF/dubbo/ 这个目录,是由于ExtensionLoader
这个对象初始化数据,是从这个目录中加载配置的类信息。
3.配置application.properties
里面有一个关于filter比较重要的配置, spring.dubbo.provider.filter=dubboLogFilter
设定provider的过滤器。
#日志地址
info.name=入门案例
#这个目录是相对于启动服务的那个路径的
logging.path=./logs
#配置日志信息
logging.config=classpath:log4j2.xml
spring.dubbo.application.name=dubbo-spring-boot-provider
spring.dubbo.application.id=dubbo-spring-boot-provider
#注册中心地址
spring.dubbo.registry.address=zookeeper://192.168.100.10:2181
#配置了这个后,就会一直有守护京城,而不是启动就怪盗了
spring.dubbo.server=true
#扫描的包
spring.dubbo.scan=com.yellowcong.service
# Dubbo Protocol
spring.dubbo.protocol.name=dubbo
spring.dubbo.protocol.port=20880
## DemoService version
service.version=1.0.0
# 添加filter
spring.dubbo.provider.filter=dubboLogFilter
4.测试访问
可以看到,我们获取到了远程调用dubbo的服务了
常见问题
Failed to bind properties under ‘spring.dubbo.provider’ to com.alibaba.dubbo.config.ProviderConfig:
找不到过滤器导致的。
Failed to bind properties under 'spring.dubbo.provider' to com.alibaba.dubbo.config.ProviderConfig:
Property: spring.dubbo.provider.filter
Value: dubboLogFilter
Origin: class path resource [application.properties]:28:30
Reason: No such extension dubboLogFilter for filter/com.alibaba.dubbo.rpc.Filter
Action:
Update your application's configuration
参考文章
https://my.oschina.net/u/3039671/blog/869544
https://www.jianshu.com/p/99a65ca43046