# easygRPC **Repository Path**: Jasonsey/easygRPC ## Basic Information - **Project Name**: easygRPC - **Description**: 一个精简版的gRPC框架(多机通讯),一个server,一个client,快速部署 - **Primary Language**: Python - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2017-09-27 - **Last Updated**: 2022-07-04 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # easygRPC 一个精简版的gRPC框架(多机通讯),一个server,一个client,快速部署 ## 文件结构 ``` . ├── client │   ├── __init__.py │   └── client.py ├── proto │   ├── __init__.py │   ├── helloworld.proto │   ├── helloworld_pb2.py │   ├── helloworld_pb2_grpc.py │   └── protocompile.py └── server ├── __init__.py └── server.py ``` ## 快速开始 ### 编译proto文件方法: - 命令行执行:(切换到proto文件所在目录) ``` python -m grpc-tools.protoc -I. --python_out=. --grpc_python_out=. ./helloworld.proto ``` - 用python编译: ```python # coding=utf-8 from grpc_tools import protoc # 执行该程序,输出pb2(消息)和pb2_grpc(框架)文件 protoc.main( ( # 默认空 '', # 默认-I开始,后面接proto的文件所在目录 '-I.', # 默认值表示输出文件在当前目录 '--python_out=.', '--grpc_python_out=.', # proto文件的链接 './helloworld.proto', ) ) ``` - 编译生成的pb2和pb2_grpc文件基本上可以说不用看,里面调用方法是固定的 ### 启动server 1. 把整个项目放到服务器上; 2. 切换到server所在目录,执行: ```python python server.py ``` ### 启动客户端 1. 修改client.py中的文件中的服务器IP: ```python channel = grpc.insecure_channel('192.168.5.21:50051') ``` 2. 在任何地方切换到client所在目录,执行如下代码,启动client.py ```Python python client.py ``` 3. 根据之前配置,client所在终端会打印出如下信息: ```shell [client]python client.py A1 client received: Hello, you! A2 client received: Hello, you2! ``` ## 文件修改指南 ### 修改proto文件 1. 通过service创建新的服务Greeter; 2. 在服务内创建服务中要实现的方法名字SayHello; 3. 创建client发起请求时,要传递的消息对象HelloRequest; 4. 创建service回应请求时,要回复的消息对象HelloReply; ```protobuf // 创建服务 service Greeter { // SayHello:代表一个方法,可以传递HelloRequest这个参数,回调HelloReply rpc SayHello (HelloRequest) returns (HelloReply) {} rpc SayHelloAgain (HelloRequest) returns (HelloReply) {} } // 请求参数 message HelloRequest { string name = 1; } // 相应参数 message HelloReply { string message = 1; } ``` 5. 编译proto文件:通过前面提到的方法实现 ### 编辑server.py文件 1. 创建相应类,并在类中重新定义SayHello方法; 2. 在SayHello方法里面,可以通过request属性获取到proto文件中定义的HelloRequest属性; 3. 在SayHello方法里面,helloworld_pb2获取HelloReply对象,编辑要返回的消息属性,要记得return; ```Python class Greeter(helloworld_pb2_grpc.GreeterServicer): def SayHello(self, request, context): return helloworld_pb2.HelloReply(message='Hello, %s!' % request.name) def SayHelloAgain(self, request, context): return helloworld_pb2.HelloReply(message='Hello, %s!' % request.name) ``` 4. 剩下的是启动服务必须的操作,默认就好: ```Python def serve(): server = grpc.server(futures.ThreadPoolExecutor(max_workers=10)) helloworld_pb2_grpc.add_GreeterServicer_to_server(Greeter(), server) server.add_insecure_port('[::]:50051') server.start() try: while True: time.sleep(_ONE_DAY_IN_SECONDS) except KeyboardInterrupt: server.stop(0) if __name__ == '__main__': serve() ``` ### 编辑client.py文件 1. 在这里主要修改服务器IP地址和对应端口号:`192.168.5.21:50051` 2. 再修改要传递给服务器的消息'you':`stub.SayHello(helloworld_pb2.HelloRequest(name='you'))` 3. 其中response就是填充完消息的:HelloReply对象 ```Python def run(): channel = grpc.insecure_channel('192.168.5.21:50051') stub = helloworld_pb2_grpc.GreeterStub(channel) response = stub.SayHello(helloworld_pb2.HelloRequest(name='you')) print("A1 client received: " + response.message) response = stub.SayHelloAgain(helloworld_pb2.HelloRequest(name='you2')) print("A2 client received: " + response.message) if __name__ == '__main__': run() ```