分布式通信最全详解(图文全面总结)

分布式通信是大型架构核心,下面我详解分布式通信@mikechen

分布式通信

分布式通信,是分布式系统(由多个通过网络互联的独立节点组成)中,各节点之间交换数据和同步信息的机制。

分布式通信最全详解(图文全面总结)

实现远程协同: 允许一个节点调用另一个节点上的功能或获取数据。

隐藏网络细节: 让开发者感觉像调用本地方法一样简单(透明化)。

提供高效可靠的传输: 保证数据能够快速、正确地到达目标节点。

 

分布式通信实现

分布式通信框架的实现,本质上就是解决如何将一个本地函数调用转换成网络传输。

并在远程机器上执行、再将结果返回的问题,这涉及以下几个核心步骤:

分布式通信最全详解(图文全面总结)

核心机制 1:序列化(Serialization)

由于网络传输的只是字节流,调用方必须将复杂的编程语言对象。

(如函数参数、返回值),转换为可传输的字节序列,这个过程称为序列化或编组(Marshalling)。

常见方式:

二进制格式: Protocol Buffers (Protobuf), Hessian2, Thrift Binary。

 

核心机制 2:协议栈(Protocol Stack)

定义了数据在网络上传输时的格式和规则。

传输协议 (Transport Layer):

TCP: 面向连接、可靠传输,是大多数高性能 RPC 框架(如 Dubbo、Thrift)的首选。

HTTP: 基于请求/响应模型,是 RESTful API 和 gRPC (HTTP/2) 的基础。

例如,HTTP/2 协议支持多路复用,大大提高了 gRPC 的并发性能。

 

核心机制 3:服务注册与发现(Service Discovery)

调用方,如何知道服务提供方的网络地址(IP:Port),这就会涉及到:服务注册与发现。

服务注册: 服务提供方启动时,将自己的服务名称和地址等信息注册到注册中心(如 ZooKeeper, Nacos, Eureka)。

服务发现: 服务调用方通过注册中心获取到目标服务的可用地址列表,然后进行远程调用。

 

核心机制 4:网络代理层(Proxy/Stub)

框架在客户端和服务器端生成的代码层,用于透明地处理网络细节。

Stub (客户端代理): 接收本地调用,负责参数的序列化、发送请求、等待响应,并进行响应的反序列化。

Skeleton (服务器端骨架/代理): 负责接收请求、参数的反序列化,调用真正的业务逻辑,并将结果序列化后返回。

 

分布式通信框架

分布式通信最全详解(图文全面总结)

四大框架对比总结:

特征 gRPC Dubbo Thrift OpenFeign
通信模型 RPC RPC RPC 声明式 HTTP 客户端
主要协议 HTTP/2 Dubbo/TCP 自定义 TCP 协议 HTTP/1.1 / HTTP/2
序列化 Protobuf (默认) Hessian2 (默认) 自定义二进制 JSON/XML (默认)
跨语言性 优秀 (通过 Protobuf IDL) 一般 (主战场在 Java) 极强 (设计目标) 依赖于 HTTP 协议的通用性
服务治理 基础 (需依赖生态) 极强 (内置) 基础 (需自行实现) 强 (高度集成 Spring Cloud)
性能 极高 (Protobuf + HTTP/2) 高 (私有 TCP 协议) 高 (二进制协议) 中等 (依赖于 HTTP 性能)
开发效率 高 (IDL 代码生成) 极高 (Java 环境) 高 (IDL 代码生成) 极高 (声明式接口)

如果您的系统需要极致的性能,并且是多语言混合架构: gRPC 是最佳选择。

如果您的系统是纯 Java 技术栈,且对服务治理(负载均衡、容错等)有严格要求: Dubbo 是国内成熟的首选。

如果您的系统包含大量异构语言服务(如 C++、Python、Java 之间通信): Thrift 是一个稳定可靠的选择。

如果您的系统基于 Spring Cloud 且通信主要采用 RESTful API,追求开发速度和易用性: OpenFeign 是最方便快捷的工具。

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧