HTTP & RPC

对外一般使用 HTTP 协议,内部集群和微服务之间采用 RPC 协议。HTTP 和 RPC 的服务发现方式基本一致;HTTP1.1 和 RPC 都会建立 TCP 长连接,RPC 还会建个连接池,而一些编程语言的网络库也会给 HTTP 加个连接池;HTTP1.1 采用 Json 来序列化结构体,而 RPC 会使用 Protobuf 等体积更小的序列化协议,并且无需考虑复杂的浏览器行为,性能更高。当然 HTTP2 的性能更好,比如 gRPC 的底层就直接使用 HTTP2。

HTTP & RPC

RPC 本质上不算是协议,而是一种调用方式,只有 gRPC 这样的具体实现才是协议,是实现了 RPC 调用的协议。RPC 的实现方式不一定得基于 TCP 协议,还可以基于 HTTP 协议来实现。一般来说,对外一般使用 HTTP 协议,而内部集群和微服务之间采用 RPC 协议进行通讯。

下面从服务发现底层连接形式传输内容来说一下两者的区别。

1、服务发现(找到目标服务器的 IP 地址和端口)

HTTP 使用 DNS 服务去找到服务的域名。RPC 使用专门的中间服务去保存服务名和 IP 信息,如 Consul、Etcd、Redis,甚至 CoreDNS。双方差距不大。

2、底层连接形式

HTTP1.1 在建立底层 TCP 连接后会一直保持这个连接(Keep Alive),之后的请求和响应都会复用这条连接。RPC 不仅会建立 TCP 长连接,还会再建个连接池用完放回去,下次再复用。而一些编程语言(Go)的网络库会给 HTTP 加个连接池,所以双方差距不大。

image

3、传输内容

基于 TCP 传输的消息,由消息头 Header 和消息体 Body 组成。Header 用于标记一些特殊信息,如消息体长度。Body 用于存放真正传输的内容,结构体需要使用序列化和反序列化进行传输。

image

HTTP1.1 使用 Json 来序列化 Body,Header 和 Body 内容冗余。

RPC 可定制,采用体积更小的 Protobuf 或其它序列化协议来序列化 Body,不需要像 HTTP 那样考虑各种浏览器行为,性能更好。

image
image

HTTP2 的性能比很多 RPC 协议更好,gRPC 的底层直接使用 HTTP2。

HTTP2 是 2015 年出来的,而很多公司内部 RPC 已经跑了很久,就没必要去换了,除非为了性能而进行更换。