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 发布!

相关推荐
番茄不是西红柿kk3 小时前
AtomGit CodingPlan限时免费、限量 500 人/天
人工智能
深圳市益普科技有限公司3 小时前
SMT 产线 MES 怎么管“钢网、刮刀、feeder”这些易耗辅料:防错与寿命追踪
人工智能
SL_staff3 小时前
JVS-Logic:从页面配置工具到企业级业务逻辑中枢的技术演进
java·算法·全栈
科研小牛马3 小时前
北航何静:DeepSeek Harness,部署操作教程
人工智能
朝阳资本论3 小时前
机器人的智能短板,大晓世界模型补齐
人工智能
YFJ_mily3 小时前
9.24早鸟通道即将关闭|IMRA2026智能制造机器人自动化IEEE会议|往届EI稳定检索,设有学生专属投稿权益
人工智能·机器学习·机器人·自动化·智能制造·rdlink研发家·马鞍山会议
DevRay3 小时前
Java 21虚拟线程深度实战:告别线程池焦虑,百万并发吞吐量直接翻倍(原理+代码+避坑)
java·开发语言
陌シ未央ゞ3 小时前
基于BM25算法和RRF实现的混合索引(java版)
人工智能·spring boot·后端·算法
jsl_jsl_jsl3 小时前
《Skill 与定时任务:让 Agent 在没人说话时也能干活》
人工智能
事界见闻3 小时前
网页版AI 3D工具通常能完成哪些基础工作?生成、处理与导出流程对比
人工智能·3d