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

guest123 · · 811 次点击 · 开始浏览    置顶
这是一个创建于 的主题,其中的信息可能已经有所发展或是发生改变。

# gRPC | 快速开始 > 原文地址: https://grpc.io/docs/languages/go/quickstart/#regenerate-grpc-code 本文将带你使用go语言实现一个gRPC 的小小示例. ### 环境准备 - Go, 推荐安装最新的go版本. 具体安装方法,可以参考**go语言官方文档的** [快速开始](http://docscn.studygolang.com/doc/tutorial/getting-started) - **[Protocol buffer](https://developers.google.com/protocol-buffers) 的编译器**版本3. 具体安装方法, 可以参考文章: [Protocol Buffer 编译器安装](https://grpc.io/docs/protoc-installation/) - protocol 编译器的go语言插件: 1. 使用下面的命令安装: ```shell // 当前日期为20211216 最新版本为: 1.27.1 $ go install google.golang.org/protobuf/cmd/protoc-gen-go@v1.27 // 当前日期为20211216 最新版本为: 1.1.0 $ go install google.golang.org/grpc/cmd/protoc-gen-go-grpc@v1.1 ``` 2. 将 `protoc` 编译器的执行文件路径添加到`PATH`: ```shell $ export PATH="$PATH:$(go env GOPATH)/bin" ``` ### 获取示例代码 示例代码仓库的位置: [grpc-go](https://github.com/grpc/grpc-go) . 1. 克隆仓库, 当然, 您也可以下载zip压缩文件,下载地址: [zip](https://github.com/grpc/grpc-go/archive/v1.43.0.zip) : ```shell // 当前日期为20211216 最新版本为: 1.43.0 $ git clone -b v1.43.0 https://github.com/grpc/grpc-go ``` 2. 切换到示例文件夹: ```shell $ cd grpc-go/examples/helloworld ``` ### 运行示例 假设您已经切换至目录: `examples/helloworld` 1. 编译并运行服务端文件: ```shell $ go run greeter_server/main.go ``` 2. 打开一个新的命令行, 也要进入`grpc-go/examples/helloworld`目录, 运行客户端文件, 观察客户端输出: ```shell $ go run greeter_client/main.go Greeting: Hello world ``` **ヾ(◍°∇°◍)ノ゙**, 至此, 恭喜, 您已经成功运行了一个包含完整客户端和服务端的 `gRPC` 项目. ### 升级一下我们的gRPC服务 本小节中咱们将通过扩展服务端方法来升级一下我们的示例项目. gRPC 服务是通过 [protocol buffers](https://developers.google.com/protocol-buffers) 来定义的, 如果您想学习更多通过编写 `.proto` 文件来定义服务的知识, 可以参考文章: [基础指引](https://grpc.io/docs/languages/go/basics/). 但现在, 咱们只要知道 在示例项目中, 服务端和客户端都包含一个 RPC 调用的 `SayHello()` 方法, 并且需要从客户端传入参数 `HelloRequest` , 服务端会返回 `HelloReply` , 能明白到这儿, 就足够了! 方法定义如下: ```protobuf // 定义 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` 保持一致: ```protobuf // 定义 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` 目录, 然后运行下列命令: ```shell $ protoc --go_out=. --go_opt=paths=source_relative \ --go-grpc_out=. --go-grpc_opt=paths=source_relative \ helloworld/helloworld.proto ``` 以上命令会重新创建 `helloworld/helloworld.pb.go` 和 `helloworld/helloworld_grpc.pb.go` 文件, 文件内容包含以下内容: - 构成, 序列化, 检索 `HelloRequest` 和 `HelloReply` 消息类型的一些列代码. - 创建 客户端 和 服务端 的代码. ### 升级并运行项目 你已经重新生成了 服务端和客户端的代码, 但是你仍然需要在应用中自己去实现以及调用新添加的方法. #### 升级服务端 打开 `greeter_server/main.go` 文件, 将下面的方法添加到文件中: ```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()` 方法体的尾部: ```go 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. 运行服务端: ```shell $ go run greeter_server/main.go ``` 2. 打开另一命令行窗口, 运行客户端. 这一次, 要在命令行上添加一个名字 `Alice` 作为参数: ```shell $ go run greeter_client/main.go -name=Alice ``` 您应该看到如下输出: ```shell Greeting: Hello Alice Greeting: Hello again Alice ``` ### 下一步要做啥 1. 深入了解 gRPC 工作机制: [gRPC简介](https://grpc.io/docs/what-is-grpc/introduction/) 和 [gRPC核心概念](https://grpc.io/docs/what-is-grpc/core-concepts/). 2. 过一遍 [基础指引](https://grpc.io/docs/languages/go/basics/). 3. 翻阅 [API 文档](https://grpc.io/docs/languages/go/api).

有疑问加站长微信联系(非本文作者)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

811 次点击  ∙  1 赞  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传