当前位置: 首页 > news >正文

HTTP REST API、WebSocket、 gRPC 和 GraphQL 应用场景和底层实现

HTTP REST API、WebSocket、gRPC 和 GraphQL 是现代分布式系统中常用的通信协议和技术,各自适用于不同的场景,底层实现也有显著差异。以下是它们的详细说明:

1. HTTP REST API

应用场景

  • 通用Web服务:前后端分离的 Web 应用适合资源型操作(CRUD),前后端分离的 Web 应用,如用户管理、订单系统等。
  • 无状态交互:每次请求独立,适合水平扩展的微服务架构。
  • 缓存友好:利用HTTP缓存机制(如CDN、浏览器缓存)。
  • 公开API:标准化、易理解,适合第三方集成。

底层实现

  • 协议:基于HTTP/1.1或HTTP/2,通常使用JSON/XML格式,使用 URL、Method、Headers 和 Body 传输数据。
  • 通信模型:单向请求-响应,客户端发起请求,服务端返回响应。

特点:

  • 无状态:服务端不保存会话状态。
  • 资源导向:通过URI标识资源(如/users/{id})。
  • 动词明确:GET(查询)、POST(创建)、PUT(更新)、DELETE(删除)。

2. WebSocket

应用场景

  • 实时通信:聊天应用、在线协作工具(如Google Docs),实时弹幕、股票行情。
  • 高频数据推送:股票行情、实时游戏状态更新。
  • 双向交互:服务端主动向客户端推送消息(如通知、告警)。
  • 低延迟场景:多人在线游戏、协同编辑(如 Google Docs)。

底层实现

  • 协议:建立在TCP 协议之上,允许客户端和服务器之间进行全双工、双向的实时通信。其底层实现原理主要包括握手、数据传输和连接关闭三个阶段。使用 ws:// 或 wss:// 建立持久连接。
  • 通信模型:全双工双向通信,建立持久连接后双方可随时发送消息。
  • 握手过程:客户端通过 HTTP 请求升级协议(Upgrade: websocket),成功后转为 WebSocket 连接。

特点

  • 有状态:连接保持活跃,服务端可主动推送数据。
  • 低延迟:避免HTTP轮询开销。
  • 帧格式:数据以消息帧(Message Frames)传输,支持文本或二进制。
  • 无头部开销,支持二进制和文本消息,双向实时通信。
// 客户端代码
const socket = new WebSocket("wss://example.com/chat");
socket.send("Hello Server!");

3. gRPC

应用场景

  • 高性能微服务:服务间通信(如Kubernetes内部组件)。
  • 多语言环境:需要跨语言支持,前后端使用不同语言开发(如Java调用Go服务)。
  • 流式数据处理:如文件上传、日志流、实时监控。
  • 高性能场景:需要低延迟、高吞吐量的系统(如支付清算、金融交易)。

底层实现

  • 协议:基于 HTTP/2,使用二进制分帧传输。

  • 序列化:使用 Protocol Buffers(Protobuf即二进制编码)定义接口和数据结构,生成高效代码。

  • 通信模型

    • 单向RPC:类似HTTP请求-响应。
    • 服务端流:客户端发起请求,服务端返回流式响应。
    • 客户端流:客户端发送流式数据,服务端返回单个响应。
    • 双向流:全双工流式交互。

特点

  • 高效序列化:Protobuf比JSON更小更快。
  • 多路复用:HTTP/2支持单连接并行处理多个请求。
  • 自动生成客户端 / 服务器代码,支持流式通信和双向流。

4. GraphQL

应用场景

  • 灵活数据查询:前端按需获取数据(如复杂UI组件), 前端需求变化快,需要灵活的数据结构。。
  • 聚合多数据源:客户端需要从多个数据源获取数据(如社交平台的用户信息 + 动态);统一API网关聚合多个后端服务。
  • 避免Over-fetching(过度获取):减少不必要的数据传输(如移动端低带宽环境)。

底层实现

  • 协议:基于 HTTP,客户端通过 POST 请求发送查询语句(Query),支持WebSocket(订阅功能)。
  • 查询语言:客户端定义需要的数据结构,服务端返回匹配格式的数据。
  • 实时更新:通过subscription(基于WebSocket)。

特点

  • 单一端点(如/graphql),数据按需获取,强类型系统,所有操作发送到同一端点(如/graphql)。
  • 强类型:通过Schema定义数据类型和关系。
  • 解析器:服务端通过解析器函数获取数据。

对比总结

技术协议/传输通信模式数据格式典型场景
HTTP RESTHTTP/1.1或HTTP/2请求-响应JSON/XML通用CRUD、公开API
WebSocketWS(基于HTTP升级)双向全双工文本/二进制实时聊天、高频推送
gRPCHTTP/2单/双向流Protobuf高性能微服务、跨语言调用
GraphQLHTTP/WebSocket查询/订阅JSON灵活查询、数据聚合

使用建议

  • 需要简单、标准化:用REST。
  • 需要实时双向通信:用WebSocket。
  • 追求性能和多语言支持:用gRPC。
  • 前端数据需求复杂:用GraphQL。

实际系统中常组合使用(如REST + WebSocket,或gRPC + GraphQL)。

http://www.lryc.cn/news/590011.html

相关文章:

  • IPv6
  • JavaScript进阶篇——第六章 内置构造函数与内置方法
  • qt 中英文翻译 如何配置和使用
  • AR智能巡检:电力行业数字化转型的“加速器”
  • 二分查找法
  • 力扣面试150(31/150)
  • 坐标系和相机标定介绍,张正友标定法原理,opencv标定
  • C++:现代 C++ 编程基石,C++11核心特性解析与实践
  • NLP:LSTM和GRU分享
  • NO.6数据结构树|二叉树|满二叉树|完全二叉树|顺序存储|链式存储|先序|中序|后序|层序遍历
  • 从零开始的云计算生活——番外4,使用 Keepalived 实现 MySQL 高可用
  • PyTorch 损失函数详解:从理论到实践
  • 《通信原理》学习笔记——第二章
  • Qt小组件 - 7 SQL Thread Qt访问数据库ORM
  • qt udp接收时 丢包
  • FreeRTOS学习笔记之任务调度
  • 《机器学习数学基础》补充资料:标准差与标准化
  • 《Qt信号与槽机制》详解:从基础到实践
  • Qt中实现文件(文本文件)内容对比
  • 若依框架下前后端分离项目交互流程详解
  • ScratchCard刮刮卡交互元素的实现
  • MR 处于 WIP 状态的WIP是什么
  • Django+Celery 进阶:Celery可视化监控与排错
  • 手撕Spring底层系列之:IOC、AOP
  • hadoop 集群问题处理
  • gem install报错解析
  • mac电脑无法阅读runc源码
  • UE5多人MOBA+GAS 24、创建属性UI(一)
  • 从 “洗澡难” 到 “洗得爽”:便携智能洗浴机如何重塑生活?
  • RK3566-EVB开发板如何新建一个产品分支