在分布式系统中,使用Golang编写核心服务后,往往还需要被Python、Java等其它语言调用。gRPC通过统一的IDL描述和高效的二进制序列化,让跨语言调用变得简单且性能优秀。下面以Golang服务端加Python客户端为例,演示完整实现过程。

一、环境准备与Proto定义
首先安装Golang的protobuf和gRPC插件,并编写通用的proto文件。该文件是所有语言共享的接口契约。
syntax = "proto3";
package greet;
option go_package = "ippipp.com/grpc_demo/greet";
service Greeter {
rpc SayHello (HelloRequest) returns (HelloReply) {}
}
message HelloRequest {
string name = 1;
}
message HelloReply {
string message = 1;
}
二、生成Golang服务端代码
使用protoc命令生成Golang代码,然后在项目中实现服务接口。
protoc --go_out=. --go_opt=paths=source_relative --go-grpc_out=. --go-grpc_opt=paths=source_relative greet.proto
Golang服务端实现
package main
import (
"context"
"log"
"net"
"google.golang.org/grpc"
pb "ippipp.com/grpc_demo/greet"
)
type server struct {
pb.UnimplementedGreeterServer
}
func (s *server) SayHello(ctx context.Context, req *pb.HelloRequest) (*pb.HelloReply, error) {
return &pb.HelloReply{Message: "你好, " + req.GetName()}, nil
}
func main() {
lis, err := net.Listen("tcp", ":50051")
if err != nil {
log.Fatal(err)
}
s := grpc.NewServer()
pb.RegisterGreeterServer(s, &server{})
log.Println("gRPC服务启动在 :50051")
log.Fatal(s.Serve(lis))
}
三、Python客户端跨语言调用
Python端使用相同的proto生成代码,然后发起请求。这样便完成了从Python到Golang的跨语言通信。
import grpc
import greet_pb2
import greet_pb2_grpc
channel = grpc.insecure_channel('127.0.0.1:50051')
stub = greet_pb2_grpc.GreeterStub(channel)
response = stub.SayHello(greet_pb2.HelloRequest(name="小明"))
print(response.message)
四、注意事项
- proto文件的包名和go_package会影响生成代码结构,需提前规划。
- 跨语言时应保证各端protobuf版本兼容,避免字段解析异常。
- 生产环境请使用TLS加密,而非insecure_channel。
通过上述步骤,我们清晰地看到Golang如何使用gRPC提供能力,并被其他语言方便消费。只要遵循同一份proto契约,扩展更多语言客户端都非常直接。