本文通过一个简单的示例,了解如何在Go中使用gRPC。
$ go version
查看go语言版本,gRPC要求go 语言最低版本为1.5使用命令行安装
* 使用以下命令安装gRPC:
$ go get google.golang.org/grpc
protoc--.zip
文件。 protoc--.zip
文件。 $ go get -u github.com/golang/protobuf/protoc-gen-go
protoc-gen-go
,并将其安装在$GOBIN
路径中,默认为$GOPATH/bin
。 $PATH
环境变量,协议编译器protoc才能找到它。将此命令$ export PATH=$PATH:$GOPATH/bin
加入到~/.profile
文件的最后,保存,用source ~/.profile
使文件生效。通过go get google.golang.org/grpc
获取的grpc代码中还包含示例。这个实例可以在以下路径中找到:
$GOPATH/src/google.golang.org/grpc/examples
。
切换到示例目录:
$ 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消息类型的代码。
使用go run
命令和运行服务器和客户端代码。
在examples目录中:
运行:$ go run greeter_server/main.go
打开另一个的终端,到相同的目录下:
运行:$ go run greeter_client/main.go
你会看到Greeting: Hello world客户端的输出。
恭喜!您刚刚使用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;
}
接下来,我们需要更新应用程序使用的gRPC代码,以便能使用定义的新服务。在($GOPATH/src/google.golang.org/grpc/examples/helloworld
)这个目录,运行以下命令,将重新生成helloworld.pb.go:
$ protoc -I helloworld/ helloworld/helloworld.proto --go_out=plugins=grpc:helloworld
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
参考文章:
官方英文文档:https://grpc.io/docs/quickstart/go.html
官方中文文档:http://doc.oschina.net/grpc?t=57966