【学习笔记】go-gRPC 初尝试
安装protoc
安装地址
找到对应版本的anz安装文件
解压,将文件夹移动到goroot目录中,可以通过命令go env
查看goroot目录。
如我的goroot目录为D:\\Program Files\\Go
或者移动到自定义目录,并将该目录设置到环境变量中即可。
安装go插件
go本身并不支持protoc,要安装插件获得对应支持。
这里使用go mod 更新插件
在项目目录中
go mod init grpc_study
go get google.golang.org/protobuf/cmd/protoc-gen-go
go get google.golang.org/grpc/cmd/protoc-gen-go-grpc
编辑proto文件
syntax="proto3"; //pb版本号
package raftRpc; //pb包名
option go_package = "./pb"; // 如果编译出现找不到go_package问题,建议添加声明service TestRpc {rpc Testecho (EchoRequest) returns (EchoResponse) {}
}message EchoRequest {string message = 1;
}message EchoResponse {string message = 1;
}
生成.go文件
使用如下命令进行编译
protoc --go_out=. --go-grpc_out=. .\\test.proto
会看到执行编译目录下输出两个文件
test.pb.go
主要是对message生成对应的结构体和方法test_grpc.pb.go
生成gRPC,主要是对service生成对应的interface接口和方法
使用生成的文件编写服务
package mainimport ("context""grpc_study/pb""log""net""google.golang.org/grpc"
)type server struct {// 继承 protoc-gen-go-grpc 生成的服务端代码pb.UnimplementedTestRpcServer
}// SimplePRC 服务端代码
func (s *server) Testecho(ctx context.Context, in *pb.EchoRequest) (*pb.EchoResponse, error) {log.Println("client call simpleRPC...")log.Println(in)return &pb.EchoResponse{Message: "hi! you say " + in.Message}, nil
}func main() {// 监听本地 5678 端口listen, err := net.Listen("tcp", ":5678")if err != nil {log.Fatal(err)return}// 创建 gRPC 服务器s := grpc.NewServer()// 将实现的接口注册进 gRPC 服务器pb.RegisterTestRpcServer(s, &server{})log.Println("gRPC server starts running...")// 启动 gRPC 服务器err = s.Serve(listen)if err != nil {log.Fatal(err)return}
}
客户端
package mainimport ("context""grpc_study/pb""log""google.golang.org/grpc""google.golang.org/grpc/credentials/insecure"
)func Testecho(c pb.TestRpcClient) {ctx := context.Background()// 调用服务端 SimpleRPC 并获取响应reply, err := c.Testecho(ctx, &pb.EchoRequest{Message: "hello"})if err != nil {log.Fatal(err)}log.Println(reply.GetMessage())
}func main() {// 连接服务端,因为我们没有SSL证书,因此这里需要禁用安全传输dial, err := grpc.Dial("127.0.0.1:5678", grpc.WithTransportCredentials(insecure.NewCredentials()))if err != nil {log.Fatal(err)return}defer dial.Close()conn := pb.NewTestRpcClient(dial)Testecho(conn)
}
运行结果
附件(有需要自取)
由于防盗链设置,请到原文下载原文连接
参考资料
CSDN : 【Golang | gRPC】使用protoc编译.proto文件
CSDN : gRPC 入门使用教程
CSDN : go导入自定义包