go版本gRPC入门

本文通过一个简单的示例,了解如何在Go中使用gRPC。

1、前期准备

前提

  • 运行 $ go version查看go语言版本,gRPC要求go 语言最低版本为1.5

安装gRPC

使用命令行安装
* 使用以下命令安装gRPC:
$ go get google.golang.org/grpc

  • 安装proto3
    1)安装用于生成gRPC服务代码的protoc编译器。最简单的方法是从这里下载protoc-<version>-<platform>.zip文件。
    2)解压缩protoc-<version>-<platform>.zip文件。
    3)更新环境变量PATH,使protoc能全局使用。
    4)安装Go的protoc插件,使用以下命令:
    $ go get -u github.com/golang/protobuf/protoc-gen-go
    获取编译器插件protoc-gen-go,并将其安装在$GOBIN路径中,默认为$GOPATH/bin
    5)必须设置好$PATH环境变量,协议编译器protoc才能找到它。将此命令$ export PATH=$PATH:$GOPATH/bin加入到~/.profile文件的最后,保存,用source ~/.profile使文件生效。

2、下载示例

通过go get google.golang.org/grpc获取的grpc代码中还包含示例。这个实例可以在以下路径中找到:
$GOPATH/src/google.golang.org/grpc/examples

3、编译example

切换到示例目录:

$ cd $GOPATH/src/google.golang.org/grpc/examples/helloworld

.proto文件中定义了gRPC服务,用于生成相应的.pb.go文件。该.pb.go文件是通过使用协议编译器protoc编译.proto文件生成的。

在样例中,该helloworld.pb.go文件已经被生成(通过编译helloworld.proto),并且可以在这个目录中找到:

$GOPATH/src/google.golang.org/grpc/examples/helloworld/helloworld

helloworld.pb.go文件包含:
* 生成的客户端和服务器代码。
* 用于填充,序列化和检索我们HelloRequest和HelloReply消息类型的代码。

4、运行

使用go run命令和运行服务器和客户端代码。

在examples目录中:
运行:$ go run greeter_server/main.go

打开另一个的终端,到相同的目录下:
运行:$ go run greeter_client/main.go

你会看到Greeting: Hello world客户端的输出。

恭喜!您刚刚使用gRPC运行了客户端 - 服务器应用程序。

5、更新gRPC服务

现在我们来看看如何使用服务器上的一个额外的方法来更新应用程序,以供客户端调用。我们的gRPC服务是使用protocol buffer定义的; 您可以在.proto 文件中找到关于定义服务的更多信息。现在,您需要知道的是,服务器和客户端“stub”都有一个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;
}

更新这个方法,使Greeter服务有两种方法。确保在同一个例子中修改,如$GOPATH/src/google.golang.org/grpc/examples/helloworld目录

使用相同的请求和响应类型,使用新的SayHelloAgain方法编辑和更新helloworld/helloworld.proto

// 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;
}

6、生成gRPC代码

接下来,我们需要更新应用程序使用的gRPC代码,以便能使用定义的新服务。在($GOPATH/src/google.golang.org/grpc/examples/helloworld)这个目录,运行以下命令,将重新生成helloworld.pb.go:

$ protoc -I helloworld/ helloworld/helloworld.proto --go_out=plugins=grpc:helloworld

7、更新并运行应用程序

更新服务器

  • 编辑greeter_server/main.go并添加以下函数:
func (s *server) SayHelloAgain(ctx context.Context, in *pb.HelloRequest) (*pb.HelloReply, error) {
        return &pb.HelloReply{Message: "Hello again " + in.Name}, nil
}
  • 更新客户端

编辑greeter_client/main.go将以下代码添加到主函数的最后。

r, err = c.SayHelloAgain(context.Background(), &pb.HelloRequest{Name: name})
if err != nil {
        log.Fatalf("could not greet: %v", err)
}
log.Printf("Greeting: %s", r.Message)
  • 运行服务器
$ go run greeter_server/main.go
  • 在不同的终端上运行客户端
$ go run greeter_client/main.go
  • 输出:
$ go run greeter_client/main.go
Greeting: Hello world
Greeting: Hello again world
  • Note: 可以多次运行客户端指令

参考文章:
官方英文文档:https://grpc.io/docs/quickstart/go.html
官方中文文档:http://doc.oschina.net/grpc?t=57966

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值