gRPC+Python 入门到生产环境

所有的代码在 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的并发问题?

多线程(不支持多进程)

异步,有一个热心网友的实现

负载均衡

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180326G14H2U00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券