什么是gRPC
一句话解释
gRPC 是一个框架, 这个框架通过HTTP/2.的协议实现了RPC API.
RPC 是什么?
RPC 三个字母分代表了Remote Procedure Call. 这是最最古老的一种 API style, 比REST style 早非常多. 它的基本概念就是想本地函数调用一样去调用服务器上的API. 这么说好像有一点抽象, 下面通过一个例子来详细说明
举个例子:
1 | # python的RPC server |
这个 server 提供了一个叫echo的接口, 接口返回一样的请求的数据. 那么要调用echo这个接口要怎么实现呢? 很简单, 就跟调用函数一样
1 | import jsonrpclib import Server |
RPC这种接口实现方式其实有很多优点, 比如说: 用这样的方式实现接口很快, RPC的 payload 很小, 而且调用方便. 但是RPC并不是完美的 API style, 它也存在着很多问题, 比如说: server 和 client 所使用的语言必须一样, 接口和底层实现严重耦合, 提供给第三方集成有暴露底层实现的风险. 为了解决这些问题, 人们在 2000 年的时候提出了REST API style.
虽然REST很好地解决了RPC的一些问题, 但是REST的数据传输量非常大, 所以REST其实也没能替代掉RPC, 这也推动了 Facebook 推出GraphQL和 Google 推出gRPC
gRPC的优势
相较于传统的RPC, gRPC主要引入了两个重要的技术革新. 一个是使用Protobuf, 另一个是使用HTTP/2.协议.
轻量化的请求体积
相较于使用JSON作为请求message, 经过protobuf序列化过的message在体积上最多能少30%. 这以为这更短的传输时间, 请求和响应的延迟都会降低.
性能提升
根据前人的测算, gRPC 比REST + JSON的通信方式有着5倍以上的性能提升. 快就完事了.
不同语言的代码生成
RPC 一个很大的痛点是server和client必须要是同一种语言, 所以gRPC为了解决这一个痛点
就带来个自动的语言生成器. 只需要把.proto文件写好, 就可以生成各种不同语言的代码.
更多种连接模式
与REST不同的是, gPRC支持流式连接. 无论是server向client发, 还是client向server发, 甚至双向发, gRPC都可以胜任