什么是gRPC

一句话解释

gRPC 是一个框架, 这个框架通过HTTP/2.的协议实现了RPC API.

RPC 是什么?

RPC 三个字母分代表了Remote Procedure Call. 这是最最古老的一种 API style, 比REST style 早非常多. 它的基本概念就是想本地函数调用一样去调用服务器上的API. 这么说好像有一点抽象, 下面通过一个例子来详细说明

举个例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# python的RPC server
from jsonrpclib.SimpleJSONRPCServer import SimpleJSONRPCServer

def echo(*args):
return *args

def main():
server = SimpleJSONRPCServer(('localhost', 1006))
server.register_function(findlen)
print("Start server")
server.serve_forever()

if __name__ == '__main__':
main()

这个 server 提供了一个叫echo的接口, 接口返回一样的请求的数据. 那么要调用echo这个接口要怎么实现呢? 很简单, 就跟调用函数一样

1
2
3
4
5
6
7
8
import jsonrpclib import Server

def main():
conn = Server('http://localhost:1006')
resp = conn.echo('Hello World')

if __name__ == '__main__':
main()

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%. 这以为这更短的传输时间, 请求和响应的延迟都会降低.

性能提升

根据前人的测算, gRPCREST + JSON的通信方式有着5倍以上的性能提升. 快就完事了.

不同语言的代码生成

RPC 一个很大的痛点是server和client必须要是同一种语言, 所以gRPC为了解决这一个痛点
就带来个自动的语言生成器. 只需要把.proto文件写好, 就可以生成各种不同语言的代码.

更多种连接模式

REST不同的是, gPRC支持流式连接. 无论是server向client发, 还是client向server发, 甚至双向发, gRPC都可以胜任

gRPC缺点