公司每周五都要给线上系统发布一个版本,我将本周新开发的业务模块直接提交到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. MyEclipse的Server标签出现:Could not create the view: An unexpected exception was thrown

    删除工作空间下的.metadata\.plugins\org.eclipse.core.runtime\.settings\com.genuitec.eclipse.ast.deploy.core.p ...

  2. java Map 四种遍历方法

    public static void main(String[] args) { Map<String, String> map = new HashMap<String, Stri ...

  3. SpringBoot与缓存、消息、检索、任务、安全与监控

    一.Spring抽象缓存 Spring从3.1开始定义了org.springframework.cache.Cache和org.springframework.cache.CacheManager接口 ...

  4. Spring Cloud(七)服务网关 Zuul Filter 使用

    上一篇文章中,讲了Zuul 转发,动态路由,负载均衡,等等一些Zuul 的特性,这个一篇文章,讲Zuul Filter 使用,关于网关的作用,这里就不再次赘述了,重点是zuul的Filter ,我们可 ...

  5. String s=new String("xyz");创建了几个String Object?二者之前的区别是什么?

    两个.第一个对象是字符串常量"xyz",第二个对象是new String("xyz")的时候产生的,在堆中分配内存给这个对象,只不过这个对象的内容是指向字符串常 ...

  6. css 制作一个点

    aside li a:before { content: ''; display: inline-block; width: 4px; height: 4px; background-color: # ...

  7. Kubernetes的yaml文件中command的使用

    前面说了init容器initContainers,这主要是为应用容器做前期准备工作的,一般都会用到shell脚本,这就会用到command,这里写写command的用法. command就是将命令在创 ...

  8. Golang等待一组协程结束

    1. 利用waitgroup import ( "log" "sync" "sync/atomic" "time" ) ...

  9. 剖析ajax

    学过javascript和接触过后端PHP语言必然要用到ajax,这是必学的一门学科,AJAX指的是Asynchronous JavaScript and XML,它使用XMLHttpRequest对 ...

  10. Persistent Bookcase CodeForces - 707D (dfs 离线处理有根树模型的问题&&Bitset)

    Persistent Bookcase CodeForces - 707D time limit per test 2 seconds memory limit per test 512 megaby ...