dubbo的服务consumer与provider使用的api版本不一致,是否有影响
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版本不一致,是否有影响的更多相关文章
- dubbo rest服务 No provider available for the service 错误问题
1.版本 dubbo 2.6.2 2.描述 消费者调用dubbo rest服务报No provider available for the service错误 网络上有讲是实体类未实现Serializ ...
- Dubbo入门到精通学习笔记(二):Dubbo管理控制台、使用Maven构建Dubbo的jar包、在Linux上部署Dubbo privider服务(shell脚本)、部署consumer服务
文章目录 Dubbo管理控制台 1.Dubbo管理控制台的主要作用: 2.管理控制台主要包含: 3.管理控制台版本: 安装 Dubbo 管理控制台 使用Maven构建Dubbo服务的可执行jar包 D ...
- Dubbo分布式服务框架入门
参考http://blog.csdn.net/u013142781/article/details/50387583 一.Dubbo概念介绍 1.1.Dubbo是什么? Dubbo是一个分布式服务框架 ...
- Dubbo分布式服务框架入门使用
概念: Provider 暴露服务方称之为"服务提供者". Consumer 调用远程服务方称之为"服务消费者". Registry 服务注册与发现的中心目录服 ...
- Dubbo 分布式服务框架简介
1.分布式服务框架 1.1 Dubbo 简介 Dubbo 是一个分布式服务框架,以及阿里巴巴内部的 SOA 服务化治理方案的核心框架.其功能主要包括:高性能 NIO 通讯及多协议集成,服务动态寻址与路 ...
- Dubbo 分布式服务框架入门
要想了解 Dubbo 是什么,我们不防先了解它有什么用.使用场景:比如我想开发一个网上商城项目,这个网上商城呢,比较复杂,分为 pc 端 web 管理后台,微信端销售公众号,那么我们分成四个项目,pc ...
- Dubbo 暴露服务
1. 引入dubbo依赖 dubbo 依赖 <dependency> <groupId>com.alibaba</groupId> <artifactId&g ...
- Dubbo 分布式服务框架
要想了解Dubbo是什么,我们不防先了解它有什么用. 使用场景:比如我想开发一个网上商城项目,这个网上商城呢,比较复杂,分为pc端web管理后台,微信端销售公众号,那么我们分成四个项目,pc端网站,微 ...
- Dubbo分布式服务框架入门(附project)
要想了解Dubbo是什么,我们不防先了解它有什么用. 使用场景:比方我想开发一个网上商城项目.这个网上商城呢,比較复杂.分为pc端web管理后台.微信端销售公众号,那么我们分成四个项目,pc端站点,微 ...
随机推荐
- transient关键字和serialVersionUID
此文章很大部分转载于Java的架构师技术栈微信公众号,博主均测试通过加上自己理解写出 最近阅读java集合的源码,发现transient关键字,就了解了一下他的用法,transient关键字一般在实现 ...
- go每日新闻--2020-02-27
go 语言中文网(每日资讯)_2020-02-27 一.Go 语言中文网 如何正确看待 Google 宣布 Fuchsia 操作系统没有选 Go 作为终端开发语言 Actor 还是 CSP?Go 中的 ...
- Sublime Text3添加到右键菜单,"用 SublimeText3 打开"
在Sublime Text3安装目录下新建一个文件 sublime_addright.inf 文件内容: [Version] Signature="$Windows NT$" [D ...
- 11种常用css样式之开篇文本字体学习
常见css样式:1.字体与颜色2.背景属性3.文本属性4.边框属性5.鼠标光标属性6.列表样式7.定位属性8.内外边距9.浮动和清除浮动10.滚动条11.显示和隐藏 文本:1.letter-spaci ...
- xPath和html基础扫盲
xPath:一种HTML和XML的查询语言,他能在XML和HTML的树状结构中寻找节点 安装xPath: pip方法: pip install lxml win+R:cmd 打开命令控制台: 此 ...
- Python 中使用 Pillow 处理图片增加水印
这个是个比较常见的需求,比如你在某个网站上发布了图片,在图片上就会出现带你昵称的水印.那么在Python中应该如何处理这一类需求呢? 其实在我的<Django实战开发>视频教程中有讲到这一 ...
- P3884 [JLOI2009]二叉树问题
--------------------- 链接:Miku --------------------- 这一道题只需要在倍增lca的板子上改一改就可以了. 宽度和深度可以在倍增lca的dfs预处理的时 ...
- 『后缀自动机入门 SuffixAutomaton』
本文的图片材料多数来自\(\mathrm{hihocoder}\)中详尽的\(SAM\)介绍,文字总结为原创内容. 确定性有限状态自动机 DFA 首先我们要定义确定性有限状态自动机\(\mathrm{ ...
- AcWing1296. 聪明的燕姿
聪明的燕姿 解题思路: 首先我们肯定要用到约数之和定理 但是有个问题就是要怎么用 根据经验得知,约数最多也就六七个左右,不然直接就超了s的范围.所以我们考虑用爆搜来做 但是用爆搜的话还是要优化一下思路 ...
- C语言->关于文件数据的录入和输出调用的函数总结
数据输入输出对象之间的关系图: 函数使用说明: 1.一个字符的输入\输出,对象是键盘(缓存和屏幕) 1.1.getchar(a),putchar(a); 1.2.scanf(“%d”,&i), ...