当前位置:网站首页 > Java教程 > 正文

dubbo java 教程



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 rmi hessian http webservice thrift 传输协议 TCP TCP HTTP HTTP HTTP thrif 传输方式 NIO异步传输 同步 同步 同步 同步 同步、异步 序列化 Hessian二进制序列化 Java标准二进制序列化 Hessian二进制序列化 表单序列化 SOAP文本序列化 Thrift 适用范围 传入传出参数数据包较小(建议小于100K),消费者比提供者个数多,单一消费者无法压满提供者,尽量不要使用dubbo协议传输大文件或超大字符串 传入传出参数数据包大小混合,消费者与提供者个数差不多,可传文件。 传入传出参数数据包较大,提供者比消费者个数多,提供者压力较大,可传文件。 传入传出参数数据包大小混合,提供者比消费者个数多,可用浏览器查看,可用表单或URL传入参数,暂不支持传文件。 系统集成,跨语言调用。 跨语言 约束 参数及返回值需实现Serializable接口 参数及返回值需实现Serializable接口 参数及返回值需实现Serializable接口 不能在协议中传递null值

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

版权声明


相关文章:

  • 消息推送教程java2024-12-12 23:26:02
  • 初学java教程82讲2024-12-12 23:26:02
  • java直播教程2024-12-12 23:26:02
  • java入门教程55集2024-12-12 23:26:02
  • java教程85讲2024-12-12 23:26:02
  • java图形制作教程2024-12-12 23:26:02
  • java加锁教程2024-12-12 23:26:02
  • java和netezza教程2024-12-12 23:26:02
  • java教程第十六讲2024-12-12 23:26:02
  • finereport java教程2024-12-12 23:26:02