---
title: 微服务调用方式全景
type: concept
domain: microservice
tags: [microservice, rpc, http, grpc, mq, async, feign, dubbo, thrift]
status: mastered
created: 2026-09-27
last_reviewed: 2026-09-27
method: feynman
related_questions:
  - "各个微服务之间，有哪些调用方式？"
related_knowledge:
  - ./microservice-architecture.md
  - ./resilience-patterns.md
anki_cards: 6
interview_rounds:
  - "2026-09-27-round-1-Q5"
---

# 微服务调用方式全景

> 核心分类是**同步 vs 异步**（不是协议枚举）。同步调用必备治理四件套：超时、重试、熔断、幂等。

## 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 两种"
- **结论 B**：HTTP 也是跨网络调用，同样需要治理（超时/重试/熔断/幂等）——"不用做额外处理"是错的
- **结论 C**：RPC 是一整套生态：IDL + 序列化 + 服务发现 + 负载均衡，不是"单独实现"
- **结论 D**：选型原则：强一致实时→同步；解耦削峰最终一致→异步

## 完整讲解（费曼四步）

### STEP 1 · 概念

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

### STEP 2 · 大白话

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

### STEP 3 · 底层

**同步通信 4 种**：

| 方式 | 协议 | 序列化 | 特点 | 客户端 |
|------|------|--------|------|--------|
| RESTful HTTP | HTTP/1.1/2 | JSON/XML | 简单、跨语言、易调试 | OpenFeign/WebClient/RestTemplate |
| gRPC | HTTP/2 | Protobuf | 多路复用、强类型、4 种流模式 | grpc-java |
| Dubbo | 自定义（Netty） | Hessian2/Protobuf | 阿里生态、Java 优先 | @Reference |
| Thrift | 自定义 | Protobuf/JSON | Facebook 出品、跨语言 | @ThriftService |

**gRPC 4 种流模式**：
1. Unary（一对一）：客户端发一次请求，服务端返回一次响应
2. Server-Streaming：客户端发一次，服务端多次响应
3. Client-Streaming：客户端多次发送，服务端返回一次
4. Bidirectional：双向流，双方都可以多次发送

**异步通信 2 类**：
- **消息队列**：Kafka（日志流、大吞吐）、RabbitMQ（复杂路由）、RocketMQ（事务消息）、Pulsar（分层存储）
- **事件驱动**：Event Bus + Event Sourcing，服务发领域事件，其他服务订阅

**反模式**：
- **共享数据库（DB as Message Bus）**：数据强一致但强耦合，通常不推荐
- **直接调用内部函数**：无法解耦、无法独立部署，违背微服务初衷

**同步调用必备治理四件套**：
1. **超时**：默认不设会导致线程池打满，connectTimeout + readTimeout
2. **重试**：网络抖动；只对**幂等**接口重试
3. **熔断**：下游挂了要快速失败（Sentinel/Hystrix/Resilience4j）
4. **幂等**：重试安全的前提；用请求 ID 或业务单号
5. **链路追踪**（附加）：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；同步必配四件套（超时/重试/熔断/幂等）+ 链路追踪。

## 常见误区（从面试记录提炼）

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

## 延伸追问（面试追问预演）

1. **HTTP 调用为什么还需要治理？**
   - 要点：跨网络调用要考虑超时（默认不设导致线程池打满）、重试（网络抖动）、熔断（下游挂了要快速失败）、幂等（重试要安全）、链路追踪（traceId 透传）。HTTP 只是协议，治理是必需的。
2. **gRPC 相比 HTTP/JSON 好在哪？**
   - 要点：HTTP/2 多路复用避免队头阻塞、Protobuf 二进制压缩率高、强类型契约（.proto）、支持双向流式通信、跨语言自动代码生成。
3. **什么场景必须用异步消息？**
   - 要点：下单后通知库存扣减、通知积分、通知风控——这些是副作用，可以延迟；下游挂了不能阻塞下单主流程；MQ 削峰，避免秒杀流量打爆下游。
4. **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（响应式，推荐）
```

## 关联题目（题库）

- [x] 《各个微服务之间，有哪些调用方式？》—— 2026-09-27 Round 1 Q5, 评分 ⭐⭐

## 关联知识

- [微服务架构演进与特征](./microservice-architecture.md)
- [限流降级熔断](./resilience-patterns.md)

## Anki 候选卡片

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

---

*最后更新：2026-09-27*
