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库的使用前调用该函数,以确保该库能够正常工作。