Dubbo官方文档:https://dubbo.apache.org/zh
目前Dubbo最新的是Dubbo3。本文使用的是 2.7.3 (推荐)
Dubbo3 格式的 Provider 地址不能被 Dubbo2 的 Consumer 识别到,反之 Dubbo2 的消费者也不能订阅到 Dubbo3 Provider。
这里的架构和使用都是基于Dubbo2.7 版本,Dubbo2(2.7以下)和Dubbo3两个版本的注解有区别。
Registry是注册中心,用于发现服务者和消费者。
注册中心可以选择 zookeeper、consul、nacos,推荐使用zookeeper。
dubboRPC通信的原理:
dubbo和springCloud的区别:
Dubbo三大组件:
- 注册中心。协调 Consumer 与 Provider 之间的地址注册与发现
- 配置中心。
- 存储 Dubbo 启动阶段的全局配置,保证配置的跨环境共享与全局一致性
- 负责服务治理规则(路由规则、动态配置等)的存储与推送。
- 元数据中心。
- 接收 Provider 上报的服务接口元数据,为 Admin 等控制台提供运维能力(如服务测试、接口文档等)
- 作为服务发现机制的补充,提供额外的接口/方法级别配置信息的同步能力,相当于注册中心的额外扩展
以上三个中心并不是运行 Dubbo 的必要条件,用户完全可以根据自身业务情况决定只启用其中一个或多个,以达到简化部署的目的。
通常情况下,所有用户都会以独立的注册中心 开始 Dubbo 服务开发,而配置中心、元数据中心则会在微服务演进的过程中逐步的按需被引入进来。
依赖:(推荐使用2.7.13版本)。
spring集成dubbo:
springboot与dubbo集成:
1、服务端
在服务提供方实现接口(对服务消费方隐藏实现):
spring-provider.xml :
一般来说,我们会把 beanId 交给 spring 去管理只需要在 xml 里面声明扫描包,然后使用 声明实现类 即可:
2、客户端
spring-consumer.xml:
1、服务端
上面例子的 spring-provider.xml 换成 properties 文件的写法是这样的:
开启基于注解的dubbo功能(主要是包扫描):
2、客户端
使用例子1:
dubbo和spring可以完美结合,只需要在spring配置文件声明即可。
provider:
consumer:
使用例子2:
这里展示注解的方式,需要声明
provider:
consumer:
xml:
服务端级别:
服务端方法级别:
客户端级别:
客户端方法级别:
当多个provider注册到zk,consumer会选择指定的负载均衡算法自动请求,遇到上线或者下线会重新计算。
常见有四种负载均衡:
- random
- roundRobin (默认)
- leastActive
- consistentHash
dubbo支持多种协议:
- dubbo
- hessian
- http
- rmi
- webservice
- thrift
- memcached
- redis
不同服务不同协议
不同服务在性能上适用不同协议进行传输,比如大数据用短连接协议,小数据大并发用长连接协议
多协议暴露服务
需要与 http 客户端相互操作
两个不同注册中心,使用竖号分隔多个不同注册中心地址:
不同服务使用不同注册中心:
还可以这样:
超时默认重试 值: 1000ms
重试默认重试2次,不算第一个调用,一共会调用三次
如服务方设置:
注意,本人测试了一下,虽然服务方设置重试次数为1,消费者默认,最终结果还是会重试2次(消费者默认值),所以服务方提供的重试次数无效,建议在消费者设置,但是超时时间是生效的。
超时、重试建议在消费者设置:
当一个接口有多种实现时,可以用 group 区分。
provider.xml
consumer.xml
和 是一样的效果,但总是只调一个可用组的实现。(不能实现负载均衡)
这里有个坑,reference group="*" ,consumer在启动的时候已经选好了分组,并不是轮询两个分组
如果你要使用group进行负载均衡,consumer就不要写group
当一个接口实现,出现不兼容升级时,可以用版本号过渡,版本号不同的服务相互间不引用。
consumer 设置 version="*" 可以 轮询 调用provider,而group不能,这是和group的最大区别
直连模式一般应用于测试模式。
消费者:
服务方不需要修改,如果开启了token验证,需要在 或者 声明:
消费者需要携带token:
如果不需要token验证,设置成 false 即可
duboo3.0 的默认协议是 dubbo,较2.0版本来说是一个新的协议(官方称为triple)
dubbo 有多种协议,不同的协议默认使用不同的序列化框架。比如:
http 协议 默认为 为 json 。
hessian 协议,默认是 hessian 序列化;
webservice 协议,默认是 soap 文本序列化 。
1、使用了dubbo2.7.13 版本,thrift 协议 的name 是native-thrift,而且 无法获取参数
当前 dubbo 支持的 thrift 协议是对 thrift 原生协议 的扩展,与原生Thrift不兼容 ,使用的是
吐槽一下,dubbo3官方的更新进度也太慢了,本人在使用dubbo 3.0.2.1 的时候,并没有 triple 协议,官方文档也没有找到demo,最后是在dubbo-benchmark项目才知道如何使用。
2、协议的支持
dubbo2.7使用默认的序列化协议是hessian,如果参数是泛型 ,返回值可能为null,此时可以修改序列化为 kryo,并加入:
3、版本的区别
目前dubbo 2.7 版本(包括2.7以下)建议使用dubbo作为RPC调用协议(也是默认)。
本人测试了一下,dubbo 3.0 版本情况下即使按照官方文档,引入 hessian 协议的依赖,仍然报:
暂时没有找到解决方案。
使用dubbo 2.7.13 版本,是可以单独使用hessian协议的。
除此之外本人从网上+测试验证:
- dubbo3.0版本是2021年6月才出来的,新版本默认是使用 trilple 协议,还不兼容旧版本协议
- dubbo3.0官方并没有详细的使用文档,本人测试了一下,与2.7的兼容性还有很大问题,所以建议还是使用2.7版本
- dubbo更新太慢(3年都没有更新3.0版本,捐赠给Apache后基本无维护),网上找到的资料不如springcloud多
4、springboot配置文件
建议springboot接入dubbo不要使用 注解的方式 配置dubbo,统一使用xml文件更友好。
5、关于 dubbo-registry-zookeeper 和 dubbo-dependencies-zookeeper
测试了一下,两个使用其中一个即可,推荐使用 dubbo-registry-zookeeper
参考:
- 使用直连模式:https://blog.csdn.net/hcz666/article/details/
- dubbo官方文档:https://dubbo.apache.org/zh
版权声明:
本文来源网络,所有图片文章版权属于原作者,如有侵权,联系删除。
本文网址:https://www.bianchenghao6.com/java-jiao-cheng/14978.html