Dubbo
1. 分布式系统相关概念
项目架构目标
衡量网站的性能指标
- 响应时间:指执行一个请求从开始到最后收到响应数据所花费的总体时间
- 并发数:指系统同时能处理的请求数量
- 并发连接数:指的是客户端向服务器发起请求,并建立了
TCP连接,每秒钟服务器连接的总TCP数量。 - 并发用户数:单位时间内有多少用户。
- 并发连接数:指的是客户端向服务器发起请求,并建立了
- 吞吐量:指系统单位时间内能处理的请求数量。
- QPS:每秒查询数。
- TPS:每秒事务数。
- 一个事务是指一个客户机向服务器发送请求,然后服务器做出反应的进程 。
分布式架构是指在垂直架构的基础上,将公共业务模块抽取出来,作为独立的服务,供其他调用者消费,以实现服务的共享和重用。
RPC(Romote Procedure Call):既远程过程调用,是一种通信规范思想。
- 核心思想:像调用本地方法一样,去调用远程服务器上的方法。
- RPC框架基于通讯协议去实现RPC远程调用,如gRPC是基于HTTP/2,而HTTP/2基于TCP。
通讯协议,通讯规范,编程接口的区别:
- 像TCP/UDP,HTTP都是通讯协议,是通话规则
- Socket是编程接口,类比于电话机,程序都是通过Socket使用通讯协议来进行通信的
- RPC是一种通讯规范思想,Dubbo,gRPC都是遵循这个规范的框架。
2. Dubbo概述
Dubbo是开源的一个高性能,轻量级
Java RPC框架,除此之外他的定位也是一个微服务开发框架,类似于SpringCloud,也有服务发现,负载均衡,动态配置等功能。- 相对的
gRPC是一个跨语言RPC框架,核心目标是定义RPC通讯规范和标准实现。
- 相对的
SpringCloud与Dubbo的区别- 他们都有微服务的功能,而
Dubbo则更侧重于RPC通信 SpringCloud通常的远程调用组件使用OpenFeign等,都是基于HTTP通讯协议,使用的一般是JSON序列化。- 而Dubbo默认基于TCP,使用二进制序列化,支持长连接,连接复用等,性能通常比SpringCloud更高。
- 他们都有微服务的功能,而
在RPC方面,不同于gRPC只能基于HTTP/2协议,Dubbo服务间可通过多种RPC通讯协议并支持灵活切换。
- 因此,Dubbo开发中也支持gRPC通信,在Dubbo3中完全兼容gRPC。
3. 简述Zookeeper
之后会系统性的学习Zookeeper,这里只是用于辅助学习Dubbo
Zookeeper可以用来注册/配置中心以及服务发现,就像SpringCloud中的Nacos组件,还可以像Redisson一样有分布式锁的功能。
这里引用Zookeeper主要是用来当作注册/配置中心。
这里我使用docker来安装zookeeper
1 | docker run -d --name zk -p 2181:2181 zookeeper:3.8 |
- 另外可以安装一下Zookeeper的可视化界面
ZooNavigator- 这里直接用docker-compose来部署
1 | services: |
4. Dubbo入门
先使用一个demo来快速了解Dubbo
快速创建Dubbo demo网站:https://start.dubbo.apache.org/bootstrap.html这里我们选择需要的组件:
- Dubbo组件:
- Java Interface
- 注册中心:Zookeeper
- 网络协议: TCP
- 常用微服务组件:
- SpringWeb
- Mybatis
- Dubbo组件:

- 基于以上选项,生成的项目将以
Zookeeper为注册中心,以高性能Dubbo2TCP协议为RPC通讯协议,并增加了Web,Mybatis等组件依赖和示例。
5. Dubbo功能
- Dubbo有以下的功能
- 远程调用
- 服务发现
- 负载均衡
- 流量管控等功能。
5.1 远程调用
这里我们Dubbo默认使用基于 TCP 的 Dubbo 协议(长连接二进制协议),走RPC,配置的注册中心是Zookeeper。
- 下面是
Dubbo远程调用与OpenFeign的差别
alt DubboDemo
- 下面是
微服务架构中,采用结构与实现分离模式。
1 | project |
- 完整调用流程如下
- Provider 启动
- Provider 注册服务到 ZooKeeper
- Consumer 启动
- Consumer 订阅服务
- Dubbo 创建远程代理对象
- 调用方法
- 通过 TCP 长连接发送请求
- Provider 执行方法并返回结果
5.1.1 定义服务
Provider定义服务,并实现业务逻辑
- 实现业务逻辑包括服务层和实现层。
- 将服务接口存入api模块,将实现层存入service模块
@DubboService注解- 注意,如果要将服务暴露为Dubbo服务 需要加
@DubboService注解 - 启动时将该服务注册到注册中心
Zookeeper
- 注意,如果要将服务暴露为Dubbo服务 需要加
1 | public interface DemoService { |
1 | //这里加入DubboService注解 将服务推入Dubbo |
5.1.2 发现服务
为了使
Comsumer调用服务,一般我们要将Provider打jar包并引入。- 这里因为我们这里是Demo,所以直接
import我们的服务定义模块即可
- 这里因为我们这里是Demo,所以直接
@DubboReference注解- Consumer会通过该注解从注册中心查找服务
- 通过RPC调用Provider
1 | public class Consumer { |
5.2 服务发现
Dubbo提供的是一种
Client-Based的服务发现机制,依赖第三方注册中心组件来协调服务发现,比如Zookeeper,Nacos等等。Client-Based服务发现机制- 由客户端自己负责从注册中心获取服务地址,并自己做负载均衡。(都是由客户端Client完成的)。
- 过程中没有中间代理服务器,符合RPC高性能
相对的就是
Server-Based服务发现机制,比如nginx,k8s,中间由负载均衡服务器进行调用如下图,服务发现包括Provider,Consumer,注册中心三个角色参与。
Provider会将服务URL地址注册到注册中心。
注册中心将数据进行聚合
Consumer会从注册中心读取地址列表并订阅变更
- 每当地址发生改变,注册中心将最新的列表通知到订阅的Consumer。
也就是说Dubbo是半拉半推模型
- Consumer启动时,会从注册中心拉取完整服务列表,并注册监听器监听订阅服务是否变更
- 如果服务变更,则注册中心会主动通知Consumer变更地址列表

5.3 负载均衡
在集群负载均衡时,Dubbo提供了多种负载均衡策略,默认为
weight random也就是加权随机负载均衡Dubbo提供的是客户端负载均衡,由Consumer通过负载均衡将请求提交给Provider实例
Dubbo常用的负载均衡策略:
- 加权随机
Weighted Random LoadBalance默认算法,默认权重相同。 - 加权轮询
RoundRobin LoadBalance与nginx一样的轮询算法,默认权重相同。 - 最少活跃优先+加权随机
LeastActive LoadBalance能者多劳的思想 - 一致性哈希
ConsitentHash确定的入参,确定的提供者,适用于有状态请求
- 加权随机
5.3.1 加权随机
实现原理非常简单。比如有两个服务S1,S2.
- S1的权重为7,S2的权重为3
- 则总权重为10,我们生成1到10的随机数,落在S1部分选择S1服务处理请求,反之选择S2
下边是
RandomLoadBalance的源码
1 | public class RandomLoadBalance extends AbstractLoadBalance { |
5.3.2 加权轮询
- 与加权随机类似,如果S1权重为7,S2权重为3,则10次请求会被S1处理7次,S2处理3次。
- 不是随机,而是轮询
5.3.3 最少活跃优先+加权随机
只看名字不直观,其实就是:
- 初始状态下所有Provider的活跃数为0(每个Provider中的特定方法都对应一个活跃数)
- 每收到一个请求,对应Provider活跃数+1,请求处理完之后活跃数-1。
因此,Dubbo就认为,谁的活跃数越少,谁的处理速度越快,性能越好,这样就优先将请求交给最少活跃Provider处理。
- 如果多个Provider的活跃数相等就再走一边
RandomLoadBalance。
- 如果多个Provider的活跃数相等就再走一边
下边是该算法的源码
1 | public class LeastActiveLoadBalance extends AbstractLoadBalance { |
- 活跃数通过
RpcStatus中的一个ConcurrentMap保存的,根据URL以及Provider被调用的方法的名字,我们便可以获取对应的活跃数,也就是说每个Provider的方法的活跃数都是独立的- 也就是说一个方法的活跃度低,不代表方法的服务活跃度低。
1 | public class RpcStatus { |
5.3.4 一致性哈希
- 在我们分库分表的时候也会用到一致性哈希,该算法中没有权重的概念
- 具体是哪个Provider处理请求是由请求参数决定的,也就是说相同参数的请求总是发到同一个Provider
- 另外,Dubbo 为了避免数据倾斜问题(节点不够分散,大量请求落到同一节点),还引入了虚拟节点的概念。通过虚拟节点可以让节点更加分散,有效均衡各个节点的请求量。
6. Dubbo序列化协议
Dubbo 支持多种序列化方式:JDK 自带的序列化、hessian2、JSON、Kryo、FST、Protostuff,ProtoBuf 等等。
- Dubbo 默认使用的序列化方式是
hessian2。
- Dubbo 默认使用的序列化方式是
一般我们不会使用JDK自带的序列化方式,主要原因如下:
- 不支持跨语言调用
- 性能差,序列化之后的字节数组体积较大
JSON序列化由于性能问题,也不被考虑。
7. 结语
- 寒假一直走亲戚,学习效率太低了… Dubbo拖了很久才学完🥲
- 标题: Dubbo
- 作者: yin_bo_
- 创建于 : 2026-01-18 21:31:50
- 更新于 : 2026-02-24 04:14:10
- 链接: https://www.blog.yinbo.xyz/2026/01/18/分布式/Dubbo/
- 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。
