公司每周五都要给线上系统发布一个版本,我将本周新开发的业务模块直接提交到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--服务消费者   -->



接口升级时注意事项:
* 在低压力时间段,先升级一半的提供者为新版本; 
* 再将所有的消费者升级为新版本; 
* 然后将剩下的一半提供者升级为新版本;