公司每周五都要给线上系统发布一个版本,我将本周新开发的业务模块直接提交到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--服务消费者 -->
接口升级时注意事项:
* 在低压力时间段,先升级一半的提供者为新版本;
* 再将所有的消费者升级为新版本;
* 然后将剩下的一半提供者升级为新版本;