# 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).
有疑问加站长微信联系(非本文作者)