Go gRPC 快速开始 | 翻译并修复官方文档几处 bug | 更新软件版本到最新 | 已经提交 Pull 给官方

imanner · 2021年12月16日 · 最后由 safala 回复于 2023年08月29日 · 445 次阅读

gRPC | 快速开始

原文地址:https://grpc.io/docs/languages/go/quickstart/#regenerate-grpc-code

本文将带你使用 go 语言实现一个 gRPC 的小小示例。

环境准备

  1. 使用下面的命令安装:

    // 当前日期为20211216 最新版本为: 1.27.1
    $ go install google.golang.org/protobuf/cmd/[email protected]
    // 当前日期为20211216 最新版本为: 1.1.0
    $ go install google.golang.org/grpc/cmd/[email protected]
    
  2. protoc 编译器的执行文件路径添加到PATH:

    $ export PATH="$PATH:$(go env GOPATH)/bin"
    

获取示例代码

示例代码仓库的位置:grpc-go .

  1. 克隆仓库,当然,您也可以下载 zip 压缩文件,下载地址: zip :

    // 当前日期为20211216 最新版本为: 1.43.0
    
    $ git clone -b v1.43.0 https://github.com/grpc/grpc-go  
    
  2. 切换到示例文件夹:

    $ cd grpc-go/examples/helloworld
    

运行示例

假设您已经切换至目录:examples/helloworld

  1. 编译并运行服务端文件:

    $ go run greeter_server/main.go
    
  2. 打开一个新的命令行,也要进入grpc-go/examples/helloworld目录,运行客户端文件,观察客户端输出:

    $ go run greeter_client/main.go
    Greeting: Hello world
    

ヾ (◍°∇°◍) ノ゙, 至此,恭喜,您已经成功运行了一个包含完整客户端和服务端的 gRPC 项目。

升级一下我们的 gRPC 服务

本小节中咱们将通过扩展服务端方法来升级一下我们的示例项目。

gRPC 服务是通过 protocol buffers 来定义的,如果您想学习更多通过编写 .proto 文件来定义服务的知识,可以参考文章: 基础指引.

但现在,咱们只要知道 在示例项目中,服务端和客户端都包含一个 RPC 调用的 SayHello() 方法,并且需要从客户端传入参数 HelloRequest , 服务端会返回 HelloReply , 能明白到这儿,就足够了!

方法定义如下:

// 定义 greeting 服务.
service Greeter {
    // 发送 greeting 信息
    rpc SayHello (HelloRequest) returns (HelloReply) {}
}

// 请求 message 包含用户的 name.
message HelloRequest {
    string name = 1;
}

// 响应 message 包含 greetings 信息
message HelloReply {
    string message = 1;
}

打开 helloworld/helloworld.proto 文件,新建 SayHelloAgain() 方法,参数和返回值和 SayHello 保持一致:

// 定义 greeting 服务.
service Greeter {
    // 发送 greeting 信息
    rpc SayHello (HelloRequest) returns (HelloReply) {}
    // 新增方法
    // 发送 另一 greeting 信息
    rpc SayHelloAgain (HelloRequest) returns (HelloReply) {}
}

// 请求 message 包含用户的 name.
message HelloRequest {
    string name = 1;
}

// 响应 message 包含 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
    
  2. 打开另一命令行窗口,运行客户端。这一次,要在命令行上添加一个名字 Alice 作为参数:

    $ go run greeter_client/main.go -name=Alice
    

    您应该看到如下输出:

    Greeting: Hello Alice
    Greeting: Hello again Alice
    

下一步要做啥

可以啊,这个

需要 登录 后方可回复, 如果你还没有账号请 注册新账号