go-protobuf+grpc (windows)

下载grpc包

go get google.golang.org/grpc
下载protoc命令包:https://github.com/protocolbuffers/protobuf/releases,随便安装在那个路径都行,把protoc.exe文件的路径放在系统环境变量上,这样在IDE的控制台才能执行protoc命令。

安装依赖项

  • 1 代码生成工具: protoc-gen-go
  • 2 由于前面已经安装grpc包了,这里就不用go get命令,直接go install 安装就行。
go install google.golang.org/protobuf/cmd/protoc-gen-go
go install google.golang.org/grpc/cmd/protoc-gen-go-grpc

上面步骤做完后,会在GOPATH目录下生成2个文件

1667640255539.png
创建一个 models.proto文件
syntax="proto3";

package grpc;

option go_package = ".;grpc";

service Greeter {
  rpc SayHello (HelloRequest) returns (HelloReply);
}
message HelloRequest {
  string name = 1;
}
message HelloReply {
  string message = 1;
}

生成bp.go文件 '.' 代表当下文件

控制台执行命令 :
protoc --go_out=. *.proto
protoc --go-grpc_out=. *.proto

protoc 参数解析

  • 1 protoc --go_out=path field (path 为输出的目录,field 为要解析的proto文件)
  • 2 message 是protobuf最基本的数据单元,类似go里的结构体的存在.
  • 3 service 定义服务处理函数的
service Search{
  rpc SayHello (HelloRequest) returns (HelloReply);
}

Demo 示例

  • 1 服务端
import (
    "context"
    grpcdemo "google.golang.org/grpc"
    "net"
)

type Server struct{}

func (s *Server) SayHello(ctx context.Context, request *HelloRequest) (*HelloReply, error) {
    res := &HelloReply{
        Message: "hello___" + request.Name,
    }
    return res, nil
}

func main() {
    g := grpcdemo.NewServer()
    RegisterGreeterServer(g, &Server{})

    lis, err := net.Listen("tcp", "127.0.0.1:8888")
    if err != nil {
        panic("监听错误:" + err.Error())
    }
    err = g.Serve(lis)
    if err != nil {
        panic("启动错误:" + err.Error())
    }
}
  • 2 客户端
func clientRpc(body map[string]string) (*HelloReply, error) {
    conn, err := grpc.Dial("127.0.0.1:8888", grpc.WithInsecure())
    if err != nil {
        return nil, err
    }
    defer conn.Close()
    rpc := NewGreeterClient(conn)
    response, err := rpc.SayHello(context.Background(), &HelloRequest{Name: body["name"]})
    if err != nil {
        return nil, err
    }
    return response, nil
}

func main() {
    body := make(map[string]string)
    body["name"] = "红楼梦~"
    response, err := clientRpc(body)
    if err != nil {
        fmt.Println("rpc调用失败:", err)
        return
    }
    fmt.Println("服务端返回的响应__:", response.Message)
}
  • 3 启动服务端后再启动客户端代码:


    image.png

版本包的坑

  • 1 github.com/golang/protobuf/protoc-gen-go 旧版本包

  • 2 google.golang.org/protobuf/cmd/protoc-gen-go 谷歌接管后的新包

  • 3 它们之间生成的命令行是不一样的,生成后的文件也不一样

  • 4 protoc --go_out=plugins=grpc:. helloworld.proto 这个命令是github版本包的生成命令

  • 5 如果报"protoc-gen-go-grpc: Plugin failed with status code 1." 该命令不是本包的命令,是由于前面 go install 的时候没有安装好依赖项!

在proto文件里的message每个字段都有唯一的编号标识符
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容