gRPC

安装

安装 Protocol Buffers

https://github.com/protocolbuffers/protobuf/releases

安装 gRPC 库

go get google.golang.org/grpc

安装 protocol 编译器

go install google.golang.org/protobuf/cmd/protoc-gen-go@latest
go install google.golang.org/grpc/cmd/protoc-gen-go-grpc@latest

使用

编写 .proto 文件

proto/hello.proto

syntax = "proto3";

// 生成文件目录,生成文件的包名
option go_package = ".;service";

service Greeter {
  rpc SayHello(HelloRequest) returns (HelloResponse) {}
}

// 1表示在message中的位置
message HelloRequest {
  string name = 1;
}

message HelloResponse {
  string message = 1;
}

生成 .go 文件

protoc --go_out=. hello.proto
protoc --go-grpc_out=. hello.proto

编写 server 端

package main

import (
    "context"
    pb "gdemo/server/proto"
    "google.golang.org/grpc"
    "log"
    "net"
)

type server struct {
    pb.UnimplementedGreeterServer
}

func (s *server) SayHello(ctx context.Context, in *pb.HelloRequest) (*pb.HelloResponse, error) {
    return &pb.HelloResponse{Message: "Hello " + in.Name}, nil
}

func main() {
    // 监听端口
    ln, err := net.Listen("tcp", ":8080")
    if err != nil {
        log.Fatalf("failed to listen: %v", err)
    }

    // 创建grpc服务
    grpcServer := grpc.NewServer()
    // 在grpc服务中注册
    pb.RegisterGreeterServer(grpcServer, &server{})

    // 启动
    err = grpcServer.Serve(ln)
    if err != nil {
        log.Fatalf("failed to serve: %v", err)
    }
}

编写 client 端

package main

import (
    "context"
    "fmt"
    pb "gdemo/client/proto"
    "google.golang.org/grpc"
    "google.golang.org/grpc/credentials/insecure"
    "log"
)

func main() {
    // 连接服务端,此处禁用安全传输,没有加密和验证
    conn, err := grpc.NewClient(
        "127.0.0.1:8080",
        grpc.WithTransportCredentials(insecure.NewCredentials()),
    )
    if err != nil {
        log.Fatal(err)
    }
    defer conn.Close()

    // 连接
    client := pb.NewGreeterClient(conn)

    // 执行rpc调用
    resp, err := client.SayHello(context.Background(), &pb.HelloRequest{Name: "world"})
    fmt.Println(resp, err)
}