安装protoc

安装地址

找到对应版本的anz安装文件
file

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

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

file

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

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

会看到执行编译目录下输出两个文件
file

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

运行结果

file

附件(有需要自取)

grpc_study.zip

参考资料

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

Categories:

Tags:

还没发表评论,快来发表第一个评论吧~

发表回复