AnnVoV / blog

24 stars 2 forks source link

我们node里为什么要用自定义tcp协议的rpc做后端进程通信而不用http请求 #24

Open AnnVoV opened 5 years ago

AnnVoV commented 5 years ago

http报文和tcp报文的不同

http1.1 的报文

HTTP/1.0 200 OK 
Content-Type: text/plain
Content-Length: 137582
Expires: Thu, 05 Dec 1997 16:00:00 GMT
Last-Modified: Wed, 5 August 1996 15:55:28 GMT
Server: Apache 0.84
<html>
  <body>Hello World</body>
</html>

即使编码协议,也只有body编码为二进制,报文头元数据却使用了文本编码,非常占字节数。(注意这里相对于的是http1.1)而tcp协议的头最多16字节

tcp协议的传输更加高效

tcp通道里传输的数据只能是二进制的,所以更加高效。将数据转换成二进制串传递给对方的过程叫做「序列化」,而相反,我们收到对方的二进制串后把它转换成数据结构或者对象的过程叫「反序列化」。序列化和反序列化的规则叫做协议。

协议设计就像把一个数据包按顺序切成若干个单位长度的「小格子」,然后约定每个「小格子」里存储什么信息

tcp协议有服务发现与注册(这个是最重要的)

这是http所没有的,调用者并不能知道我们这里提供了什么样的服务(接口),http提供的接口是完全解耦独立的请求。但是rpc是可以扩展成注册中心,监控中心来注册发现服务的。此外,还可以扩展自己的协议头请求,序列化协议等,这些处于应用层的http就很难做了。所以最重要的一点是服务的发现与注册

(拓展)基于zookeeper的服务注册与发现

为了能够定位我们要调用的服务在哪里?我们需要服务注册与服务发现。

default

客户端向load balancer 发送请求。load balancer 查询服务注册中心找到可用的服务,然后转发请求到该服务上。和客户端发现一样,服务都要到注册中心进行服务注册和注销。优点:服务的发现逻辑对客户端是透明的。缺点:需要额外部署和维护高可用的负载均衡器。

ps: dubbo 是阿里的一个完整的rcp框架,它包含注册中心,监控中心,序列化扩展,过滤器扩展和消费服务。dubbo是基于zk的

参考资料: 1.聊聊Node.js RPC(二) —— 服务发现 https://zhuanlan.zhihu.com/p/40606909 2.服务发现:Zookeeper vs etcd vs Consul http://dockone.io/article/667 3.服务发现 https://zhuanlan.zhihu.com/p/32027014 4.基于Zookeeper的服务注册与发现 https://tech.imdada.cn/2015/12/03/service-registry-and-discovery-with-zk/ 5.既然有 HTTP 请求,为什么还要用 RPC 调用? https://www.zhihu.com/question/41609070