## 理解GRPC的使用 GRPC是一个使用[缓冲协议](https://developers.google.com/protocol-buffers)和[HTTP/2](https://http2.github.io/)构建的高性能RPC框架。在Go中创建GRPC客户端与使用Go HTTP客户端有很多相同的复杂性。 为了演示基本的客户端使用情况,最简单的方法是实现一个服务器。这个配方将创建一个欢迎服务,它接受问候和名称并返回欢迎语句。 本文不会探讨有关GRPC的一些细节,例如流媒体。 ### 实践 1. 安装第三方库: 安装GRPC https://github.com/grpc/grpc/blob/master/INSTALL.md. ``` go get github.com/golang/protobuf/proto go get github.com/golang/protobuf/protoc-gen-go ``` 2. 建立 greeter.proto: ``` syntax = "proto3"; package greeter; service GreeterService{ rpc Greet(GreetRequest) returns (GreetResponse) {} } message GreetRequest { string greeting = 1; string name = 2; } message GreetResponse{ string response = 1; } ``` 运行 ``` protoc --go_out=plugins=grpc:. greeter.proto ``` 3. 建立 server.go: ``` package main import ( "fmt" "net" "github.com/agtorre/go-cookbook/chapter6/grpc/greeter" "google.golang.org/grpc" ) func main() { grpcServer := grpc.NewServer() greeter.RegisterGreeterServiceServer(grpcServer, &Greeter{Exclaim: true}) lis, err := net.Listen("tcp", ":4444") if err != nil { panic(err) } fmt.Println("Listening on port :4444") grpcServer.Serve(lis) } ``` 4. 建立 greeter.go: ``` package main import ( "fmt" "github.com/agtorre/go-cookbook/chapter6/grpc/greeter" "golang.org/x/net/context" ) // Greeter 实现了protoc生成的接口 type Greeter struct { Exclaim bool } // Greet 实现grpc Greet func (g *Greeter) Greet(ctx context.Context, r *greeter.GreetRequest) (*greeter.GreetResponse, error) { msg := fmt.Sprintf("%s %s", r.GetGreeting(), r.GetName()) if g.Exclaim { msg += "!" } else { msg += "." } return &greeter.GreetResponse{Response: msg}, nil } ``` 5. 建立 client.go: ``` package main import ( "context" "fmt" "github.com/agtorre/go-cookbook/chapter6/grpc/greeter" "google.golang.org/grpc" ) func main() { conn, err := grpc.Dial(":4444", grpc.WithInsecure()) if err != nil { panic(err) } defer conn.Close() client := greeter.NewGreeterServiceClient(conn) ctx := context.Background() req := greeter.GreetRequest{Greeting: "Hello", Name: "Reader"} resp, err := client.Greet(ctx, &req) if err != nil { panic(err) } fmt.Println(resp) req.Greeting = "Goodbye" resp, err = client.Greet(ctx, &req) if err != nil { panic(err) } fmt.Println(resp) } ``` 6. 分别运行server.go和greeter.go,然后在另一个命令行运行client.go,这会输出: ``` response:"Hello Reader!" response:"Goodbye Reader!" ``` ### 说明 GRPC服务器设置为侦听端口4444.一旦客户端连接,它就可以发送请求并从服务器接收响应。 请求,响应和支持的方法的结构由protoc生成的。实际上,当针对GRPC服务器进行集成时,应该提供.proto文件,该文件可用于自动生成客户端 。 除了客户端之外,protoc命令还会为服务器生成存根,所需的只是填写实现细节。 生成的Go代码也具有JSON标记,并且可以为JSON REST服务重用相同的结构。 我们的代码设置了一个不安全的客户端。 要安全地处理GRPC,你需要使用SSL证书。 * * * * 学识浅薄,错误在所难免。欢迎在群中就本书提出修改意见,以飨后来者,长风拜谢。 Golang中国(211938256) beego实战(258969317) Go实践(386056972)