Go微服务四 Go -gRPC

551 次浏览次阅读
没有评论

环境

​ 环境:

  • mac
  • go1.17.7

安装 Protobuf

  • [protoc github 下载地址]

    下载下来之后解压,配置.zshrc

    #protoc
    export PATH=/Users/cc/protoc-3.9.0/bin:$PATH
    
    source ~/.zshrc
  • 安装 golang 的 proto 工具包

    go get -u google.golang.org/protobuf/proto
  • 安装 goalng 的 proto 编译支持 会在 $GOPATH/bin 目录下创建 protocole-gen-go 文件

    go get -u google.golang.org/protobuf/protoc-gen-go
    OR
    go install google.golang.org/protobuf/cmd/protoc-gen-go@latest
    go install google.golang.org/grpc/cmd/protoc-gen-go-grpc@latest
    

安装 gRPC

​ 创建 grpcpro 项目,在项目目录下执行

$ go mod init grpcpro

安装 gRPC 包

go get -u google.golang.org/grpc

编写 proto 文件

创建项目 grpcserver

在项目目录下新建 pbfiles 文件夹, 在 pbfiles 文件夹下创建 Prod.proto 文件

syntax = "proto3";

package services;

option go_package = "../services";

message ProdRequest {int32 prod_id = 1;}

message ProdResponse {int32 prod_stock = 1;}

cd 到 pbfiles 目录下, 执行 protoc –go_out=../services/ Prod.proto (services 是生成的.pb.go 存放位置, 如果没有 services 目录自行手动先创建在执行)

创建服务端

修改 pbfiles/Prod.proto 文件, 新增以下代码

service ProdService {rpc GetProdStock (ProdRequest) returns (ProdResponse);
}

执行 protoc –go_out=plugins=grpc:../services Prod.proto 会重新生成并覆盖原来的 Prod.pb.go 文件
services/ProdService.go

package services

import ("context")

type ProdService struct {
}

func (this *ProdService) GetProdStock(ctx context.Context, request *ProdRequest) (*ProdResponse, error) {return &ProdResponse{ProdStock: 20}, nil
}

编写 server.go 服务端代码

grpcserver/server.go

package main

import (
    "net"

    "google.golang.org/grpc"
    "gorpc.jtthink.co/services"
)

func main() {rpcServer := grpc.NewServer()

    services.RegisterProdServiceServer(rpcServer, new(services.ProdService))

    listen, _ := net.Listen("tcp", ":8082")
    rpcServer.Serve(listen)
}

执行 go run server.go, 将服务端跑起来

创建客户端 (服务端既可以是客户端,客户端也可以是服务端)

新建一个项目 grpcclient

在项目目录新建 services,将服务端的.pb.go 文件复制进来

然后安装 gRPC 包

go get -u google.golang.org/grpc

编写客户端实现

grpcclient/client.go

package main

import (
    "context"
    "fmt"
    "log"

    "grpccli/services"

    "google.golang.org/grpc"
)

func main() {conn, err := grpc.Dial(":8082", grpc.WithInsecure())
    if err != nil {log.Fatal(err)
    }
    defer conn.Close()

    client := services.NewProdServiceClient(conn)
    prodRes, err := client.GetProdStock(context.Background(), &services.ProdRequest{ProdId: 10,})
    if err != nil {log.Fatal(err)
    }

    fmt.Println(prodRes.ProdStock)
}

执行 go run client.go,即可看到以下输出

➜  grpccli go run client.go
20

补更
提示:
执行 此命令 protoc –go_out=../services/ Prod.proto 报错

--go_out: protoc-gen-go: plugins are not supported; use 'protoc --go-grpc_out=...' to generate gRPC

模块 github.com/golang/protobuf 由 google.golang.org/protobuf" 取代
当前版本编译时,之前的方法 protoc –go_out=plugins=grpc:. *.proto 不再使用,转而用 protoc –go_out=. –go-grpc_out=. ./Prod.proto 代替

正文完
 0
评论(没有评论)