文章目录
-
- [一、HTTP / HTTPS:用户主动发起的业务操作](#一、HTTP / HTTPS:用户主动发起的业务操作)
-
- [1️⃣ 典型场景](#1️⃣ 典型场景)
- [2️⃣ 为什么用 HTTP?](#2️⃣ 为什么用 HTTP?)
- [3️⃣ 示例代码(Spring Boot)](#3️⃣ 示例代码(Spring Boot))
- 二、RPC:内部服务之间的高性能调用
-
- [1️⃣ 典型场景](#1️⃣ 典型场景)
- [2️⃣ 为什么用 RPC?](#2️⃣ 为什么用 RPC?)
- [3️⃣ 示例代码(伪 RPC 示例)](#3️⃣ 示例代码(伪 RPC 示例))
- [三、消息队列 MQ:系统解耦的核心手段](#三、消息队列 MQ:系统解耦的核心手段)
-
- [1️⃣ 典型场景](#1️⃣ 典型场景)
- [2️⃣ 为什么用 MQ?](#2️⃣ 为什么用 MQ?)
- [3️⃣ 示例代码(Kafka)](#3️⃣ 示例代码(Kafka))
- [四、WebSocket:实时通知 / 信令通信](#四、WebSocket:实时通知 / 信令通信)
-
- [1️⃣ 典型场景](#1️⃣ 典型场景)
- [2️⃣ 为什么用 WebSocket?](#2️⃣ 为什么用 WebSocket?)
- [3️⃣ 示例代码(服务端)](#3️⃣ 示例代码(服务端))
- 五、推送(Push):离线兜底通知
-
- [1️⃣ 典型场景](#1️⃣ 典型场景)
- [2️⃣ 为什么需要推送?](#2️⃣ 为什么需要推送?)
- [3️⃣ 典型逻辑(伪代码)](#3️⃣ 典型逻辑(伪代码))
- [六、SDK 的正确位置(不是通信方式)](#六、SDK 的正确位置(不是通信方式))
-
- [1️⃣ SDK 是什么?](#1️⃣ SDK 是什么?)
- [2️⃣ 典型场景](#2️⃣ 典型场景)
- [3️⃣ 示例代码](#3️⃣ 示例代码)
- [4️⃣ 常见 SDK 与真实通信方式](#4️⃣ 常见 SDK 与真实通信方式)
- [七、通信方式 × 场景总结表(CSDN 收藏级)](#七、通信方式 × 场景总结表(CSDN 收藏级))
- 八、全文总结
在实际项目中,通信方式不是随便选的 。
HTTP、RPC、MQ、WebSocket 各有明确分工,如果用错地方,系统复杂度会直线上升。
本文从 "真实业务场景 + 示例代码" 出发,系统性梳理主流通信方式,并在最后单独说明 SDK 的正确使用方式。
一、HTTP / HTTPS:用户主动发起的业务操作
1️⃣ 典型场景
用户提交证件更新申请
这是一个同步、强一致的操作,用户需要立刻知道"是否提交成功"。
2️⃣ 为什么用 HTTP?
- 请求--响应模型
- 易做鉴权、幂等
- 明确成功 / 失败结果
3️⃣ 示例代码(Spring Boot)
java
@RestController
@RequestMapping("/kyc")
public class KycController {
@PostMapping("/update")
public Result submitUpdate(@RequestBody KycRequest request) {
// 参数校验
// 落库
// 创建交易记录
return Result.ok("提交成功,等待审核");
}
}
📌 总结
HTTP 适合"用户主动发起、需要明确结果"的业务操作
二、RPC:内部服务之间的高性能调用
1️⃣ 典型场景
订单服务调用库存服务扣减库存
这是内部系统调用,对性能要求高,不需要对外暴露。
2️⃣ 为什么用 RPC?
- 比 HTTP 开销小
- 接口强约束
- 调用方式像本地方法
3️⃣ 示例代码(伪 RPC 示例)
java
// 订单服务
inventoryService.deductStock(skuId, count);
java
// 库存服务
public void deductStock(Long skuId, int count) {
// 扣减库存逻辑
}
📌 总结
RPC 适合"内部微服务之间的高性能调用"
三、消息队列 MQ:系统解耦的核心手段
1️⃣ 典型场景
证件审核通过后,通知多个系统处理后续逻辑
例如:
- 通知服务
- 风控系统
- 数据统计系统
2️⃣ 为什么用 MQ?
- 解耦上下游
- 支持异步
- 支持失败重试
3️⃣ 示例代码(Kafka)
生产消息:
java
kafkaTemplate.send("kyc_result_topic", message);
消费消息:
java
@KafkaListener(topics = "kyc_result_topic")
public void handleResult(String message) {
// 解析消息
// 执行业务逻辑
}
📌 总结
系统之间"谁完成了,其他系统要知道",就用 MQ
四、WebSocket:实时通知 / 信令通信
1️⃣ 典型场景
证件审核完成后,实时通知 App 用户结果
用户在线时,希望立刻看到结果。
2️⃣ 为什么用 WebSocket?
- 长连接
- 服务端可主动推送
- 实时性强
3️⃣ 示例代码(服务端)
java
@OnOpen
public void onOpen(Session session) {
sessions.add(session);
}
public void pushMessage(String msg) {
for (Session session : sessions) {
session.getBasicRemote().sendText(msg);
}
}
客户端接收:
javascript
ws.onmessage = function (event) {
console.log("收到通知:" + event.data);
};
📌 总结
WebSocket 用来"推送结果",而不是"发起业务"
五、推送(Push):离线兜底通知
1️⃣ 典型场景
用户 App 已退出,仍需收到审核结果提醒
2️⃣ 为什么需要推送?
- WebSocket 只能保证在线用户
- 推送覆盖离线场景
3️⃣ 典型逻辑(伪代码)
java
if (!userOnline) {
pushService.send(userId, "你的证件已审核通过");
}
📌 总结
WebSocket 负责实时,推送负责兜底
六、SDK 的正确位置(不是通信方式)
1️⃣ SDK 是什么?
SDK 是对通信方式的封装,不是通信方式本身
2️⃣ 典型场景
调用短信 SDK 发送验证码
3️⃣ 示例代码
java
smsClient.send(phone, "验证码是 123456");
但 SDK 内部实际是:
text
SDK → HTTP 请求 → 短信平台
4️⃣ 常见 SDK 与真实通信方式
| SDK 类型 | 实际通信方式 |
|---|---|
| 短信 / OCR SDK | HTTP |
| 云服务 SDK | HTTP / RPC |
| IM / RTC SDK | WebSocket |
📌 总结
通信方式决定架构,SDK 只影响开发体验
七、通信方式 × 场景总结表(CSDN 收藏级)
| 场景 | 通信方式 |
|---|---|
| 用户提交操作 | HTTP |
| 内部服务调用 | RPC |
| 系统解耦通知 | MQ |
| 实时结果推送 | WebSocket |
| 用户离线提醒 | 推送 |
| 能力快速接入 | SDK |
八、全文总结
HTTP 负责发起
RPC 负责内部
MQ 负责解耦
WebSocket 负责实时
推送负责兜底
SDK 只是封装手段