Python gRPC 分布式应用

概述

gRPC 一开始由 google 开发,是一款语言中立、平台中立、开源的远程过程调用(RPC)系统。

在 gRPC 里客户端应用可以像调用本地对象一样直接调用另一台不同的机器上服务端应用的方法,使得您能够更容易地创建分布式应用和服务。与许多 RPC 系统类似,gRPC 也是基于以下理念:定义一个服务,指定其能够被远程调用的方法(包含参数和返回类型)。在服务端实现这个接口,并运行一个 gRPC 服务器来处理客户端调用。在客户端拥有一个存根能够像服务端一样的方法。

使用步骤
  1. 编写 .proto配置文件

syntax = "proto3";
// 这里定义的是消息,其实就是后面函数的参数。
message HelloRequest{
string name = 1;
}

message HelloReply{
string message =1;
}

// 这里定义的是服务,其实就是定义类,里面的是函数,SayHello 是函数名称,里面的是参数。
// 后面需要在 Python 中重写这些方法
service Greeter{
rpc SayHello(HelloRequest) returns (HelloReply){}
// 可以同时定义多个函数
rpc Test(HelloRequest) returns (HelloReply){}
}



  1. 使用 protoc 命令编译 .proto 文件,

// 或者使用 protoc 命令,
// -I 是指 proto 文件目录,--python_out 是指生成的 Python 序列化文件目录,--grpc_python_out 是指生成 grpc 文件的目录,最后 ./hello.proto 是指使用哪个序列化文件。
python -m grpc_tools.protoc -I ./ --python_out=. --grpc_python_out=. ./hello.proto
  1. 编写客户端和服务端代码

# server.py
import time
import grpc
# 这里面是序列化好的消息格式,请求和响应`
import hello_pb2
# 这里面是需要用到的方法
import hello_pb2_grpc
from concurrent import futures


# 真正的工作类,这里需要继承
class Word(hello_pb2_grpc.GreeterServicer):
# 这个方法就是之前在配置文件中定义好的 SayHello,这里需要我们自己实现.
   def SayHello(self, request, context):
       # 这里就是返回的数据
       return hello_pb2.Response(results="你的任务ID")


def grpc_server():
   # 多进程模式下的服务
   server = grpc.server(futures.ThreadPoolExecutor(max_workers=10))
   # 注册服务
   hello_pb2_grpc.add_GreeterServicer_to_server(Word(), server)
   # 设置 IP 端口
   server.add_insecure_port('[::]:10000')
   # 服务开启,因为这个是非阻塞的,所有后面要死循环,不然会退出。
   server.start()
   try:
       while True:
           time.sleep(60 * 60 * 24)
   except KeyboardInterrupt:
       server.stop(0)


if __name__ == "__main__":
   grpc_server()
# client.py
import grpc
import hello_pb2_grpc
import hello_pb2


def run():
   # 设置服务器地址
   channel = grpc.insecure_channel('localhost:10000')
   stub = hello_pb2_grpc.GreeterStub(channel)
   # 调用远程函数
   response = stub.do_task(hello_pb2.Request(task_id='456dfddd'))
   # results 是之前定义的字段名字
   
   print(response.results)


run()

 

最新评论
暂无评论
登录后评论