这次我们测试go与python之间的grpc调用。go作为grpc的客户端,python作为grpc的服务端。
- 准备工作:
第一步:安装go的grpc工具;
go get -u github.com/golang/protobuf/proto
go get -u github.com/golang/protobuf/protoc-gen-go
go get google.golang.org/grpc
第二步:安装python的grpc工具;
pip install grpcio-tools
- 实现步骤:
首先新建hello.proto文件,该文件很简单,就是定义了一个服务接口的方法SayHello,该方法入参是一个HelloRequest消息,返回值是HelloReply消息。
syntax = 'proto3';
message HelloRequest {
string Name = 1;
}
message HelloReply {
string Message = 1;
}
service HelloServer {
rpc SayHello(HelloRequest) returns (HelloReply) {}
}
定义完成后,分别在go环境和python环境执行protoc命令进行编译。
# go
protoc --go_out=plugins=grpc:./ hello.proto
# python
python -m grpc_tools.protoc -I. --python_out=.. --grpc_python_out=.. hello.proto
编译完成后,开始编写客户端和服务端程序。
- golang实现的grpc客户端:
package main
import (
"context"
"fmt"
"google.golang.org/grpc"
pt "grpc/protos"
)
const (
server_port = "192.168.88.111:8000"
)
// grpc客户端调用python实现的grpc服务端程序
func main() {
// 连接服务器
conn, err := grpc.Dial(server_port, grpc.WithInsecure())
if err != nil {
fmt.Println("连接服务器失败", err)
}
defer conn.Close()
// 创建grpc客户端
cli := pt.NewHelloServerClient(conn)
// 远程调用SayHello方法
reply, err := cli.SayHello(context.Background(), &pt.HelloRequest{Name: "tiger"})
if err != nil {
fmt.Println("cli.SayHello error: ", err)
return
}
fmt.Println("message = ", reply.Message)
}
- python实现的grpc服务端:
import hello_pb2_grpc
import hello_pb2
import grpc
from concurrent import futures
import time
# 实现服务接口
class HelloServerServicer(hello_pb2_grpc.HelloServerServicer):
def SayHello(self, request, context):
msg = request.Name + " hello"
return hello_pb2.HelloReply(Message=msg)
# 开启服务器,对外提供rpc调用
def serve():
# 创建多线程的服务器对象
server = grpc.server(futures.ThreadPoolExecutor(max_workers=10))
# 注册实现服务的方法到服务器对象中
hello_pb2_grpc.add_HelloServerServicer_to_server(HelloServerServicer(), server)
# 为服务器绑定IP地址和端口
server.add_insecure_port('192.168.88.111:8000')
# 开启服务
print('服务器已开启')
server.start()
# 关闭服务
# 使用 ctrl+c 可以退出服务
try:
time.sleep(1000)
except KeyboardInterrupt:
server.stop(0)
if __name__ == '__main__':
serve()
防火墙需要开启8000端口:
sudo ufw allow 8000
测试结果:成功