Go微服务四 Go -gRPC

作者: 太阳上的雨天 分类: 微服务 发布时间: 2022-02-27 11:29

环境

​ 环境:

  • 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代替

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注