安装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 main
import (
"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 main
import (
"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导入自定义包