> 文章列表 > 【学习笔记】go-gRPC 初尝试

【学习笔记】go-gRPC 初尝试

【学习笔记】go-gRPC 初尝试

安装protoc

安装地址

找到对应版本的anz安装文件
【学习笔记】go-gRPC 初尝试

解压,将文件夹移动到goroot目录中,可以通过命令go env查看goroot目录。

如我的goroot目录为D:\\Program Files\\Go

【学习笔记】go-gRPC 初尝试

或者移动到自定义目录,并将该目录设置到环境变量中即可。

安装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

会看到执行编译目录下输出两个文件
【学习笔记】go-gRPC 初尝试

  • 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)
}

运行结果

【学习笔记】go-gRPC 初尝试

附件(有需要自取)

由于防盗链设置,请到原文下载原文连接

参考资料

CSDN : 【Golang | gRPC】使用protoc编译.proto文件
CSDN : gRPC 入门使用教程
CSDN : go导入自定义包