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长连接+多路复用(一条连接并发多个请求)
对比
性能对比(同一个请求): HTTP+JSON: 请求: POST /api/users/getUser HTTP/1.1 Host: user-service Content-Type: application/json Content-Length: 16 Cookie: session=xxx {"userId": 123} 请求大小: ~200字节(头部占80%!) 序列化: JSON.stringify → O(N)字符处理 HTTP/2+gRPC+Protobuf: 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比HTTP+JSON高2-5x(同等硬件) HTTP/2 多路复用: HTTP/1.1: 请求1发 → 等响应1 → 请求2发(队头阻塞) HTTP/2: 请求1发 → 请求2发 → 请求3发 → 响应乱序到达 (stream ID区分,同一TCP连接) → gRPC天然基于HTTP/2