RPC(Remote Procedure Call)—远程过程调用,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。

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学习

https://grpc.io/docs/quickstart/python.html

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的并发问题?

多线程(不支持多进程)

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

所有的代码在 https://github.com/xsren/learning_record/tree/master/grpc,欢迎star。一、先了解几个概念RPCRPC(Remote Procedure Call)—远程过程调用,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。gRPCgRPC是一个高性能、通用的开源RPC框架,其由Google主要由开发并基于HT...
可以使用 Python 中的 threading 模块来实现多线程服务器端。首先,你需要创建一个基于 Thread 的服务器线程类,然后在这个类的构造函数中初始化服务器套接字,并实现一个 run 函数用于接收客户端连接并处理它们。 具体来说,你可以这样写: import threading import socket class ServerThread(threading.Thread):
另一个 gRPC 反射客户端 用于 Python 的极简反射客户端。 可以通过在其proto文件中定义的名称来获取反射的 grpc 类型类,或者通过导入与使用protoc时相同的模块来使用。 因为有时候,必须运行协议可能会带来不便。 要使用此项目中的模块,您将需要在已启用的服务器上使用 gRPC 服务。 pip install yagrc 给定以下基于非反射的客户端请求: import grpc from arithmetic import subtract_pb2 from arithmetic import subtract_pb2 _grpc with grpc . insecure_channel ( target ) as channel : stub = subtract_pb2 _grpc . SubtractionStub ( channel )
gRPC Ares Library Init是一个初始化 gRPC Ares库的函数。 gRPC Ares库是一个用于解决DNS解析的库,它的作用是为 gRPC 提供高性能的异步DNS解析。在实际使用中,我们可以通过调用 grpc _ares_library_init函数来初始化 gRPC Ares库,以便在后续的操作中使用该库提供的DNS解析服务。 如果我们不调用 grpc _ares_library_init函数,那么在使用 gRPC Ares库时将会出现一些问题。例如,我们可能会遇到DNS解析服务速度慢或者出现DNS解析失败等问题。因此,在使用 gRPC Ares库时,我们必须先调用 grpc _ares_library_init函数,以确保该库能够正常工作。 grpc _ares_library_init函数的返回值表明了初始化是否成功。如果返回值是0,则表示初始化成功;如果返回值是非0,则表示初始化失败。如果初始化失败,我们可以通过查看返回值来找到具体的原因,并尝试修复相关问题。 总之, grpc _ares_library_init函数是初始化 gRPC Ares库的重要函数,我们必须在 gRPC Ares库的使用前调用该函数,以确保该库能够正常工作。