1.1 概述
gRPC是搭建分布式应用接口和客户端的框架。在 gRPC 中,客户端应用程序可以直接调用不同机器上的服务器应用程序上的方法,就像它是本地对象一样,可以更容易创建分布式应用程序和服务。与许多 RPC 系统一样,gRPC 基于定义服务的思想,指定可以远程调用的方法及其参数和返回类型。在服务端,服务端实现这个接口并运行一个 gRPC 服务器来处理客户端调用。在客户端,客户端有一个存根(在某些语言中仅称为客户端),它提供与服务器相同的方法。
gRPC 客户端和服务器可以在各种环境中运行和相互通信——从 Google 内部的服务器到您自己的桌面——并且可以用任何 gRPC 支持的语言编写。例如,可以使用 Go、Python 或 Ruby 中的客户端轻松地调用在 Java 中创建 gRPC 服务器
1.2 grpc 优缺点
优点:
缺点:
1.3 grpc 使用场景
适用场景:
不适用场景:
pip install grpcio
pip install grpcio-tools
pip install protobuf
以一个简单的健康检查接口为例,创建文件health.proto
syntax = "proto3";
// 定义grpc请求消息体
message HealthCheckRequest {
string service = 1;
}
// 定义grpc返回消息体
message HealthCheckResponse {
enum ServingStatus {
UNKNOWN = 0;
SERVING = 1;
NOT_SERVING = 2;
}
ServingStatus status = 1;
}
// 定义服务接口
service Health {
rpc check(HealthCheckRequest) returns (HealthCheckResponse);
}
创建proto文件后,使用命令生成相关文件
python -m grpc_tools.protoc -I . --python_out=. --grpc_python_out=. ./health.proto
class HealthServer(health_pb2_grpc.HealthServicer):
"""
定义类继承HealthServicer
"""
def __init__(self):
pass
def check(self, request, context):
"""
健康检查接口,实现proto文件中的服务接口
"""
service = request.service # 获取请求中的参数
return health_pb2.HealthCheckResponse(status=HealthCheckResponse.ServingStatus.SERVING)
def run(host, port):
"""
运行ocr服务
:param host:
:param port:
:return:
"""
server = grpc.server(futures.ThreadPoolExecutor(max_workers=5))
health_pb2_grpc.add_HealthServicer_to_server(HealthServer(), server)
server.add_insecure_port(f'{host}:{port}')
server.start()
print('Grpc server connect successful!')
# 启动服务,等待退出
try:
while True:
time.sleep(600)
except KeyboardInterrupt:
server.stop(0)
if __name__ == '__main__':
run(host='0.0.0.0', port='8001')
conn = grpc.insecure_channel('127.0.0.1:8001')
client = health_pb2_grpc.HealthStub(channel=conn)
request = health_pb2.HealthCheckRequest(service='test')
response = client.Check(request)
print('check grpc health status successful!')