1. 下载 protobuf 插件
    https://github.com/protocolbuffers/protobuf/releases
  2. 安装 golang 插件
    go get github.com/golang/protobuf/protoc-gen-go
  3. 初始化 go module
    go mod init test
  4. 编写 .proto 文件
    vi test.proto
    syntax = "proto3";
    package service;
    option go_package = ".;service";
    service Greeter {
     rpc SayHello (HelloRequest) returns (HelloReply) {}
    }
    message HelloRequest {
     string name = 1;
    }
    message HelloReply {
     string message = 1;
    }
  5. 新建 service 目录(略)
  6. 生成 go 语言代码
    protoc -I ./ ./test.proto --go_out=plugins=grpc:service
  7. 安装依赖
    go mod download
  8. 创建服务端代码
    vi server.go
    package main
    import (
     "context"
     "fmt"
     "test/service"
     "google.golang.org/grpc"
     "google.golang.org/grpc/reflection"
     "net"
    )
    type server struct{}
    func (s *server) SayHello(ctx context.Context, in *service.HelloRequest) (*service.HelloReply, error) {
     return &service.HelloReply{Message: "hello " + in.Name + "\n"}, nil
    }
    func main() {
     // 监听本地端口
     lis, err := net.Listen("tcp", ":8080")
     if err != nil {
         fmt.Printf("监听端口失败: %s", err)
         return
     }
     // 创建gRPC服务器
     s := grpc.NewServer()
     // 注册服务
     service.RegisterGreeterServer(s, &server{})
     reflection.Register(s)
     err = s.Serve(lis)
     if err != nil {
         fmt.Printf("开启服务失败: %s", err)
         return
     }
    }
  9. 创建客户端代码
    vi client.go
    package main
    import (
     "context"
     "fmt"
     "google.golang.org/grpc"
     "test/service"
    )
    func main() {
     // 连接服务器
     conn, err := grpc.Dial(":8080", grpc.WithInsecure())
     if err != nil {
         fmt.Printf("连接服务端失败: %s", err)
         return
     }
     defer conn.Close()
     // 新建一个客户端
     c := service.NewGreeterClient(conn)
     // 调用服务端函数
     r, err := c.SayHello(context.Background(), &service.HelloRequest{Name: "lee"})
     if err != nil {
         fmt.Printf("调用服务端代码失败: %s", err)
         return
     }
     fmt.Printf("调用成功: %s", r.Message)
    }
  10. 运行
    go run server.go
    go run client.go
文档更新时间: 2021-11-26 10:59   作者:lee