之前的程序中,客户端和服务端都是基于Java平台,而rpc的使用场景常常式异构系统之间的调用过程,因此本文使用python开发客户端,调用java的服务端。
本例依赖
python
和pip
,安装python
后自动会包含pip
。安装过程参考python官网
。-
安装
python
版本的gRPC
和gRPC tools
,其中gRPC tools
包含proto buf编译器和代码生成插件。python -m pip install grpcio python -m pip install grpcio-tools googleapis-common-protos
-
pthon客户端与java服务端之前通信,使用相同的
.proto
文件作为契约:syntax = "proto3"; package com.mattie.grpc; option java_package = "com.mattie.grpc"; option java_outer_classname = "HelloWorldProtos"; service Greeter { rpc SayHello (HelloRequest) returns (HelloReply) {} rpc biStream (stream HelloStreamRequest) returns (stream HelloStreamResponse) {}; } message HelloRequest { string message = 1; } message HelloReply { string message = 1; } message HelloStreamRequest { string request_info = 1; } message HelloStreamResponse { string response_info = 1; }
-
使用下面的命令,根据
.proto
文件生成python版本的代码:helloworld_pb2.py
和helloworld_pb2_grpc.py
。python -m grpc_tools.protoc -I C:\Users\18616\Documents\grpc_demo\src\main\proto --python_out=C:\Users\18616\Documents\grpc_demo\python_client --grpc_python_out=C:\Users\18616\Documents\grpc_demo\python_client C:\Users\18616\Documents\grpc_demo\src\main\proto\helloworld.proto
其中:
-
helloworld_pb2.py
中包含操作契约的类 -
helloworld_pb2_grpc.py
包含自动生成的客户端和服务端代码(本例子不使用这里生成的服务端代码,只使用客户端)
-
创建客户端
client.py
,服务端仍然使用之前工程的MyServer
、MyService
。from __future__ import print_function import grpc import helloworld_pb2 import helloworld_pb2_grpc def run(): with grpc.insecure_channel('localhost:8899') as channel: stub = helloworld_pb2_grpc.GreeterStub(channel) response = stub.SayHello(helloworld_pb2.HelloRequest(message='you')) print("Greeter client received: " + response.message) if __name__ == '__main__': run()
-
启动
MyServer
和client.py
:python client.py