rpc和http的区别
grpc和http的区别协议层面http是应用层协议每次携带大量头部字段包括connection、host、user-agent、cookie等rpc通常用自定义二进制格式头部极小具体看 gRPC 数据包传输格式解析序列化层面http常用json字段名重复、解析慢rpc常用protobuf只传字段编号值体积小5-10倍解析快10倍连接层面http/1.1 keep-alive可以复用连接但是串行化有队头阻塞的问题grpc用http/2支持tcp长连接多路复用一条连接并发多个请求对比性能对比(同一个请求): HTTPJSON: 请求: POST /api/users/getUser HTTP/1.1 Host: user-service Content-Type: application/json Content-Length: 16 Cookie: sessionxxx {userId: 123} 请求大小: ~200字节(头部占80%!) 序列化: JSON.stringify → O(N)字符处理 HTTP/2gRPCProtobuf: HTTP/2 DATA Frame 9B Frame Header Length: 3B Type: 1B Flags: 1B R Stream Identifier: 4B Payload: gRPC Message Compressed Flag: 1B Message Length: 4B Protobuf Body: N Bytes 请求大小: ~15字节(含HTTP/2帧头) 序列化: protobuf编码 → O(1)单字段,整体O(N)但极快 性能差距: 序列化速度: Protobuf比JSON快5-10x 数据体积: Protobuf比JSON小3-5x 网络延迟: 减少60-80% QPS: gRPC比HTTPJSON高2-5x(同等硬件) HTTP/2 多路复用: HTTP/1.1: 请求1发 → 等响应1 → 请求2发(队头阻塞) HTTP/2: 请求1发 → 请求2发 → 请求3发 → 响应乱序到达 (stream ID区分,同一TCP连接) → gRPC天然基于HTTP/2