作者:zf19920222 | 来源:互联网 | 2024-11-05 01:25
本文全面解析了gRPC的基础知识与高级应用,从helloworld.proto文件入手,详细阐述了如何定义服务接口。例如,`Greeter`服务中的`SayHello`方法,该方法在客户端和服务器端的消息交互中起到了关键作用。通过实例代码,读者可以深入了解gRPC的工作原理及其在实际项目中的应用。
helloworld.proto代码如下:
syntax = "proto3";
package helloworld;
service Greeter{
rpc SayHello (HelloRequest) returns (HelloReply) {}
}
message HelloRequest {
string name = 1;
}
message HelloReply {
string message = 1;
}
解释:定义了一个Greeter的服务,会跟下面的server.py里面的class类名同名。sayhello是整个消息来回过程中client要调用的定义在server端的函数名。HelloRequest是client发送给server消息时用的函数。把需要传给server的值赋给name这个变量。server端靠HelloReply函数接收消息,消息在request里。通过request.name得到name的值。把该值赋给message后通过HelloReply函数传给client。client从HelloRequest函数的返回值里得到server发来的回应,该回应.mesage可以取出里面的值。
client.py代码如下:
#coding:utf-8
from __future__ import print_function
import grpc
import helloworld_pb2
import helloworld_pb2_grpc
import time
def hello(name):
# NOTE(gRPC Python Team): .close() is possible on a channel and should be
# used in circumstances in which the with statement does not fit the needs
# of the code.
with grpc.insecure_channel(‘127.0.0.1:50051‘) as channel:
stub =helloworld_pb2_grpc.GreeterStub(channel)
response = stub.SayHello(helloworld_pb2.HelloRequest(name=name))
print(response.message)
if __name__ == ‘__main__‘:
hello("1234")
server.py代码如下:
from concurrent import futures
import time
import grpc
import helloworld_pb2
import helloworld_pb2_grpc
_ONE_DAY_IN_SECONDS = 60 * 60 * 24
class Greeter(helloworld_pb2_grpc.GreeterServicer):
# 工作函数
def SayHello(self, request, context):
return helloworld_pb2.HelloReply(message=‘Hello, %s!‘ % request.name)
def serve():
# gRPC 服务器
server = grpc.server(futures.ThreadPoolExecutor(max_workers=10))
helloworld_pb2_grpc.add_GreeterServicer_to_server(Greeter(), server)
server.add_insecure_port(‘[::]:50051‘)
server.start() # start() 不会阻塞,如果运行时你的代码没有其它的事情可做,你可能需要循环等待。
try:
while True:
time.sleep(_ONE_DAY_IN_SECONDS)
except KeyboardInterrupt:
server.stop(0)
if __name__ == ‘__main__‘:
serve()