Dubbo的负载均衡及高性能RPC调用

Dubbo的负载均衡及高性能RPC调用

Dubbo 的负载均衡策略

负载均衡策略就是当某个服务压力比较大的时候,这时候部署多个节点同时提供相同的服务

当服务消费者来消费的时候,可以从这多个节点中选择一个节点进行消费,这个选择的过程,就是 负载均衡

Dubbo 提供了多种负载均衡策略:

Random LoadBalance

基于权重的随机负载均衡策略,为 Dubbo 的 默认策略

特点就是:根据每个服务的权重来设置它的随机概率,如下图

RoundRobin LoadBalance

基于权重的轮询负载均衡策略,一般不使用该策略

因为轮询的话有一个比较致命的问题,如果其中有一台机器处理请求的速度比较慢,那么当一个请求被转发到很慢的机器上之后,很久都没有处理完,会导致其他请求也会被转发到这个机器上,导致该机器上堆积很多请求,更加处理不过来了

LeastActive LoadBalance

最少活跃负载均衡策略,也就是看哪台机器上活跃的请求比较少

Dubbo 对活跃数的定义:当服务收到一个请求,活跃数 +1,当 Dubbo 处理完一个请求,活跃数 -1

Dubbo 就认为谁的活跃数越少,谁的处理速度就越快,性能也越好,这样的话,我就优先把请求给活跃数少的服务提供者处理

  • 如果活跃的请求数量较少,说明该机器的性能是比较高的,有请求的话优先给该机器处理
  • 如果活跃的请求数量较多,说明该机器的处理速度较慢,请求分给该机器的话可能会造成请求堆积

ConsistentHash LoadBalance

一致性 Hash 负载均衡策略

可以保证相同参数的请求总是发到同一提供者,当某一台提供者机器宕机时,原本发往该提供者的请求,将基于虚拟节点平摊给其他提供者,这样就不会引起剧烈变动。

基于注解配置负载均衡策略

java 复制代码
@Reference(loadbalance = "roundrobin")
HelloService helloService;

Dubbo 的高性能 RPC 调用

Dubbo 的高性能 RPC 调用离不开它的序列化协议、通信协议,那么接下来就从这两方面来介绍

Dubbo 的序列化协议

Dubbo 中支持多种序列化协议,在 Dubbo3.2 版本之前使用 Hessian2 作为默认的序列化方式,在 Dubbo3.2 版本之后使用 FastJSON2 作为默认的序列化方式

Hessian、Hessian2

在 Dubbo3.2 版本之前使用 Hessian2 作为默认的序列化方式

Hessian 序列化是一种支持动态类型、跨语言、基于对象传输的网络协议

Dubbo 中使用的 Hessian2 是阿里基于 Hessian 所做的升级版本

相比 Hessian1,Hessian2中增加了压缩编码,其序列化二进制流大小是 Java 序列化的50%,序列化耗时是 Java 序列化的30%,反序列化耗时是 Java 序列化的20%

相比于 Java 序列化,Hessian2 无论是从 序列化速度 还是 序列化后的体积 上都存在非常大的优势!

配置启用:

yml 复制代码
# application.yml (Spring Boot)
dubbo:
 protocol:
   serialization: hessian2

FastJSON、FastJSON2

在 Dubbo3.2 版本之后使用 FastJSON2 作为默认的序列化方式(FastJSON2 仅在 Dubbo > 3.1.0 版本支持)

FastJSON 是阿里开源的高性能 JSON 解析库

FastJSON 的特点就是

但是 FastJSON 中存在一些安全漏洞,因此 FastJSON2 对其进行升级,在 性能安全性 上都有所提升!

FastJSON2 使用方式:

引入依赖:

引入依赖:

xml 复制代码
<dependencies>
    <dependency>
        <groupId>com.alibaba.fastjson2</groupId>
        <artifactId>fastjson2</artifactId>
        <version>2.0.23</version>
    </dependency>
</dependencies>

配置启用:

yaml 复制代码
# application.yml (Spring Boot)
dubbo:
 protocol:
   serialization: fastjson2

Protobuf

全称 Google Protocol Buffer,简称 Protobuf,由 Google 公司开发

Protocol Buffers 是一种轻便高效的 结构化 数据存储格式 (和 json、xml 文件类似),可以用于结构化数据串行化、或者说序列化,非常适合用于做 数据存储 或者 RPC 数据交换

Protocol 相比于 xml、json 来说,体积更小,解析更快

  • 应用场景:

就比如现在有一个 Java 项目和 Go 项目之间要相互通信,两个模块之间对于数据的定义可能是不同的,并且 Java 语言和 Go 也是不兼容的,比如你要传输一个 User 类,在 Java 和 Go 中的定义肯定是不一样的

那么怎么来传输呢?

通过 Protobuf 来定义一个 User 数据对象(假设定义在 user.proto 文件),这个数据对象在 Java 和 Go 中都需要使用, 那么在 Java 中根据 user.proto 文件生成 Java 中的类对象,在 Go 中根据 user.proto 文件生成 Go 中的类对象 ,即可完成不同语言项目之间的通信

并且 Protobuf 在 序列化方面 也有很大的优势,可以很大程度上减小序列化后的体积,比如 proto 文件定义 User 类如下:

protobuf 复制代码
message User {
    string uid = 1;
    string username = 2;
}

那么一般在序列化传输数据的时候,需要传输数据的 key 和 value

而使用了 Protobuf 之后,在序列化的时候,不需要传输数据的 key 了,因为 key 已经在 proto 文件中定义了,只需要传输 value,因此 序列化后的数据体积减小很多!

  • 配置启用:
yaml 复制代码
# application.yml (Spring Boot)
dubbo:
 protocol:
   serialization: protobuf

Avro

Avro 是一种远程过程调用和数据序列化框架,使用 JSON 来定义数据类型和通讯协议,使用压缩二进制格式来序列化数据,它主要用于Hadoop,是 Hadoop 持久化数据的一种序列化格式

其他序列化协议

还有其他很多序列化协议,如 FST、Gson、Kryo、MessagePack,这里就不一一介绍了

获取更多干货内容,记得关注我哦。

本文由博客一文多发平台 OpenWrite 发布!

相关推荐
roman_日积跬步-终至千里1 分钟前
【深度学习】从前向传播到反向传播:用两层 sigmoid 网络把 Backprop 一次讲透
人工智能·深度学习
sinat_286945193 分钟前
claude code上下文
人工智能·深度学习·prompt
逐梦苍穹7 分钟前
去掉一层东西,Claude.ai直接快了 65%
人工智能·claude
x-cmd16 分钟前
[x-cmd] 终端里的飞书:lark-cli,让 AI Agent 拥有“实体办公”能力
java·人工智能·ai·飞书·agent·x-cmd
吾日三省Java30 分钟前
SpringBoot锁设计:让你的系统不再“抢”出问题!
java·spring boot·设计思路
jinanwuhuaguo34 分钟前
OpenClaw深度沟通渠道-全景深度解构
大数据·开发语言·人工智能·openclaw
软件资深者35 分钟前
OpenClaw 本地安装 vs 网页版龙虾:全方位对比 + 2026 最新一键安装客户端(新手零门槛搭建专属 AI 助理)
运维·人工智能·自动化·飞书·数字员工·openclaw·龙虾
XXOOXRT35 分钟前
Ubuntu搭建Java项目运行环境(JDK17+MySQL8.0)超详细教程
java·linux·mysql·ubuntu
m0_7190841137 分钟前
启动命令111
java
北鸟南游44 分钟前
使用AI智能体的MCP和SKILL
人工智能·程序员·前端框架