开发联调环境主要是为了解决开发过程中,需要对其他系统服务进行依赖的问题。项目过程中经常会遇到这种情况,前后端进行联调而后端接口需要依赖其他系统的服务,因为没有一套整体的环境,可能我们把这个问题就直接丢到测试环境去调试,这就没办法保证了测试环境的稳定性,也会影响测试的效率。
解决方案主要考虑一下几点:
零侵入,尽量不改动或少的改动,避免给线上服务带来风险
环境隔离,注册到同一zk,而不会对其他人带来影响
配置灵活,系统内、跨系统都可以方便进行调试
下面主要介绍开发联调环境配置、以及我们本地的配置具体的操作。
线上环境配置
我们配置连接开发联调环境zk,在不做任何配置的情况下,dubbo默认提供给我们的是阿里云内网的ip服务,在我们的办公环境中是没办法调用的,这是我们开发联调环境要解决的最主要的问题,dubbo为我们提供了配置注册IP的机制:
1 | dubbo.protocol.host=x.x.x.x |
x.x.x.x是我们开发联调服务器的公网地址,dubbo服务注册到zk时会使用该IP,本地服务通过暴露的公网IP,就可以直接连接开发联调环境提供的dubbo服务了,同时还需要在防火墙放开该端口限制。
我们大多数服务都是基于Tomcat启动的,可以在catalina.sh的JAVA_OPTS中添加 -Ddubbo.protocol.host=x.x.x.x
。如果使用的Spring Boot默认jar包启动可以直接在启动参数上添加即可。
本地配置
同样的问题,当我们本地dubbo服务配置开发联调环境zk地址,注册到zk的是我们开发环境的内网地址,刚才上面也解释过,跨网段的内网地址是没办法去访问的。再就是项目组内多人同时将服务注册到zk时,你的请求不一定会跑到哪去,这个时候必须进行环境隔离。
1 | dubbo.registry.address=zookeeper://x.x.x.x:2181?register=false |
可以在properties配置文件中zk地址后面添加register=false表示只订阅模式,可以调用zk注册的其他服务,而不会被其他服务发现(在zk中不会出现你的服务)。这样你自己的dubbo服务就不会暴露给别人调用,也就起到了环境隔离的问题,你的dubbo服务也可以调用线上zk其他的服务。
如果只是做集成测试上面的方案足够了。如果需要跟前端联调的情况下,还需要在本地启动web服务,因为本地dubbo采用只订阅模式,在zk中没有该信息,通过常规的dubbo路由是搞不定的,可以通过另一种方式 — 直连提供者,来解决这个问题。
直连提供者需要是接口级别的,你需要指定哪些接口需要直连你的服务,例如:
<dubbo:reference id=”xxxService” interface=”com.alibaba.xxx.XxxService” url=”dubbo://localhost:20890” />
这种方式相对侵入比较高,再就是批量接口的时候我们没办法统一管理,可以将所有需要直连的接口放在一个单独的properties文件中,在IDE配置参数-Ddubbo.resolve.file指定配置文件的路径就可以了。
dubbo默认会自动加载${user.home}/dubbo-resolve.properties文件,如果你把文件放到home目录下,就不需要使用-D指定了。