系统通信方式实战详解: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 只是封装手段

相关推荐
明天也要努力学习7 小时前
HTTP 协议的基本格式和 fiddler 的用法
网络协议·http·fiddler
cpolar技术支持11 小时前
网关加 gzip,同时开启 chunked,下载回来的包解不开:把两层编码的解压顺序与长度核对做成只读页
python·http·网络编程·socket·内网穿透
web打印社区16 小时前
Chrome-kiosk-printing能上生产吗
开发语言·前端·javascript·chrome·websocket
阿正的梦工坊18 小时前
深入理解 JSON-RPC 2.0:轻量级远程调用协议详解
rpc·json
骑着蜗牛撵大象32719 小时前
手写一个 HTTP 服务器:从 socket 到 epoll,Linux 上到底怎么把请求变成响应
linux·服务器·网络·http·epoll·socket编程·并发模型
沫璃染墨20 小时前
从零入门计算机网络系列(十):HTTP协议进阶——从资源路径解析到状态码与请求头详解
linux·运维·服务器·网络·c++·http
|_⊙20 小时前
应用层协议HTTP与HTTPS
网络·网络协议·http
路由侠内网穿透.1 天前
本地部署开源 WSGI HTTP 服务器 Gunicorn 并实现外部访问
运维·服务器·网络·网络协议·http·开源
川石课堂软件测试1 天前
学习软件测试需掌握的一些知识
数据库·python·sql·功能测试·网络协议·mysql·http
靠coding维持生计的potato2 天前
从HTTP到存储——文件上传的底层原理梳理
http