springboot项目yml方式配置dubbo的IP白名单

一、项目关于dubbo依赖

<!-- 这里包含了Zookeeper依赖和Dubbo依赖 -->
<dependency>
    <groupId>com.alibaba.boot</groupId>
    <artifactId>dubbo-spring-boot-starter</artifactId>
    <version>0.2.0</version>
</dependency>

实现dubbo的白名单思路:编写一个filter继承com.alibaba.dubbo.rpc.filter。然后进行IP过滤。

二、实现步骤

  • 在服务提供方(provider)编写一个ValidationFilter代码如下:
import com.alibaba.dubbo.rpc.*;
@Activate(group = { Constants.PROVIDER })
public class ValidationFilter implements Filter{
    @Override
    public Result invoke(Invoker<?> invoker, Invocation invocation) throws RpcException {
        Properties prop = new Properties();
        InputStream in = ValidationFilter.class.getResourceAsStream("/ipwhitelist.properties");
        String clientIp = RpcContext.getContext().getRemoteHost();//客户端ip
        try {
            prop.load(in);
            String ipwhitelist = prop.getProperty("ipwhitelist");//ip白名单
            if (ipwhitelist.contains(clientIp)) {
                return invoker.invoke(invocation);
            } else {
                return new RpcResult(new Exception("ip地址:"
                        + clientIp + "没有访问权限"));
            }
        } catch (IOException e) {
            e.printStackTrace();
        } catch (RpcException e) {
            throw e;
        } catch (Throwable t) {
            throw new RpcException(t.getMessage(), t);
        }
        return invoker.invoke(invocation);
    }
}
  • 在根目录下添加(修改)/META-INF/dubbo/internal/com.alibaba.dubbo.rpc.Filter的文件,如下图:

     

我的是自己添加的包/META-INF/dubbo/internal和com.alibaba.dubbo.rpc.Filter文件。文件内容如下:

 

为什么要添加这个文件?因为dubbo的扩展机制SPI会自动在根目录下/META-INF/dubbo/internal这个文件夹里去扫描com.alibaba.dubbo.rpc.Filter这个文件。

  • 在服务提供方(provider)的yml配置

这个validation指向你上面文件里的配置的“validation=com.boot.filter.ValidationFilter”

  • ip白名单文件

在根目录下添加ipwhitelist.properties白名单配置文件,如下图:

内容为:

ipwhitelist=192.168.1.19,192.168.2.104

名字是和自己定义的filter的里面的代码对应的。