GRPC是一个使用缓冲协议和HTTP/2构建的高性能RPC框架。在Go中创建GRPC客户端与使用Go HTTP客户端有很多相同的复杂性。

为了演示基本的客户端使用情况,最简单的方法是实现一个服务器。这个配方将创建一个欢迎服务,它接受问候和名称并返回欢迎语句。

本文不会探讨有关GRPC的一些细节,例如流媒体。

实践

安装第三方库:

安装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

建立 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

建立 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)
}

建立 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
}

建立 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)
}

分别运行server.go和greeter.go,然后在另一个命令行运行client.go,这会输出:

response:"Hello Reader!"
response:"Goodbye Reader!"

说明

GRPC服务器设置为侦听端口4444.一旦客户端连接,它就可以发送请求并从服务器接收响应。 请求,响应和支持的方法的结构由protoc生成的。实际上,当针对GRPC服务器进行集成时,应该提供.proto文件,该文件可用于自动生成客户端 。

除了客户端之外,protoc命令还会为服务器生成存根,所需的只是填写实现细节。 生成的Go代码也具有JSON标记,并且可以为JSON REST服务重用相同的结构。 我们的代码设置了一个不安全的客户端。 要安全地处理GRPC,你需要使用SSL证书。

最后编辑: kuteng  文档更新时间: 2021-01-03 15:03   作者:kuteng