天天看点

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

// The response message containing the greetings
message HelloReply {
  string message = ;
}
           

更新这个方法,使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 = ;
}

// The response message containing the greetings
message HelloReply {
  string message = ;
}
           

6、生成gRPC代码

接下来,我们需要更新应用程序使用的gRPC代码,以便能使用定义的新服务。在(

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

)这个目录,运行以下命令,将重新生成helloworld.pb.go:

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_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