Springboot之dubbo实现过滤器-yellowcong

版权声明:本文为博主yellowcong原创文章,未经博主允许不得转载。 https://blog.csdn.net/yelllowcong/article/details/88914783

再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

猜你喜欢

转载自blog.csdn.net/yelllowcong/article/details/88914783