1.什么是gRPC
RPC(remote procedure call 远程过程调用)框架实际是提供了一套机制,使得不同编码的应用程序之间可以进行通信,遵从server/client模型。g每个版本都有不同的含义,可能是google,green。gRPC官方文档中文版
2.怎么使用gRPC
2.1 Python
1.安装依赖
protobuf 3.19.3
grpcio 1.35.0
grpcio-tools 1.35.0
2.定义.proto文件(以helloworld.proto为例)
syntax = "proto3";#proto版本
option java_package = "io.grpc.examples";#java编码生成的解析文件的位置
package helloworld;#生成的解析文件的位置
#定义需要的服务以及方法
// The greeter service definition.
service Greeter {
// Sends a greeting
rpc SayHello (HelloRequest) returns (HelloReply) {
}
}
#定义传输数据格式 rpc 服务名 (请求数据) returns (返回数据)
// The request message containing the user's name.
message HelloRequest {
string name = 1;
}
// The response message containing the greetings
message HelloReply {
string message = 1;
}
嵌套数据的定义方式
#以请求消息为例,嵌套的数据格式,更容易对标json形式
message HelloReauest{
string name =1;#数据类型是字符串
message Person{
int32 age=2;#数据类型是整数
repeated string family=4;#定义类似列表的格式,数据类型为string
repeated double ecg=5;#定义类似列表的格式,数据类型为double
}
Person person=6;#这里的1234...代表的只是变量的一个标记,不能重复
}
3.解析proto文件
#注意路径。下面这个方式是将.proto文件放进了proto文件夹,生成的解析文件和proto文件在同一路径下,但是调用解析文件时也要注意路径
python -m grpc_tools.protoc -I. --python_out=. --grpc_python_out=. ./proto/helloworld.proto
4.编写server端代码
#!/usr/bin/env python
# -*-coding: utf-8 -*-
from concurrent import futures
import grpc
import logging
import time
from rpc_package.helloworld_pb2_grpc import add_HelloWorldServiceServicer_to_server, \
HelloWorldServiceServicer
from rpc_package.helloworld_pb2 import HelloRequest, HelloReply
class Hello(HelloWorldServiceServicer):
# 这里实现我们定义的接口
def SayHello(self, request, context):
return HelloReply(message='Hello, %s!' % request.name)
def serve():
# 这里通过thread pool来并发处理server的任务
server = grpc.server(futures.ThreadPoolExecutor(max_workers=10))
# 将对应的任务处理函数添加到rpc server中
add_HelloWorldServiceServicer_to_server(Hello(), server)
# 这里使用的非安全接口,世界gRPC支持TLS/SSL安全连接,以及各种鉴权机制
server.add_insecure_port('[::]:50000')
server.start()
try:
while True:
time.sleep(60 * 60 * 24)
except KeyboardInterrupt:
server.stop(0)
if __name__ == "__main__":
logging.basicConfig()
serve()
5.编写client端代码
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from __future__ import print_function
import logging
import grpc