公司每周五都要给线上系统发布一个版本,我将本周新开发的业务模块直接提交到svn的主干上(当然本机已经测试通过),在公司的测试环境部署运行正常,测试人员业务测试通过。但是在部署到准生产环境上后出现了意想不到的现象。主服务(web服务消费端)展示的业务界面,一会儿正确一会儿不正确。经排查svn分支代码合并正确,排除部署版本差异问题。最终我在本机部署了一个dubbo-admin主服务,连接上准生产的zookeeper服务集群,发现服务提供者服务集群,提供接口相同,但是接口的实现不一样。握草,瞬间被坑爹的队友无语。原来是其他部门的同事,新拉出来一个开发分支,在原来的项目上拓展模块,没做任何调整就直接部署dubbo服务,导致服务提供者提供的接口名一样,所导致的原因。好了问题确定了,也就有了解决方案。
解决方案:
group:当一个接口有多种实现时,可以用group区分;
1 <!-- start--服务提供者 -->
2 <!-- dubbo中当一个接口有多个实现类时,需要添加group来区分 -->
3 <!-- 机器A:服务提供者 -->
4 <bean id="zhenliangsongA" class="com.xxx.ServiceImplA" />
5 <dubbo:service group="song" interface="com.xxx.InterfaceService" ref="zhenliangsongA" />
6 <!-- 机器B:服务提供者 -->
7 <bean id="zhenliangsongB" class="com.xxx.ServiceImplB" />
8 <dubbo:service group="wang" interface="com.xxx.InterfaceService" ref="zhenliangsongB" />
9 <!-- end--服务提供者 -->
10
11 <!-- start--服务消费者 -->
12 <!-- 机器C:服务消费者:dubbo消费者也可以设置为“*”,表示消费任意一个group的服务均可 -->
13 <dubbo:reference id="consumerService" interface="com.xxx.InterfaceService" group="*" />
14 <!-- 机器D:服务消费者:dubbo消费者也可以设置为“song”,表示只能消费group是song的接口实现类 -->
15 <dubbo:reference id="consumerService" interface="com.xxx.InterfaceService" group="song" />
16 <!-- 机器E:服务消费者:dubbo消费者也可以设置为“wang”,表示只能消费group是wang的接口实现类 -->
17 <dubbo:reference id="consumerService" interface="com.xxx.InterfaceService" group="wang" />
18 <!-- end--服务消费者 -->
附加:顺便将version的使用也一并说一下;
version:当一个接口的实现,出现不兼容升级时,可以用版本号过渡,版本号不同的服务相互间不引用;
1 <!-- start--服务提供者 -->
2 <!-- 机器A提供1.0.0版本服务 -->
3 <dubbo:service interface="com.xxx.ProviderService" version="1.0.0" />
4 <!-- 机器B提供2.0.0版本服务 -->
5 <dubbo:service interface="com.xxx.ProviderService" version="2.0.0" />
6 <!-- end--服务提供者 -->
7
8 <!-- start--服务消费者 -->
9 <!-- 机器C消费1.0.0版本服务 -->
10 <dubbo:reference id="consumerService" interface="com.xxx.ProviderService" version="1.0.0" />
11 <!-- 机器D消费2.0.0版本服务 -->
12 <dubbo:reference id="consumerService" interface="com.xxx.ProviderService" version="2.0.0" />
13 <!-- 消费任意一个版本服务 -->
14 <dubbo:reference id="consumerService" interface="com.xxx.ProviderService" version="*" />
15 <!-- end--服务消费者 -->
接口升级时注意事项:
* 在低压力时间段,先升级一半的提供者为新版本;
* 再将所有的消费者升级为新版本;
* 然后将剩下的一半提供者升级为新版本;