dubbo的服务consumer与provider使用的api版本不一致,是否有影响

    最近新接手一个项目,看到定义的dubbo接口有些很奇葩的设定。

    一、消费端 与 服务端 调用的接口中的数据包装类型中的数据长度不一样。例如:A类(int num , String phone ,String address) version-0.2  , 消费端用的是0.1版本的A类(int num,String phone ,String address)version-0.1 ; 由于各种原因无法直接在项目上验证,因此决定自己模拟一次情况来看看实际情况,到底消费者能不能成功调用服务;

   环境限定:

    <groupId>io.dubbo.springboot</groupId>
    <artifactId>spring-boot-starter-dubbo</artifactId>
    <version>1.0.0</version>

    provider 的 api包(版本为0.0.2 ,红线字段就是0.0.2版本新增的字段):

  

    consumer 引用的provider的api包是0.0.1版本的,也就是说没有"address"这个字段:

    

  

  consumer调用provider的Controller:

 

 @RestController
@RequestMapping("/test")
public class Controller { @Autowired
private Service service; @RequestMapping("/hello")
public String hello(){
return service.hello();
} }

  consuer的Service:

@org.springframework.stereotype.Service
public class Service { @Reference
private TestService testService;
public String hello(){
TestParam param=TestParam.builder().age(20).name("李二").build();
return testService.test(param).getMsg();
}
}

  注意: controller是注入的spring的service, 然后在service里再注入dubbo的TestService.为什么不直接在controller立注入dubbo的TestService了?因为直接在controller层是无法注入dubbo的服务的,具体原因是因为spring与dubbo生命周期问题。详情就不赘述了,记住一点,不能在controller直接注入dubbo的服务来使用.

  provider 的 TestService的实现:

  

import com.alibaba.dubbo.config.annotation.Service;
import com.zxl.dubbo.dto.Response;
import com.zxl.dubbo.dto.TestParam; @Service
public class TestServiceImpl implements TestService {
@Override
public Response test(TestParam param) {
return Response.builder().code(200).msg("hello").data(null).build();
}
}

           就是直接返回一个hello.

   现在我们来看一下结果,我是通过访问controller提供的url来触发调用provider:

    

可以看到,成功返回了消息内容“hello”.

  那么问题来了,consumer与provider两端使用的 TestParam的属性内容都不一样,是如何成功解析传给provider的消息了?

  ```````, 花了好几个小时去debug看,由于中间步骤很多,这里就不贴图描述了。能解析成功的最主要原因是采用了hessian序列化。具体为什么hessian序列化能实现这种不同版本的兼容,下面贴一个关于hessian序列化的连接: https://www.jianshu.com/p/6a36dd1fcca8

  里面关键的部分就是下面这一句:

  

  。从目前得到的信息可以看出,服务端与消费端使用的bean版本不同,并没有影响到服务的调用,原因就是由于hessian序列化。为了证实这种情况,修改序列化方式,再进行测试:

    配置中修改序列化方式,使用java自带的序列化:

    

  dubbo:
application:
name: consumer
registry:
address: zookeeper://127.0.0.1:2181
protocol:
name: dubbo
port: 20888
serialization: java
scan: com.zxl.dubbo

  访问url,查看结果:

  

返回消息明确说了是由于“解码失败”。

因此,综合以上可以得出结论:dubbo采用默认的hessian序列方式,可以兼容消费端与服务端使用的bean版本不同。

虽然这种情况不会影响服务调用,但是由于两端使用的bean是不同版本的,可能会在业务上有影响。应该避免出现这种不规范的使用!

  

dubbo的服务consumer与provider使用的api版本不一致,是否有影响的更多相关文章

  1. dubbo rest服务 No provider available for the service 错误问题

    1.版本 dubbo 2.6.2 2.描述 消费者调用dubbo rest服务报No provider available for the service错误 网络上有讲是实体类未实现Serializ ...

  2. Dubbo入门到精通学习笔记(二):Dubbo管理控制台、使用Maven构建Dubbo的jar包、在Linux上部署Dubbo privider服务(shell脚本)、部署consumer服务

    文章目录 Dubbo管理控制台 1.Dubbo管理控制台的主要作用: 2.管理控制台主要包含: 3.管理控制台版本: 安装 Dubbo 管理控制台 使用Maven构建Dubbo服务的可执行jar包 D ...

  3. Dubbo分布式服务框架入门

    参考http://blog.csdn.net/u013142781/article/details/50387583 一.Dubbo概念介绍 1.1.Dubbo是什么? Dubbo是一个分布式服务框架 ...

  4. Dubbo分布式服务框架入门使用

    概念: Provider 暴露服务方称之为"服务提供者". Consumer 调用远程服务方称之为"服务消费者". Registry 服务注册与发现的中心目录服 ...

  5. Dubbo 分布式服务框架简介

    1.分布式服务框架 1.1 Dubbo 简介 Dubbo 是一个分布式服务框架,以及阿里巴巴内部的 SOA 服务化治理方案的核心框架.其功能主要包括:高性能 NIO 通讯及多协议集成,服务动态寻址与路 ...

  6. Dubbo 分布式服务框架入门

    要想了解 Dubbo 是什么,我们不防先了解它有什么用.使用场景:比如我想开发一个网上商城项目,这个网上商城呢,比较复杂,分为 pc 端 web 管理后台,微信端销售公众号,那么我们分成四个项目,pc ...

  7. Dubbo 暴露服务

    1. 引入dubbo依赖 dubbo 依赖 <dependency> <groupId>com.alibaba</groupId> <artifactId&g ...

  8. Dubbo 分布式服务框架

    要想了解Dubbo是什么,我们不防先了解它有什么用. 使用场景:比如我想开发一个网上商城项目,这个网上商城呢,比较复杂,分为pc端web管理后台,微信端销售公众号,那么我们分成四个项目,pc端网站,微 ...

  9. Dubbo分布式服务框架入门(附project)

    要想了解Dubbo是什么,我们不防先了解它有什么用. 使用场景:比方我想开发一个网上商城项目.这个网上商城呢,比較复杂.分为pc端web管理后台.微信端销售公众号,那么我们分成四个项目,pc端站点,微 ...

随机推荐

  1. C#设计模式学习笔记:(23)解释器模式

    本笔记摘抄自:https://www.cnblogs.com/PatrickLiu/p/8242238.html,记录一下学习过程以备后续查用. 一.引言 今天我们要讲行为型设计模式的第十一个模式-- ...

  2. NIO、多路复用的终极奥义

    1.现在要让有限的系统资源发挥更大的效率,一个最直接的方式就是进行资源复用,比如线程资源复用. 2.线程资源复用的一个最有效的方式就是使用事件驱动模型进行异步调用. 3.Reactor模型就是基于事件 ...

  3. PMP--1.5 项目管理描述

    项目所处的环境将影响每个项目管理过程的实施方式以及项目制约因素的优先顺序. 一. 管理一个项目的过程 ​管理一个项目通常包括(但不限于): 1. 识别项目需求 2. 处理相关方的各种需要.关注和期望 ...

  4. 错误:EfficientDet网络出现"No boxes to NMS"并且mAP:0.0的解决方案

    近日,在使用谷歌新推出来的一个网络EfficientDet进行目标检测训练自己的数据集的时候,出现了如下错误: 其中项目开源地址是:https://github.com/toandaominh1997 ...

  5. 学习使用add()()()迭代调用,柯里化处理

    将多个参数的函数,转换成单参数函数链 以add()()()举例 function add(){ 使用数组保存参数 let _args = Array.prototype.slice.call(argu ...

  6. alibaba工程师,如何解决乐观锁冲突问题?

    很多做过电商系统的人应该知道,我们在设计电商系统中关于商品库存扣减时,在大部分情况下(并发量不高时),商品库存都可以直接在关系型数据库中进行扣减,那么在限时抢购活动正式开始后,那些单价比平时更给力.更 ...

  7. Qt实践-基于C++的UI设计基础

    学习网址:http://c.biancheng.net/view/1824.html 我的代码: 头文件qwdlgmanual.h: #ifndef QWDLGMANUAL_H #define QWD ...

  8. Java【第二课 扫描仪 & 布尔数据类型】

    一.Java扫描仪 为了更加方便的理解,我先将逻辑框图 这个有点像C语言的scan()的用法 import java.util.Scanner; //导入扫描仪 public class demo{ ...

  9. PHP0006:PHP基础--函数2

    如果php后面没有任何html代码就可以 删掉后面的   ?>  符号 file_put_content 是覆盖写入文件信息

  10. Uva12716 素数筛思想的应用

    Uva12716 题意: 输入整数n,1<= n <=3e7,问有多少个整数对(a,b)满足:1 <= b <= a <= n,且gcd(a,b)== a XOR b 解 ...