最近需要搭建一套测试环境,主要是协助开发进行跨系统联调。目前系统间调用使用的dubbo框架,测试服务器是在云上,而不是局域网内。这样测试环境就带来两个严重的问题
- 环境隔离
- dubbo默认注册一般使用本地地址,当你连接测试环境zk,获取的是云服务器的内网地址,本地是无法调通的
关于环境隔离问题,比如开发A注册自己的服务到测试环境的zk,这样带来的问题你的服务已经暴露给测试环境服务,测试环境的rpc调用会轮训到你注册的服务,而你的服务注册到zk的是本地局域网地址,测试环境肯定找不到这个地址,所以调用失败。关于dubbo暴露ip问题详见
怎么解决这个问题呢?dubbo提供了只订阅
功能,不会把本地服务注册到zk上,这样就解决了上面描述的问题。
1 | <dubbo:registry address="zookeeper://127.0.0.1:2181" register="false" /> |
随之而来的问题,我们不将我们服务注册到zk,那我们本地需要调用这个服务的消费者怎么进行rpc调用呢?同样dubbo为我们提供了直连机制
1 | <dubbo:reference id="xxxService" interface="com.alibaba.xxx.XxxService" url="dubbo://localhost:20890" /> |
在xml中配置的话,可能会比较繁琐,我们可以统一在配置文件中配置,使用方式详见
这样我们就解决了环境隔离问题,测试环境不会发现我们本地服务,同样也可以使用测试环境服务进行测试了。
那么接下来看第二个问题,正常情况下我们没办法访问到,测试环境的内网服务,毕竟不是一个局域网内。那么我们自能让服务给我暴露公网ip,我们建立连接。
网上比较多的方式是修改/etc/hosts
,这种方案在我们使用kerberos
认证的时候会有问题。可以使用dubbo:protocol
的host来实现。
1 | <dubbo:protocol name="dubbo" port="20880" host="123.x.x.x" /> |
现在我们的问题就都解决了。。。
通过xml配置register=false
和host=123.x.x.x
,对于代码侵入比较大。可以通过-D参数进行配置:dubbo.protocol.host=123.x.x.x
。