微服务调用方式全景

microservice ✅ mastered microservice-communication · microservice · rpc · http · grpc · mq · async · feign · dubbo · thrift

TL;DR(30 秒扫完)

  • 同步通信:请求-响应,实时性高、耦合度高
  • RESTful HTTP + JSON:OpenFeign、WebClient
  • gRPC:HTTP/2 + Protobuf,多路复用,4 种流模式
  • Dubbo:阿里 RPC 框架,Netty + 自定义协议
  • Thrift:Facebook 出品,跨语言强
  • 异步通信:发布-订阅,解耦、削峰、最终一致
  • MQ:Kafka/RabbitMQ/RocketMQ/Pulsar
  • Event Bus + Event Sourcing
  • 反模式:共享 DB(DB as Message Bus,一般不推荐)
  • 同步调用必备治理四件套:超时 + 重试 + 熔断 + 幂等(+ 链路追踪)

关键结论

结论 A微服务调用的核心分类是同步 vs 异步,不是"HTTP/RPC 两种"
结论 BHTTP 也是跨网络调用,同样需要治理(超时/重试/熔断/幂等)——"不用做额外处理"是错的
结论 CRPC 是一整套生态:IDL + 序列化 + 服务发现 + 负载均衡,不是"单独实现"
结论 D选型原则:强一致实时→同步;解耦削峰最终一致→异步

完整讲解(费曼四步)

STEP 1 · 概念

微服务调用是跨进程、跨网络的服务间通信,包括同步(请求-响应)和异步(发布-订阅)两大类。

STEP 2 · 大白话

同步像打电话:拨过去等对方接、边讲边等回音,讲完挂。 异步像发邮件/发微信:写完发出去继续做别的,对方什么时候看到什么时候回。

STEP 3 · 底层

同步通信 4 种:
方式协议序列化特点客户端
RESTful HTTPHTTP/1.1/2JSON/XML简单、跨语言、易调试OpenFeign/WebClient/RestTemplate
gRPCHTTP/2Protobuf多路复用、强类型、4 种流模式grpc-java
Dubbo自定义(Netty)Hessian2/Protobuf阿里生态、Java 优先@Reference
Thrift自定义Protobuf/JSONFacebook 出品、跨语言@ThriftService
gRPC 4 种流模式:
  • Unary(一对一):客户端发一次请求,服务端返回一次响应
  • Server-Streaming:客户端发一次,服务端多次响应
  • Client-Streaming:客户端多次发送,服务端返回一次
  • Bidirectional:双向流,双方都可以多次发送
异步通信 2 类:
  • 消息队列:Kafka(日志流、大吞吐)、RabbitMQ(复杂路由)、RocketMQ(事务消息)、Pulsar(分层存储)
  • 事件驱动:Event Bus + Event Sourcing,服务发领域事件,其他服务订阅
反模式:
  • 共享数据库(DB as Message Bus):数据强一致但强耦合,通常不推荐
  • 直接调用内部函数:无法解耦、无法独立部署,违背微服务初衷
同步调用必备治理四件套:
  • 超时:默认不设会导致线程池打满,connectTimeout + readTimeout
  • 重试:网络抖动;只对幂等接口重试
  • 熔断:下游挂了要快速失败(Sentinel/Hystrix/Resilience4j)
  • 幂等:重试安全的前提;用请求 ID 或业务单号
  • 链路追踪(附加):traceId 透传,跨服务追踪(OpenTelemetry/SkyWalking)
选型原则:
  • 强一致 + 实时返回(查询订单、支付确认)→ HTTP/gRPC
  • 解耦 + 削峰 + 最终一致(下单后扣库存、发通知、积分变动)→ MQ
  • 高性能强类型内部通信 → gRPC/Dubbo
  • 快速迭代 + 灵活查询 → GraphQL
Feign vs RestTemplate vs WebClient:
  • Feign:声明式(写接口就行,OpenFeign + 负载均衡)
  • RestTemplate:命令式(编程式,同步阻塞)
  • WebClient:响应式(基于 Netty,支持 HTTP/2 多路复用),Spring 官方推荐替代 RestTemplate

STEP 4 · 简化

口诀:先分同步异步;同步选协议(HTTP/gRPC/Dubbo/Thrift);异步选 MQ;同步必配四件套(超时/重试/熔断/幂等)+ 链路追踪。

常见误区

"HTTP/RPC 两种就完了"
还有 gRPC、Thrift、MQ、GraphQL、共享 DB(反模式)
"HTTP 不用做额外处理"
跨网络调用要考虑超时/重试/熔断/幂等/链路追踪
"RPC 需要单独实现"太模糊
RPC 是 IDL+序列化+服务发现+负载均衡一整套生态

延伸追问

HTTP 调用为什么还需要治理?
要点:跨网络调用要考虑超时(默认不设导致线程池打满)、重试(网络抖动)、熔断(下游挂了要快速失败)、幂等(重试要安全)、链路追踪(traceId 透传)。HTTP 只是协议,治理是必需的。
gRPC 相比 HTTP/JSON 好在哪?
要点:HTTP/2 多路复用避免队头阻塞、Protobuf 二进制压缩率高、强类型契约(.proto)、支持双向流式通信、跨语言自动代码生成。
什么场景必须用异步消息?
要点:下单后通知库存扣减、通知积分、通知风控——这些是副作用,可以延迟;下游挂了不能阻塞下单主流程;MQ 削峰,避免秒杀流量打爆下游。
Feign 和 RestTemplate 和 WebClient 有什么区别?
要点:Feign 声明式(写接口就行,OpenFeign+负载均衡)、RestTemplate 命令式(编程式,同步阻塞)、WebClient 响应式(Netty,HTTP/2 多路复用)。Spring 官方推荐 WebClient 替代 RestTemplate。

速查表

同步 vs 异步(核心分类)
同步:RESTful HTTP(JSON)/ gRPC(HTTP2+Protobuf)/ Dubbo(Netty)/ Thrift
异步:MQ(Kafka/RabbitMQ/RocketMQ/Pulsar)/ Event Bus / Event Sourcing
反模式:共享 DB、内部函数调用
治理四件套:超时 + 重试 + 熔断 + 幂等(+ 链路追踪)
选型:强一致实时→同步;解耦削峰最终一致→异步
客户端:Feign(声明式)/ RestTemplate(命令式)/ WebClient(响应式,推荐)

Anki 候选卡片

Q: 微服务调用核心分类是什么?
A: 同步 vs 异步(不是"HTTP/RPC 两种")
Q: 同步通信 4 种方式?
A: RESTful HTTP+JSON / gRPC(HTTP2+Protobuf)/ Dubbo(Netty)/ Thrift(Facebook)
Q: gRPC 相比 HTTP/JSON 好在哪?
A: HTTP/2 多路复用避队头阻塞 / Protobuf 二进制压缩率高 / 强类型契约 / 双向流 / 跨语言代码生成
Q: gRPC 4 种流模式?
A: Unary / Server-Streaming / Client-Streaming / Bidirectional
Q: 同步调用必备治理四件套?
A: 超时(防线程池打满)+ 重试(只对幂等接口)+ 熔断(快速失败)+ 幂等(重试前提)+ 链路追踪(traceId 透传)
Q: Feign/RestTemplate/WebClient 区别?
A: Feign 声明式(OpenFeign+LB)/ RestTemplate 命令式同步阻塞 / WebClient 响应式 Netty+HTTP2 多路复用(推荐替代 RestTemplate)

关联题目

  • [x] 《各个微服务之间,有哪些调用方式?》—— 2026-09-27 Round 1 Q5, 评分 ⭐⭐
  • 关联知识

    同步 vs 异步二分法;HTTP/gRPC/Dubbo/MQ 全景;治理四件套
    ✦ 记 忆 口 诀 ✦
    同步 vs 异步 / gRPC HTTP2+Protobuf / 治理四件套
    关键可视化
    暂无可视化
    知识关系

    ⬆️ 前置(Prerequisite)

    暂无

    🔄 延伸(Extends)

    暂无

    ⚡ 对比(Contrast)

    暂无
    🎯 概念 📏 规则 ⚠️ 误区 🔍 追问 ✨ 口诀 共 0 张卡,点击翻面