分享一个大牛的人工智能教程。零基础!通俗易懂!风趣幽默!希望你也加入到人工智能的队伍中来!请轻击人工智能教程https://www.captainai.net/troubleshooter
这三者都是常用的通信协议,但设计目标和应用场景有本质区别。简单来说:
RPC(远程过程调用):让你像调用本地函数一样调用远程服务。
HTTP(超文本传输协议):一种通用的、无状态的请求-响应协议。
WebSocket:一种在单个TCP连接上建立的全双工、持久化的通信协议。
下面是它们的核心区别,从抽象到具体:
1. 通信模型与方向
RPC:请求-响应。客户端发起调用,等待服务端返回结果。通常是同步的,但也可以实现异步。
HTTP/1.1:请求-响应。经典的一问一答,客户端不请求,服务端就不能主动发消息。
WebSocket:全双工、双向、持久化。连接建立后,客户端和服务端可以在任何时间主动向对方发送消息,没有“谁请求谁响应”的限制。
2. 协议与消息格式
RPC:
传输层:通常运行在TCP协议上,也可以运行在HTTP/2之上(如gRPC)。
数据格式:高效、紧凑的二进制格式(如Protobuf、Thrift、MessagePack)或JSON。二进制是RPC高性能的关键。
自定义:RPC框架(如gRPC、Dubbo)会定义自己的应用层协议规则,比纯文本的HTTP更紧凑。
HTTP:
传输层:基于TCP。
数据格式:文本化的请求行、头部和可选的消息体(常用JSON、XML、HTML等)。HTTP头部包含大量元数据,体积较大,传输效率相对较低。
WebSocket:
传输层:基于TCP。
协议:它需要通过一次HTTP升级请求来建立连接(这就是常说的“握手”)。连接建立后,就切换为WebSocket自己的轻量级二进制帧协议,头部开销非常小(约2-10字节)。
3. 连接管理
RPC:可以复用长连接(如gRPC基于HTTP/2的单一连接),减少握手开销。但连接不是必须持久的,也可以短连接。
HTTP/1.1:可以复用TCP连接(
Keep-Alive),但本质上还是多个“请求-响应”串在一条连接上。队头阻塞问题(一个慢请求堵住后面的请求)依然存在。WebSocket:持久的长连接。一旦建立,理论上会一直保持,直到一方主动关闭。连接状态是持续维护的。
4. 状态管理
RPC:通常是有状态的。连接本身可以维持会话上下文,一个连接上的多个请求天然关联。
HTTP:无状态。每个请求都是独立的,服务器默认不记住客户端。需要通过Cookies、Session、Token等机制来模拟状态。
WebSocket:有状态。连接本身就代表了会话,双方可以清晰地知道对方是否在线。
5. 性能与适用场景
| 特性 | RPC | HTTP | WebSocket |
|---|---|---|---|
| 消息大小 | 极小(二进制) | 较大(文本头) | 极小(二进制帧) |
| 延迟 | 低 | 相对较高(新建连接时更高) | 极低(连接建立后) |
| 实时性 | 一般(依赖客户端调用) | 差(纯轮询或长轮询代价高) | 极强(服务端主动推送) |
| 典型场景 | 微服务内部调用(高吞吐、低延迟)、分布式系统 | Web网站、RESTful API、公开接口、资源传输 | 实时聊天、游戏、协同编辑、股票行情、实时推送 |
一句话总结选择指南
用 RPC:在你控制的后端服务之间,需要高性能、强类型、低延迟的内部调用。例如:一个订单服务调用用户服务。选 gRPC。
用 HTTP:对外提供API,需要通用、简单、防火墙友好、无状态。例如:手机App请求新闻列表、浏览器加载网页。选 RESTful API。
用 WebSocket:需要服务端随时主动推送数据或进行双向实时交互。例如:在线客服、多人在线游戏、股票K线图。不要用HTTP轮询,浪费资源且不及时。
一个形象的类比
HTTP:像寄信。你写好信(请求),贴上邮票(头部),寄出,然后等回信。邮递员不会主动上门找你。
WebSocket:像打电话。先拨号(HTTP握手),接通后双方可以随时说话,边说边听,实时交流。
RPC:像内线电话(或公司内部的对讲机)。虽然也像打电话(基于TCP),但它隐去了“拨号”和“接线员”的过程,你直接拿起听筒说“呼叫张三”,它就能接通。你感觉就像在直接叫同事名字(调用本地函数)。