公司每周五都要给线上系统发布一个版本,我将本周新开发的业务模块直接提交到svn的主干上(当然本机已经测试通过),在公司的测试环境部署运行正常,测试人员业务测试通过。但是在部署到准生产环境上后出现了意想不到的现象。主服务(web服务消费端)展示的业务界面,一会儿正确一会儿不正确。经排查svn分支代码合并正确,排除部署版本差异问题。最终我在本机部署了一个dubbo-admin主服务,连接上准生产的zookeeper服务集群,发现服务提供者服务集群,提供接口相同,但是接口的实现不一样。握草,瞬间被坑爹的队友无语。原来是其他部门的同事,新拉出来一个开发分支,在原来的项目上拓展模块,没做任何调整就直接部署dubbo服务,导致服务提供者提供的接口名一样,所导致的原因。好了问题确定了,也就有了解决方案。

解决方案:

group:当一个接口有多种实现时,可以用group区分;

     <!-- start--服务提供者   -->
<!-- dubbo中当一个接口有多个实现类时,需要添加group来区分 -->
<!-- 机器A:服务提供者 -->
<bean id="zhenliangsongA" class="com.xxx.ServiceImplA" />
<dubbo:service group="song" interface="com.xxx.InterfaceService" ref="zhenliangsongA" />
<!-- 机器B:服务提供者 -->
<bean id="zhenliangsongB" class="com.xxx.ServiceImplB" />
<dubbo:service group="wang" interface="com.xxx.InterfaceService" ref="zhenliangsongB" />
<!-- end--服务提供者 --> <!-- start--服务消费者 -->
<!-- 机器C:服务消费者:dubbo消费者也可以设置为“*”,表示消费任意一个group的服务均可 -->
<dubbo:reference id="consumerService" interface="com.xxx.InterfaceService" group="*" />
<!-- 机器D:服务消费者:dubbo消费者也可以设置为“song”,表示只能消费group是song的接口实现类 -->
<dubbo:reference id="consumerService" interface="com.xxx.InterfaceService" group="song" />
<!-- 机器E:服务消费者:dubbo消费者也可以设置为“wang”,表示只能消费group是wang的接口实现类 -->
<dubbo:reference id="consumerService" interface="com.xxx.InterfaceService" group="wang" />
<!-- end--服务消费者 -->

附加:顺便将version的使用也一并说一下;

version:当一个接口的实现,出现不兼容升级时,可以用版本号过渡,版本号不同的服务相互间不引用;

     <!-- start--服务提供者   -->
<!-- 机器A提供1.0.0版本服务 -->
<dubbo:service interface="com.xxx.ProviderService" version="1.0.0" />
<!-- 机器B提供2.0.0版本服务 -->
<dubbo:service interface="com.xxx.ProviderService" version="2.0.0" />
<!-- end--服务提供者 --> <!-- start--服务消费者 -->
<!-- 机器C消费1.0.0版本服务 -->
<dubbo:reference id="consumerService" interface="com.xxx.ProviderService" version="1.0.0" />
<!-- 机器D消费2.0.0版本服务 -->
<dubbo:reference id="consumerService" interface="com.xxx.ProviderService" version="2.0.0" />
<!-- 消费任意一个版本服务 -->
<dubbo:reference id="consumerService" interface="com.xxx.ProviderService" version="*" />
<!-- end--服务消费者 -->

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

dubbo中的group与version的存在意义的更多相关文章

  1. dubbo服务的group和version

    group 当一个接口有多种实现时,可以用group区分 <!-- dubbo group 使用示例 --> <bean id="demoA" class=&qu ...

  2. Dubbo中暴露服务的过程解析

    dubbo暴露服务有两种情况,一种是设置了延迟暴露(比如delay="5000"),另外一种是没有设置延迟暴露或者延迟设置为-1(delay="-1"): 设置 ...

  3. Dubbo学习笔记11:使用Dubbo中需要注意的一些事情

    指定方法异步调用 前面我们讲解了通过设置ReferenceConfig的setAsync()方法来让整个接口里的所有方法变为异步调用,那么如何指定某些方法为异步调用呢?下面讲解下如何正确地设置默写方法 ...

  4. Dubbo原码解析(version:2.5.3)

    一.启动dubbo借助spring的schemas来启动(dubbo.jar/META-INF/spring.schemas).在dubbo.jar/META-INF/spring.handlers里 ...

  5. Dubbo原理剖析 之 @DubboReference.version设置为*

    原文链接 Dubbo原理剖析 之 @DubboReference.version设置为* 1 背景 Dubbo在消费端提供了一个功能,即将消费者的版本号指定为*,那么不管服务端的接口版本是啥,都可以调 ...

  6. Dubbo中订阅和通知解析

    Dubbo中关于服务的订阅和通知主要发生在服务提供方暴露服务的过程和服务消费方初始化时候引用服务的过程中. 2345678910111213141516171819 public <T> ...

  7. Dubbo中集群Cluster,负载均衡,容错,路由解析

    Dubbo中的Cluster可以将多个服务提供方伪装成一个提供方,具体也就是将Directory中的多个Invoker伪装成一个Invoker,在伪装的过程中包含了容错的处理,负载均衡的处理和路由的处 ...

  8. Dubbo中服务消费者和服务提供者之间的请求和响应过程

    服务提供者初始化完成之后,对外暴露Exporter.服务消费者初始化完成之后,得到的是Proxy代理,方法调用的时候就是调用代理. 服务消费者经过初始化之后,得到的是一个动态代理类,InvokerIn ...

  9. Dubbo中编码和解码的解析

    (这里做的解析不是很详细,等到走完整个流程再来解析)Dubbo中编解码的工作由Codec2接口的实现来处理,回想一下第一次接触到Codec2相关的内容是在服务端暴露服务的时候,根据具体的协议去暴露服务 ...

随机推荐

  1. jQuery获取的dom对象和原生的dom对象有何区别

    js原生获取的dom是一个对象,jQuery对象就是一个数组对象,其实就是选择出来的元素的数组集合,所以说他们两者是不同的对象类型不等价 原生DOM对象转jQuery对象 var box = docu ...

  2. 安卓开发之sql语句增删改查

    package com.lidaochen.phonecall; import android.content.Context; import android.database.sqlite.SQLi ...

  3. liunx pyinotify的安装和使用

    介绍此功能是检测目录的操作的事件 1.安装 在百度云盘下载或者在gits上下载安装包 链接:https://pan.baidu.com/s/1Lqt872YEgEo_bNPEnEJMaw 提取码:bj ...

  4. HTML插入地图

    方法/步骤 1.打开“百度地图生成器”的网址:http://api.map.baidu.com/lbsapi/creatmap/index.html 如下图: 2.在“1.定位中心点”中,切换城市,并 ...

  5. Delphi Tobject类

  6. linux中公钥和私钥的区别以及关系

    导读 在学习ssh章节时,一定有不少人对公钥和私钥产生过不解.在搜索公钥跟私钥的理解时,发现了这篇有趣的图解小文章,与大家共享. 1. 鲍勃有两把钥匙,一把是公钥,另一把是私钥. 2. 鲍勃把公钥送给 ...

  7. Hadoop_24_MapReduce实现QQ共同好友

    1.社交粉丝数据分析: 以下是qq的好友列表数据,冒号前是一个用户,冒号后是该用户的所有好友(数据中的好友关系是单向的) A:B,C,D,F,E,O B:A,C,E,K C:F,A,D,I D:A,E ...

  8. python再学习笔记

    python各种半桶水QAQ,一些特性经常跟其他语言搞混,官方入门文档重读温习...... 最好用4个空格的缩进空值是Python里一个特殊的值,用None表示变量就是在程序中用来指向这些数据对象的, ...

  9. 【Java 基础实例—Bank 项目1】

    (上图Wie任务要求的UML结构) Account.java 文件: package Banking_1; public class Account { private double balance; ...

  10. golang 中Pointers Vs References

    原文: https://spf13.com/post/go-pointers-vs-references/ Pointers Vs References Some languages includin ...