跨语言的GRPC调用

这次我们测试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

测试结果:成功
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/zhongliwen1981/article/details/114244836