Golang环境下Protobuf和gRPC安装配置及使用

Golang环境下Protobuf和gRPC安装配置及使用

  • Protobuf简介
  • [Protobuf3 语法](https://blog.csdn.net/Mr_XiMu/article/details/123106077)
  • Protobuf下载安装
    • 需要先下载protoc执行器
  • Protobuf下Go、GRPC插件的安装
  • Protobuf结合Grpc的使用
    • 项目结构
    • 1、编辑helloword.proto
    • 2、将helloword.proto生成go代码
    • 3、生成后的目录结构
    • 4、编辑client.go
    • 5、server.go
    • 6、运行

部分参考:gRPC配置记录

Protobuf简介

ProtobufProtocol Buffer的简称,它是Google公司于2008年开源的一种高效的平台无关、语言无关、可扩展的数据格式(协议)【与JSONXML数据格式一样用于数据传输时使用】,目前Protobuf作为接口规范的描述语言,可以作为Go语言RPC调用的协议。

Protobuf3 语法

Protobuf下载安装

需要先下载protoc执行器

1、到 https://github.com/protocolbuffers/protobuf/releases 分别下载Windows和Linux环境的执行器
2、选择最新版本的protoc下载
Golang环境下Protobuf和gRPC安装配置及使用_第1张图片
3、将下载的文件解压,将解压后的bin目录加入到环境变量的path下。
4、查看安装是否成功

 protoc  --version

Protobuf下Go、GRPC插件的安装

protoc-gen-go:Go专用的protoc的编译器插件,安装后会在GOPATH的bin目录下生成一个protoc-gen-go.exe
protoc-gen-go-grp:Go调用grpc的插件,安装后会在GOPATH的bin目录下生成一个protoc-gen-go-grpc.exe

go install google.golang.org/protobuf/cmd/[email protected]

go install google.golang.org/grpc/cmd/[email protected]

至此使用Protobuf的准备工作就做完了

Protobuf结合Grpc的使用

项目结构

├─practice
│  │  go.mod
│  │  go.sum
│  │
│  ├─client
│  │  ├─sample_client
│  │  │      client.go
│  │
│  ├─proto
│  │  │  helloworld.proto
│  │
│  └─server
│      ├─simple_server
│      │      server.go
│

1、编辑helloword.proto

syntax = "proto3";

package proto;      // 包名
option go_package = '/grpc/service';    // 指定生成的go代码所存放的路径,不用提前创建

service Greeter {
  rpc SayHello (HelloRequest) returns (HelloReply) {}
}

message HelloRequest {
  string name = 1;
}

message HelloReply {
  string message = 1;
}

2、将helloword.proto生成go代码

# 进入存放.proto路径下
cd proto
# 生成代码
protoc --go_out=. --go-grpc_out=. *.proto

# 最后一个参数为源文件的名称

3、生成后的目录结构

├─practice
│  │  go.mod
│  │  go.sum
│  │
│  ├─client
│  │  ├─sample_client
│  │  │      client.go
│  │
│  ├─proto
│  │  │  helloworld.proto
│  │  │
│  │  └─grpc
│  │      └─service
│  │              helloworld.pb.go
│  │              helloworld_grpc.pb.go
│  │
│  └─server
│      ├─simple_server
│      │      server.go
│

4、编辑client.go

package main

import (
    "context"
    "flag"
    "google.golang.org/grpc"
    "log"
    pb "practice/proto/grpc/service"
    "time"
)

const (
    defaultName = "world"
)

var (
    addr = flag.String("addr", "localhost:50051", "the address to connect to")
    name = flag.String("name", defaultName, "Name to greet")
)

func main() {
    flag.Parse()

    // 建立连接
    conn, err := grpc.Dial(*addr, grpc.WithInsecure())
    if err != nil {
        log.Fatalf("did not connect: %v", err)
    }
    defer conn.Close()
    // 实例化client
    c := pb.NewGreeterClient(conn)

    // 调用rpc,等待同步响应
    ctx, cancel := context.WithTimeout(context.Background(), time.Second)
    defer cancel()
    r, err := c.SayHello(ctx, &pb.HelloRequest{Name: *name})
    if err != nil {
        log.Fatalf("could not greet: %v", err)
    }
    log.Printf("Greeting: %s", r.GetMessage())
}

5、server.go

package main

import (
    "context"
    "flag"
    "fmt"
    "google.golang.org/grpc"
    "log"
    "net"
    pb "practice/proto/grpc/service"
)

var (
    port = flag.Int("port", 50051, "The server port")
)

// server is used to implement helloworld.GreeterServer.
type server struct {
    pb.UnimplementedGreeterServer
}

func (s *server) SayHello(ctx context.Context, in *pb.HelloRequest) (*pb.HelloReply, error) {
    return &pb.HelloReply{Message: "Hello" + in.GetName()}, nil
}

func (s *server) SayHelloAgain(ctx context.Context, in *pb.HelloRequest) (*pb.HelloReply, error)  {
    return &pb.HelloReply{Message: "Hello Again " + in.GetName()}, nil
}

func main() {
    flag.Parse()
    // 监听端口
    lis, err := net.Listen("tcp", fmt.Sprintf("localhost:%d", *port))
    if err != nil {
        log.Fatalf("failed to listen: %v", err)
    }
    // 实例化server
    s := grpc.NewServer()
    pb.RegisterGreeterServer(s, &server{})
    log.Printf("server listening at %v", lis.Addr())
    if err := s.Serve(lis); err != nil {
        log.Fatalf("failed to serve: %v", err)
    }
}

6、运行

启动服务端

go run server/simple_server/server.go
2021/11/29 19:22:27 server listening at 127.0.0.1:50051

启动客户端

go run client/sample_client/client.go --name cui
2021/11/29 19:23:25 Greeting: Hellocui

Golang环境下Protobuf和gRPC安装配置及使用_第2张图片

你可能感兴趣的:(Golang,golang)