Dubbo3技术一套通之通信概述

前言

在之前的文章中,我们对 Dubbo 进行了简要介绍并搭建了开发框架。从本文开始,我们将深入探讨 Dubbo 中的各种特性。今天,我们将重点介绍 Dubbo 在通信过程中可能涉及的一系列问题

通信协议

在 Dubbo 的 RPC 调用过程中,我们常常需要在客户端和服务端之间传递数据 。这就涉及到了通信协议 的重要性,它定义了数据在通信中的格式和规范 ,确保调用者和被调用者之间能够正确解析和处理传输的数据,使通信变得有意义。正如童谣所说:'天王盖地虎,宝塔镇河妖!' ,协议就像是通信的 '约定',让数据传输变得更加有序和可靠

通信协议主要分为两类:

  • 应用层协议:比如HTTP1.x以及HTTP2.x
  • 传输层协议
    • 私有协议:我们自己封装的一种数据传输的格式,比如数据传输为name:aomsir;pass:123456;,比如下面的dubbo协议。注意,Dubbo3不仅仅只提供dubbo一种协议,还支持多种协议

注:协议详解会在后续的章节进行详细讲解

xml 复制代码
<dubbo:protocol name="dubbo" port="-1"/>

通信方式

在服务通信中,使用传输层协议和应用层协议会涉及不同的通信方式 。对于传输层协议,我们可以选择使用诸如BIONIONettyMina等通信方式;而在应用层协议中,我们通常可以借助现有的解决方案来实现通信,如TomcatJettyResin等。对于Dubbo 3,其默认内置的传输层通信方式是Netty4 (在服务启动时会产生大量的日志),但也可以通过transporter属性进行替换和定制

java 复制代码
20:19:38.423 [main] DEBUG io.netty.channel.MultithreadEventLoopGroup - -Dio.netty.eventLoopThreads: 16
20:19:38.449 [main] DEBUG io.netty.util.concurrent.GlobalEventExecutor - -Dio.netty.globalEventExecutor.quietPeriodSeconds: 1
20:19:38.462 [main] DEBUG io.netty.util.internal.InternalThreadLocalMap - -Dio.netty.threadLocalMap.stringBuilder.initialSize: 1024
20:19:38.462 [main] DEBUG io.netty.util.internal.InternalThreadLocalMap - -Dio.netty.threadLocalMap.stringBuilder.maxSize: 4096
20:19:38.534 [main] DEBUG io.netty.util.internal.PlatformDependent0 - -Dio.netty.noUnsafe: false
20:19:38.535 [main] DEBUG io.netty.util.internal.PlatformDependent0 - Java version: 8
20:19:38.538 [main] DEBUG io.netty.util.internal.PlatformDependent0 - sun.misc.Unsafe.theUnsafe: available

序列化

简介

在网络通信中,通信协议和通信方式已经足够支持开发和使用。然而,协议中传输的数据是否能够以更高效的格式 进行传输是一个关键问题。使用良好的数据传输格式可以显著减小数据体积,从而提高传输效率。举例来说,对于同样大小的50KB数据块,采用良好的传输格式可能只需要1KB,而采用不合适的格式可能需要100KB。这个问题的解决方案就是序列化。Dubbo 考虑到了这一问题,为我们提供了一系列序列化方案,帮助我们将网络传输中的数据以特定格式传输,从而降低数据体积,提高传输效率

Dubbo的序列化方案

Dubbo提供了一系列的序列化方式,挑出几个常用的方式

  • Hessian2:Dubbo协议中默认的序列化实现方案
  • Java Serialization:JDK序列化方式
  • Dubbo序列化:阿里尚未开发成熟的高效Java序列化实现,不建议生产环境使用
  • JSON序列化:两种实现:fastjson库与Dubbo自己实现的简单JSON库
  • Kyro序列化:Java序列化方式,后续将替换默认的Hessian2,是一种非常成熟的序列化实现,已在Twitter、Groupon、Yahoo中广泛使用
  • FST序列化:Java序列化方式,后续替换Hessian2,是一种比较新的序列化的实现,缺乏成熟使用案例
  • 跨语言序列化方式ProtobufThriftAvroMsgPack(可以将JSON串转化的更小)

效果展示

如下展示了Java方面使用Dubbo提供的序列化方案进行序列化的效果

总结

本篇文章讲解了Dubbo进行RPC通信过程中通信方式通信协议序列化 的问题,把Dubbo与网络的面纱又揭开一部分。不得不服Dubbo的设计,对于通信协议、通信方式以及序列化,预留了槽位 ,我们可以根据我们的具体需要选择Dubbo所提供的各种方式,也可以在Dubbo源码的基础上,基于它所预留的槽位进行定制化开发

参考文献

相关推荐
stark张宇1 天前
微服务架构必备:Gin + gRPC + Consul + Nacos + GORM 打造用户服务
微服务·gin·grpc
阿里云云原生4 天前
MSE Nacos Prompt 管理:让 AI Agent 的核心配置真正可治理
微服务·云原生
阿里云云原生4 天前
阿里云微服务引擎 MSE 及 API 网关 2026 年 1 月产品动态
微服务
麦聪聊数据5 天前
统一 Web SQL 平台如何收编企业内部的“野生数据看板”?
数据库·sql·低代码·微服务·架构
云司科技codebuddy5 天前
技术支持过硬Trae核心代理
大数据·运维·python·微服务
递归尽头是星辰5 天前
微服务事务分级治理:从 Seata 全模式到 TDSQL 实战
微服务·云原生·架构·分布式事务·事务分级治理
没有bug.的程序员5 天前
订单系统重构史诗:从单体巨兽到微服务矩阵的演进、数据一致性内核与分布式事务
java·微服务·矩阵·重构·分布式事务·数据一致性·订单系统
江西理工大学小杨5 天前
高性能 C++ 社交平台4:基于 Boost.Beast 的 WebSocket 网关实现
c++·websocket·微服务
麦聪聊数据5 天前
数据流通的最后一公里:SQL2API 在企业数据市场中的履约架构实践
数据库·sql·低代码·微服务·架构
知识即是力量ol6 天前
微服务架构:从入门到进阶完全指南
java·spring cloud·微服务·nacos·架构·gateway·feign