微服务之间怎么通信:REST、RPC 还是消息队列
【摘要】 拆成微服务后,第一个要决的问题就是"服务之间怎么说话"。REST、RPC、消息队列三种方式各有适用场景,选错要么性能拉胯要么耦合爆炸。聊聊各自的特点和选型思路,配一张三方式对比图。
一、REST / HTTP:最省心的默认选项

最常见的就是 HTTP 接口互调,JSON 当载体。好处是简单、跨语言、抓个包就能看:
// 服务A 调用 服务B 的订单接口
Order order = restTemplate.getForObject(
"http://order-svc/orders/" + id, Order.class);
适合对外暴露、或者跨语言协作。缺点是每次都是文本序列化,性能一般;而且是同步的,B 挂了 A 也得跟着等。
二、RPC:内部高频调用的性能派
服务都在自己技术栈内、调用又特别频繁时,RPC(如 gRPC)用二进制协议,比 REST 快不少,还带接口契约、类型安全。代价是和框架绑定更紧,调试不如 HTTP 直观。
三、消息队列:彻底解耦的异步派
上面两种都是"你问我答"的同步模式。有些场景根本不需要立刻回答——比如"下单成功发个通知"“库存变了更新缓存”。这时候用消息队列(Kafka/RocketMQ)把事件丢出去,谁关心谁订阅:
kafkaTemplate.send("order-created", orderEvent); // 发完就走,不等
好处是调用方和被调用方彻底解耦,还能削峰填谷。代价是变"最终一致",链路排查更复杂。
四、怎么选,一张表说清
| 场景 | 推荐 |
|---|---|
| 对外接口、跨语言 | REST |
| 内部高频、低延迟 | RPC |
| 事件通知、异步解耦 | 消息队列 |
| 既要同步又要解耦 | 混合:核心链路 RPC,旁路事件 MQ |
小结
没有"最好"的通信方式,只有"最合适"的。我的经验是:默认 REST 起步,内部性能瓶颈出现了再上 RPC,真正需要解耦和异步的地方才引入消息队列。一上来全套 MQ,往往是给自己挖坑。通信方式选对了,微服务才算真正"拆得动",不然就是换了个写法写单体。
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)