一、项目关于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的里面的代码对应的。