gRPC for Go (Golang): 库、示例和实践指南

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

gRPC for Go (Golang): 库和示例



gRPC 是 Google 基于 HTTP/2 和 Protocol Buffers (protobuf) 开发的高性能远程过程调用 (RPC) 框架。对于 Go 语言,有官方实现 grpc-go,它支持创建具有双向流式传输、TLS 加密和拦截器 (interceptors) 的高效微服务。本文提供了工具的完整描述、服务器和客户端的示例以及实用建议。



Go 中 gRPC 的主要库



  • google.golang.org/grpc — Go 的 gRPC 主库。包含服务器和客户端部分,支持流、元数据和负载均衡。
  • google.golang.org/protobuf — 用于处理 protobuf 消息的包:编译、序列化、反序列化。
  • github.com/golang/protobuf/protoc-gen-go — 用于 protoc 编译器的插件,从 .proto 文件生成 Go 代码。
  • github.com/grpc-ecosystem/grpc-gateway — 用于在 gRPC 之上创建 REST 代理的工具(有助于与浏览器兼容)。


安装和配置



开始之前,请安装 protobuf 编译器和插件:



# 安装 protoc (Linux/macOS)sudo apt install protobuf-compiler  # Ubuntu/Debianbrew install protobuf              # macOS

# 安装 Go 插件go install google.golang.org/protobuf/cmd/protoc-gen-go@latestgo install google.golang.org/grpc/cmd/protoc-gen-go-grpc@latest


安装后,将 $GOPATH/bin 添加到 PATH 环境变量中。



通过 .proto 文件定义服务



创建文件 hello.proto:



syntax = "proto3";

package hello;

option go_package = "example.com/grpc-demo/hello";

service Greeter { rpc SayHello (HelloRequest) returns (HelloReply); rpc SayHelloStream (HelloRequest) returns (stream HelloReply);}

message HelloRequest { string name = 1;}

message HelloReply { string message = 1;}


使用以下命令生成 Go 代码:



protoc --go_out=. --go-grpc_out=. hello.proto


将生成文件 hello.pb.go(消息)和 hello_grpc.pb.go(服务)。



Go 服务器示例



package main

import ( "log" "net"

pb "example.com/grpc-demo/hello" "google.golang.org/grpc")

type server struct { pb.UnimplementedGreeterServer}

func (s *server) SayHello(req *pb.HelloRequest, stream pb.Greeter_SayHelloServer) error { // 普通 RPC return stream.Send(&pb.HelloReply{Message: "Hello, " + req.Name})}

func (s *server) SayHelloStream(req *pb.HelloRequest, stream pb.Greeter_SayHelloServer) error { // 流式响应 for i := 0; i < 5; i++ { if err := stream.Send(&pb.HelloReply{Message: "Hello " + req.Name + " #" + string(rune(i))}); err != nil { return err } } return nil}

func main() { lis, _ := net.Listen("tcp", ":50051") s := grpc.NewServer() pb.RegisterGreeterServer(s, &server{}) log.Println("Server listening on :50051") if err := s.Serve(lis); err != nil { log.Fatalf("Failed to serve: %v", err) }}


Go 客户端示例



package main

import ( "context" "log" "time"

pb "example.com/grpc-demo/hello" "google.golang.org/grpc" "google.golang.org/grpc/credentials/insecure")

func main() { conn, err := grpc.Dial("localhost:50051", grpc.WithTransportCredentials(insecure.NewCredentials())) if err != nil { log.Fatalf("did not connect: %v", err) } defer conn.Close()

client := pb.NewGreeterClient(conn) ctx, ca

推荐