ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

gRPC详解

gRPC详解 将单体应用拆成多个微服务之间如何通信如果还是用HTTP或者Json就会存在一些问题。例如使用json文本冗余json是文本字段名要在每条消息里重复一遍网络上跑的全是冗余。靠文档约定手写封装每接一个新服务又要手写一遍请求封装和响应解析gRPC使用protocol buffers定契约用HTTP/2传数据主打高性能和强类型。RPC远程过程调用之前函数在本地调用如果函数在另外一个机器上就需要拼URL, 发HTTP请求解析JSON响应RPC就是把这些网络细节全部藏起来感觉还是本地调用。其实中间多了一层代理对象Stub桩调Stub负责把参数打包、发出去、等回复再拆包还给你。服务端有一份对应的骨架代码收到请求后调用真正的实现。gRPC就是这样一套框架契约用Protobuf, 传输走HTTP/2用gRPC第一步不是写代码而是定义.proto文件是接口描述语言专门用来定义数据长什么样有哪些方法。 后面是编号编号才是二进制里的真正标识字段名只存在于源码里。改字段名不影响兼容但编号一旦用过就绝对不能改不能复用。service定义服务里面每个rpc就是一个能被远程调用的方法。入参和返回类型都写死在契约里。proto里只写编码和值同一条数据通常比json小三到十倍解析也快的多。.proto写好之后用protoc这个编译器来生成代码本身负责解析具体生成哪种语言交给插件决定。生成的东西包括Client Stub客户端调用客户端直接调用网络的事就全负责了Server接口你来实现业务逻辑这样做的好处是两边类型完全对齐字段拼错在编译器就会报错。团队协作之间就是传的.proto文件接口一改双方重新生成一遍谁没跟上编译直接过不去。gRPC快很大一部分归功于选择了HTTP/2HTTP/1一条连接同一时间只能处理一个请求前一个响应没回来后面的就得排队这叫队头阻塞。浏览器智能多开几条连接环节服务端的压力就上去了。HTTp/2把数据切成二进制帧每个帧都带着所属流的编号于是多个请求可以同时跑在一条TCP连接上交错传输互不阻塞。这就是多路复用也是gRPC能抗高并发的基础。头部还会用HPACK压缩重复的头信息不用一遍遍地发。长连接复用省掉了大量的握手开销。gRPC的四种调用方式一元调用服务端流一次请求服务端返回多条适合分块下载大文件拉取历史消息订阅一段时间的数据客户端流客户端连续发很多条服务端最后返回一个结果。适合分片上传文件批量上报埋点最后回一个汇总双向流两边随时发适合聊天、实时推送、语音识别这类场景上述方式都是跑在HTTP/2连接上这是REST很难做到的除了业务参数一次调用还可携带附加信息。MetaData注意Deadline明确时间点整条链路共用到点没完成整条链路一起放弃不会有服务在那儿傻等。内部服务之间用gRPC对外和对浏览器用REST这是最常见的组合。
返回列表