凌云的博客

行胜于言

gRPC golang快速入门[译]

分类:grpc| 发布时间:2025-01-04 23:38:00

概述

原文: Go Quick start

本指南通过一个简单的示例,帮助您快速上手在 Go 中使用 gRPC。

先决条件

  • Go:任意两个最近发布版本
    有关安装说明,请参阅 Go 入门指南
  • Protocol buffer 编译器(protoc):版本 3。
    有关安装说明,请参阅 Protocol Buffer Compiler Installation
  • Protocol Buffer 的 Go 插件:
    1. 安装 Protobuf Buffer 编译器的 Go 插件
    $ go install google.golang.org/protobuf/cmd/protoc-gen-go@latest
    go install google.golang.org/grpc/cmd/protoc-gen-go-grpc@latest
    
    1. 更新 PATH 环境变量使得 protoc 可以找到插件
    $ export PATH="$PATH:$(go env GOPATH)/bin"
    

获取示例代码

示例代码在 grpc-go 仓库中。

  1. 下载仓库的 zip 归档包然后解压,或者直接克隆仓库:
$ git clone -b v1.69.2 --depth 1 https://github.com/grpc/grpc-go
  1. 切换到示例代码目录
cd grpc-go/examples/helloworld

运行例子

examples/helloworld 目录:

  1. 编译和运行服务端代码:
$ go run greeter_server/main.go
  1. 在另一个终端编译和运行客户端代码,查看客户端输出
$ go run greeter_client/main.go
Greeting: Hello world

恭喜!你刚刚运行了一个基于 gRPC 的 客户端-服务端 应用。

更新 gRPC 服务

在本节中,您将为应用程序添加一个额外的服务器方法。 gRPC 服务是使用 Protocol Buffers 定义的。 要了解如何在 .proto 文件中定义服务,请参阅 基础教程

目前,您只需要知道服务器和客户端存根都有一个 SayHello() RPC 方法,该方法从客户端接收一个 HelloRequest 参数,并从服务器返回一个 HelloReply,该方法的定义如下:

// The greeting service definition.
service Greeter {
  // Sends a greeting
  rpc SayHello (HelloRequest) returns (HelloReply) {}
}

// The request message containing the user's name.
message HelloRequest {
  string name = 1;
}

// The response message containing the greetings
message HelloReply {
  string message = 1;
}

打开 helloworld/helloworld.proto 添加 SayHelloAgain() 方法,使用相同的请求和响应类型:

// The greeting service definition.
service Greeter {
  // Sends a greeting
  rpc SayHello (HelloRequest) returns (HelloReply) {}
  // Sends another greeting
  rpc SayHelloAgain (HelloRequest) returns (HelloReply) {}
}

// The request message containing the user's name.
message HelloRequest {
  string name = 1;
}

// The response message containing the greetings
message HelloReply {
  string message = 1;
}

记住,需要保存文件。

重新生成 gRPC 代码

在你使用新的服务方法前,你需要重新编译更新后的 .proto 文件。

examples/helloworld 目录里面,运行下面的命令:

$ protoc --go_out=. --go_opt=paths=source_relative \
    --go-grpc_out=. --go-grpc_opt=paths=source_relative \
    helloworld/helloworld.proto

这会重新生成 helloworld/helloworld.pb.gohelloworld/helloworld_grpc.pb.go 文件,包含了:

  • 用于填充,序列化,和获取 HelloRequestHelloReply 的消息类型。
  • 生成客户端和服务器代码

更新和运行应用

你已经重新生成了服务器和客户端代码,但仍需要在示例应用程序的人为编写部分中实现并调用新方法。

更新服务器

打开 greeter_server/main.go 并添加以下函数:

func (s *server) SayHelloAgain(ctx context.Context, in *pb.HelloRequest) (*pb.HelloReply, error) {
        return &pb.HelloReply{Message: "Hello again " + in.GetName()}, nil
}

更新客户端

打开 greeter_client/main.go 并添加以下代码到 main() 函数体的尾部:

r, err = c.SayHelloAgain(ctx, &pb.HelloRequest{Name: *name})
if err != nil {
        log.Fatalf("could not greet: %v", err)
}
log.Printf("Greeting: %s", r.GetMessage())

记住保存你的修改。

运行!

像之前那样运行客户端和服务器。 在 examples/helloworld 目录运行以下命令:

  1. 运行服务器
$ go run greeter_server/main.go
  1. 打开另一个终端,运行客户端。这一次添加一个名字作为命令行参数
$ go run greeter_client/main.go --name=Alice

你会看到如下输出

$ Greeting: Hello Alice
Greeting: Hello again Alice

下一步