跨语言的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

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

gRPC(Google Remote Procedure Call)是一个高性能、开源和通用的RPC框架,它能够实现跨语言的服务调用gRPC通过使用Protocol Buffers(Protobuf)作为其接口定义语言(IDL),并结合HTTP/2协议来实现高效的跨语言通信。 具体来说,gRPC实现跨语言服务调用的过程如下: 1. **定义服务**:首先,使用Protobuf定义服务接口。这个接口描述了客户端可以调用的方法以及方法的参数和返回类型。例如: ```protobuf syntax = "proto3"; service MyService { rpc SayHello (HelloRequest) returns (HelloReply); } message HelloRequest { string name = 1; } message HelloReply { string message = 1; } ``` 2. **编译Proto文件**:使用Protobuf编译器(`protoc`)将上述定义的`.proto`文件编译成特定语言的代码。例如,对于C++、Java、Python等不同编程语言,会生成相应的客户端和服务器端代码。 3. **实现服务器端逻辑**:根据生成的代码,在目标语言中实现具体的服务逻辑。例如,在Python中,可以继承生成的基类并实现`SayHello`方法: ```python class MyServiceServicer(my_service_pb2_grpc.MyServiceServicer): def SayHello(self, request, context): return my_service_pb2.HelloReply(message='Hello, %s!' % request.name) ``` 4. **启动gRPC服务器**:创建并启动一个gRPC服务器,并将实现的服务绑定到该服务器上。例如,在Python中: ```python server = grpc.server(futures.ThreadPoolExecutor(max_workers=10)) my_service_pb2_grpc.add_MyServiceServicer_to_server(MyServiceServicer(), server) server.add_insecure_port('[::]:50051') server.start() server.wait_for_termination() ``` 5. **实现客户端逻辑**:同样地,根据生成的客户端代码,在目标语言中编写客户端逻辑来调用远程服务。例如,在Python中: ```python with grpc.insecure_channel('localhost:50051') as channel: stub = my_service_pb2_grpc.MyServiceStub(channel) response = stub.SayHello(my_service_pb2.HelloRequest(name='world')) print("Client received: " + response.message) ``` 6. **运行客户端与服务器**:分别运行客户端和服务器程序,客户端将能够成功调用远程服务并获取响应。 通过以上步骤,gRPC能够实现不同编程语言之间的高效通信和服务调用。这种跨语言的能力使得开发者可以选择最适合自己项目需求的语言来构建系统的各个部分,同时保持系统的互操作性和一致性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值