微服务通信方式分类
- 微服务通信主要分为同步通信 和异步通信两大类,根据业务场景、性能需求和解耦程度选择不同的实现方式。
一、同步通信:实时交互的"直接对话"
-
RESTful API(HTTP REST)
-
原理 :
基于HTTP协议
,通过URL路径和标准方法(GET/POST等)实现请求-响应模式进行通讯,实现数据交换 -
数据格式通常为
JSON
或XML
。 -
常用于
浏览器
和服务器
之间的通信,外部接口
或第三方接口
通讯。 -
优点 :
简单通用、跨语言支持、适合浏览器交互
。 -
缺点 :
文本传输效率较低,高并发场景易出现延迟
。 -
适用场景 :
外部接口、低频实时调用
(如用户信息查询)。不适合对实时性要求非常高的场景 -
代码示例 :
java// Order Service调用User Service(网页1示例简化) public User getUserById(String userId) { String url = "http://user-service/users/" + userId; return restTemplate.getForObject(url, User.class); }
-
-
RPC(远程过程调用)
-
原理 :基于HTTP/2协议 和Protobuf二进制序列化 ,支持
多路复用
和流式传输
,性能比REST高3-5倍。 -
允许一个服务像调用本地方法一样调用另一个服务的方法
-
将方法调用封装成网络数据包在不同进程之间传输,实现不同服务间的调用
-
可以提高调用的效率和性能,但可能需要更多的配置和管理工作
-
常用于内部微服务之间的方法调用
-
优点:高效、强类型接口、自动生成代码。
-
缺点:需预定义.proto文件,对浏览器支持较弱。
-
适用场景:内部服务间高频调用(如支付系统处理交易)。
-
代码示例 :
protobuf// 定义.proto接口(网页1示例) service UserService { rpc GetUser (UserRequest) returns (UserResponse); }
-
二、异步通信:解耦的"消息传递"
1. 消息队列通讯(MQ)
-
原理 :服务通过消息中间件(如Kafka、RabbitMQ)发送/订阅消息 ,异步消息传递,实现服务之间的
解耦
和削峰填谷
。 -
优点:异步处理、故障容忍、支持广播。
-
缺点:数据一致性需额外保障(如事务消息)。
-
适用场景:订单处理、日志收集、事件通知。
-
代码示例 :
java// 订单创建后发送事件(网页5示例) kafkaTemplate.send("ORDER_CREATED", new OrderEvent(order));
2. 事件驱动
- 原理 :服务通过发布/订阅事件(如订单已支付)触发后续操作,结合事件溯源记录完整状态变化。 一旦某个服务发生了某个事件,就会触发其他服务的响应。
- 可以实现服务的
松耦合
和事件的实时处理
,典型的实现如Event Bus
。 - 优点:松耦合、可追溯、支持最终一致性。
- 缺点:架构复杂度高。
- 适用场景:电商库存扣减、账户余额计算。
三、特殊场景通信
WebSocket
- 原理 :基于
TCP长连接
实现双向实时
通信。常用于实时推送场景,服务间可以维持长期的 TCP 连接 进行数据交换。 - 适用场景 :
即时聊天
、实时数据推送
(如股票行情)。
四、通信选型决策指南
- 是否需要实时响应?
- 是 →
同步通信(外部用REST,内部用gRPC)
。 - 否 →
消息队列异步处理
。
- 是 →
- 是否需跨语言支持?
- 是 →
REST或gRPC(Protobuf跨语言特性)
。
- 是 →
- 是否需高吞吐量?
- 是 →
Kafka等分布式消息队列
。
- 是 →
五、RESTful VS RPC
功能用途不同
- RESTful
- 浏览器跟服务器之间的通讯
- 实现基于请求-响应模式的通讯
- 支持无状态和有状态的交互
- RPC
- 用于远程过程调用,用于计算不同节点间的通讯
- 允许应用通过网络调用远程
- 轻松实现分布式系统的集成
数据格式不同
- RESTful
- 使用文本格式来传输数据,通常使用JSON或xml进行序列化
- RPC
- 使用二进制传输数据,如 Protocol Buffers(ProtoBuf)或 Apache Thrift。
性能不同
- RESTful
- 基于HTTP协议,报文头信息使得传输的数据量相对较大,传输效率较低。
- RPC
- RPC 的协议设计更加轻量级,可以对传输的数据进行二进制压缩,请求报文体积更小,提高传输效率。
RESTful通讯方式
- RestTemplate
- Spring内置用于执行http请求
- Spring Cloud OpenFegin
- 提供声明式的 HTTP 客户端
RPC通讯方式
- Dubbo
- Java高性能服务框架,基于TCP或HTTP的RPC远程过程调用
- 支持负载均衡跟容错,自动服务注册跟发现
- gRPC
- 高性能、通用开源RPC框架,主要面向移动应用开发
- 基于HTTP/2协议标准设计
- 使用 ProtoBuf(Protocol Buffers)作为序列化工具和接口定义语言
六、流程图
graph TD
客户端 --> API网关路由/认证
API网关 -->|REST/gRPC| 服务A
服务A -->|MQ| 服务B
服务B -->|WebSocket| 客户端
API网关 -->|WebSocket| 客户端
总结
微服务通信选型需权衡实时性 、性能 和解耦需求。同步通信适合强一致性场景,异步通信则提升系统弹性和扩展性。实际应用中常采用混合模式(如API网关+REST+MQ)实现最佳平衡。