go grpc protobuf 使用
1.下载protoc https://github.com/protocolbuffers/protobuf/releases,解压出 protoc.exe 放到到GOROOT目录下
2.下载 protoc-gen-go 文件
go install github.com/golang/protobuf/protoc-gen-go@latest
会在<GOPATH>/bin
下生成protoc-gen-go.exe
文件,
3.下载依赖包
# 安装 golang 的proto工具包
# go get -u github.com/golang/protobuf/proto
# 安装 goalng 的proto编译支持
# go get -u
google.golang.org/protobuf
# 安装 GRPC 包 # go get -u google.golang.org/grpc
4.编写proto文件
syntax = "proto3"; package services; option go_package = "./;proto"; service Greeter { rpc SayHello (HelloRequest) returns (HelloReply); } message HelloRequest { string name = 1; } message HelloReply { string message = 1; }
5.生成 pd.go 文件
cd到proto目录下 命令:protoc -I . hello.proto --go_out=plugins=grpc:. 命令解释: protoc -I .:在当前路径下寻找hello.proto文件 --go_out=plugins=grpc:. :生成go语言的proto文件放在当前路径下
6.server 和client 通信
├─client │ client.go │ ├─proto │ hello.pb.go │ hello.proto │ └─server server.go
7.server.go 服务端文件
package main import ( "context" "net" "test/grpc/proto" "google.golang.org/grpc" ) type Server struct{} // 业务逻辑 func (s *Server) SayHello(ctx context.Context, request *proto.HelloRequest) (*proto.HelloReply, error) { res := &proto.HelloReply{ Message: "hello " + request.Name, } return res, nil } // 启动rpc的server服务 func start() { // 1.实例化server g := grpc.NewServer() // 2.注册逻辑到server中 proto.RegisterGreeterServer(g, &Server{}) // 3.启动server lis, err := net.Listen("tcp", "127.0.0.1:8081") if err != nil { panic("监听错误:" + err.Error()) } err = g.Serve(lis) if err != nil { panic("启动错误:" + err.Error()) } } func main() { start() }
8.client.go 客户端文件
package main import ( "context" "fmt" "test/grpc/proto" "google.golang.org/grpc" ) // rpc调用 func clientRpc(body map[string]string) (res *proto.HelloReply, err error) { name := body["name"] conn, err := grpc.Dial("127.0.0.1:8081", grpc.WithInsecure()) if err != nil { return nil, err } defer conn.Close() rpc := proto.NewGreeterClient(conn) response, err := rpc.SayHello(context.Background(), &proto.HelloRequest{Name: name}) if err != nil { return nil, err } return response, nil } // 业务代码 func start() { body := make(map[string]string) body["name"] = "jeff" response, err := clientRpc(body) if err != nil { fmt.Println("rpc调用失败:", err) return } fmt.Println(response.Message) } func main() { start() }
posted on 2022-07-15 15:17 running-fly 阅读(208) 评论(0) 编辑 收藏 举报