系统通信方式实战详解:HTTP、RPC、MQ、WebSocket 各用在什么场景?(附 SDK 示例)

文章目录

    • [一、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 只是封装手段

相关推荐
AIFQuant1 小时前
如何利用免费股票 API 构建量化交易策略:实战分享
开发语言·python·websocket·金融·restful
岚天start6 小时前
Python HTTP服务器添加简单用户名密码认证的三种方案
服务器·python·http
ps酷教程7 小时前
HttpPostRequestEncoder源码浅析
http·netty
四月_h8 小时前
vue2项目集成websocket
网络·websocket·网络协议
Marshmallowc8 小时前
强缓存失效了怎么办?深度解析浏览器内存缓存与硬盘缓存的存储逻辑
http·缓存·浏览器原理
Marshmallowc8 小时前
为什么 Webpack 要打包?从 HTTP/1.1 限制到 HTTP/2 多路复用原理详解
前端·http·webpack
星辰徐哥8 小时前
易语言网络通信编程基础:HTTP/HTTPS/TCP/UDP实战开发
开发语言·http·https·udp·tcp·易语言
DevilSeagull8 小时前
HTTP/HTTPS数据包拓展
网络·网络协议·http·https·web渗透·we
码农水水8 小时前
从 OpenFeign 到 RestClient:Spring Cloud 新时代的轻量化 HTTP 调用方案
java·运维·后端·spring·http·spring cloud·面试
REDcker8 小时前
HTTP 状态码清单大全
网络·网络协议·http