所有的代码在 https://github.com/xsren/learning_record/tree/master/grpc,欢迎star。
一、先了解几个概念
RPC
RPC(Remote Procedure Call)—远程过程调用,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。
gRPC
gRPC是一个高性能、通用的开源RPC框架,其由Google主要由开发并基于HTTP/2协议标准而设计,基于ProtoBuf(Protocol Buffers)序列化协议开发,且支持众多开发语言。
基于HTTP/2协议提供了更好的强的应用性能(节省带宽,减少TCP请求连接数)
基于ProtoBuf定义服务,面向接口对服务进行顶层设计
支持主流的编程语言,C++,Java,Python,Go,Ruby,Node.js,PHP等, 基于ProtoBuf生成相应的服务端和客户端代码。
相比在使用Restful方式完成服务之间的相互访问,GRPC能提供更好的性能,更低的延迟,并且生来适合与分布式系统。
同时基于标准化的IDL(ProtoBuf)来生成服务器端和客户端代码, ProtoBuf服务定义可以作为服务契约,因此可以更好的支持团队与团队之间的接口设计,开发,测试,协作等等。
protobuf
protocol buffers(简称protobuf)是google 的一种数据交换的格式,它独立于语言,独立于平台。
protobuf是google开发的一个数据传输格式,类似json
protobuf是二进制的、结构化的,所以比json的数据量更小,也更对象化
protobuf不是像json直接明文的,这个是定义对象结构,然后由protbuf库去把对象自动转换成二进制,用的时候再自动反解过来的。传输对我们是透明的!我们只管传输的对象就可以了
二、再学习protobuf
1、安装protobuf
1)安装 Protocol Compiler
参考:
Protocol Compiler Installation https://github.com/google/protobuf
有两种方式,一种是自己编译,一种是下载然后把protoc放在/usr/bin即可。我选的后者,本地命令如下:
2)安装 python package
2、运行protobuf demo
参考:
Protocol Buffer Basics: Python https://developers.google.com/protocol-buffers/docs/pythontutorial
proto3和proto2的区别 https://superlc320.gitbooks.io/protocol-buffers-3-study-notes/content/proto3he_proto2_de_qu_bie.html
官方的demo实现了一个简易通讯录,可以将联系人写入文件,并可以从文件中读取联系人。
运行结果
三、gRPC学习
1、安装
参考:
https://grpc.io/docs/quickstart/python.html
2、运行
1) hello world
2) route guide
一个和streaming相关的demo,支持:
A server-to-client streaming RPC.
A client-to-server streaming RPC.
A Bidirectional streaming RPC.
streaming 的应用场景主要是传输数据量比较多的情况。
四、生产环境
参考:
python API doc https://grpc.io/grpc/python/index.html
Exploring Security, Metrics, and Error-handling with gRPC in Python https://blog.codeship.com/exploring-security-metrics-and-error-handling-with-grpc-in-python/
gRPC Authentication https://grpc.io/docs/guides/auth.html#credential-types
生产环境的要求:
性能
使用多线程提高并发。
使用负载均衡的方式进行扩展。
安全
SSL/TLS
Token-based authentication with Google
扩展使用其他认证方式
错误处理
超时
错误
拦截器(python版本的拦截器还不稳定)
五、让gRPC支持Restful
参考:
gRPC with REST and Open APIs https://grpc.io/blog/coreos
grpc-gateway https://github.com/grpc-ecosystem/grpc-gateway
gRPC helloworld service, RESTful JSON API gateway and swagger UI http://www.cnblogs.com/lienhua34/p/6285829.html
可以使用使用grpc-gateway生成一个反向代理,将接收的RESTful JSON API 转化为 gRPC。
grpc_gateway.png
六、TODO:
1、深入研究grpc-gateway的高级选项。
七、疑问解答:
Question1: gRPC client能使用代理吗?
Answer:
官方的client API并没有提供设置proxy的选项,可行的几种方案:
1、通过设置系统的代理
$ echo $http_proxy
http://httpproxy.mydomain:8080
2、通过nginx、haproxy等设置一个反向代理
Question2: protobuf的默认值是?
Answer:
以下只针对proto3
参考https://developers.google.com/protocol-buffers/docs/proto3
Question3: gRPC如何认证和授权?
SSL/TLS
Token-based authentication with Google(包含了Oauth2和JWT的方式)
自己扩展,官方提供API可以自行扩展认证方式(找到了go的实现方式)
Question4: gRPC的并发问题?
多线程(不支持多进程)
异步,有一个热心网友的实现
负载均衡