共计 2088 个字符,预计需要花费 6 分钟才能阅读完成。
微服务离不开 gRPC
当初大多数企业都会采纳微服务作为软件的架构,在这种架构的大背景下,微服务框架和协定宽泛风行,而 RPC 也开始风行。grpc 是基于 RPC 的框架,性能高,应用十分宽泛。
grpc 由谷歌公司开发和保护,反对简直所有的支流编程语言。不论你用的是 Java,还是 Python, 还是 Go, 还是 Ruby 等等,都能够应用他来实现近程的服务。
Protocol Buffers
grpc 默认应用 protocol buffers 作为序列化传输格局,通常会把传输的数据类型用一个带有.proto 扩展名的一般文本文件来存储,不论是申请还是响应的数据都须要合乎这外面定义的数据要求。
比方在进行用户验证时往往须要传入登录的用户信息,服务端返回 token 值,对应的 proto 文件形容,如果申请或者响应数据太大,不能一次获取完,能够通过 stream 流信息继续传输,此时在类后面加 stream 关键字。
// login.proto
service User{
// login
rpc Login (LoginReqeust) returns (LoginReply) {}
// stream
rpc GetImage(LoginRequest) return (stream LoginReply){}}
// 登录申请数据
message LoginReqeust {
string username = 1;
string passwd = 2;
}
// 登录响应数据
message LoginReply {
string token = 1;
string msg = 2;
}
proto 文件生成 gPRC 代码
以 Python 为例,首先须要装置 Python 相干的包。
pip install grpcio
pip install grpcio-tools
对应生成 Python 代码的命令,留神 -I 示意 proto 文件所在的子目录:
python -m grpc_tools.protoc --python_out=. --grpc_python_out=. -I protos login.proto
输出完命令当前,在目录下会多两个文件,一个叫 login_pb2.py
,外面报告了申请和响应相干的数据格式,还有一个叫 login_pb2_grpc.py
,蕴含了客户端和响应端的类。
生成的 login_pb2.grpc.py 中的代码 …
创立 gRPC 服务
创立接口须要用到下面生成的 UserServicer 类。
import login_pb2_grpc
import login_pb2
class User(login_pb2_grpc.UserServicer):
def Login(self, request, context):
return login_pb2.LoginReply(msg=f"hello, {request.username}",
token="It is my token")
运行服务:
import grpc
from concurrent import futures
def serve():
server = grpc.server(futures.ThreadPoolExecutor(max_workers=10))
login_pb2_grpc.add_UserServicer_to_server(User(), server)
server.add_insecure_port('[::]:50051')
server.start()
server.wait_for_termination()
serve()
创立 gRPC 客户端
一个例子:
import grpc
def run():
with grpc.insecure_channel('localhost:50051') as channel:
stub = login_pb2_grpc.UserStub(channel)
response = stub.Login(login_pb2.LoginRequest(username='you', passwd="123"))
print("Client received:" + response.msg)
protocol buffer 转成 json
客户端拿到响应后果之后,能够通过类属性获取字段:
response.msg
response.token
有时候咱们会把它转换成 json 格局,不便获取整个响应。此时能够应用 protobuf 这个库,先装置:
pip install protobuf
接下来应用转换成 json 格局的办法就能够了。
from google.protobuf.json_format import MessageToJson
import json
def run():
with grpc.insecure_channel('localhost:50051') as channel:
stub = login_pb2_grpc.UserStub(channel)
response = stub.Login(login_pb2.LoginRequest(username='you', passwd="123"))
print(json.loads(MessageToJson(response)))