创建一个可以使用Go+gRPC进行开发的Dockerfile

总结

我将解释如何搭建适用于使用 Go + gRPC 进行开发的环境。

我们将使用Docker进行环境配置。

不会在这篇文章中详细解释gRPC。

希望看书的读者

    • Dockerの基礎知識をお持ちの方

 

    • Goの基礎知識をお持ちの方

 

    Go + gRPCでの開発に興味がある方

我已经将示例代码上传到了GitHub。

我为您准备了以下的示例代码。

以下是Dockerfile的内容。

以后我会解释执行过程,直到完成这个Dockerfile为止,请看这里能理解的人就不需要继续阅读这篇文章了。

创建Dockerfile的步骤

使用Alpine 3.11版本的GoLang镜像作为基础。

    • ホストOS(MacOS Catalina 10.15.2)

 

    Dockerの実行環境(Docker for Mac 2.1.0.5)

protobuf的安装

在gRPC中,首先使用接口定义语言(IDL)创建API定义文件。

我們將提供使用 gRPC 配合 Protocol Buffers 這個已成為事實標準的工具在此處使用的選項。

从https://github.com/protocolbuffers/protobuf/releases下载最新版本并进行安装。

更新package和安装相关的package

为了更新”package”并进行编译,需要安装所需的”package”。

apk update
apk add git curl build-base autoconf automake libtool

将tar.gz下载到/tmp目录下

curl -L -o /tmp/protobuf.tar.gz https://github.com/protocolbuffers/protobuf/releases/download/v3.11.2/protobuf-cpp-3.11.2.tar.gz

进行构建和安装

在命令行中输入 “cd /tmp” 命令,将当前工作目录切换到 “/tmp” 目录下。

运行 “tar xvzf protobuf.tar.gz” 命令来解压 .tar.gz 文件。

然后,通过输入命令“cd protobuf-3.11.2”进行移动。

按照以下命令的顺序执行。

./autogen.sh
./configure
make -j 3
make check
make install

補充一下,make -j是一個用於加速編譯的選項,它通過並行處理來實現。
make -j 3 表示進行3個並行處理。
我認為基於您的環境,調整到「CPU數量×2」比較適合。

顺便提一下,构建和安装需要相当长的时间。

如果在命令行输入”protoc –version”后出现以下信息,则表示成功。

libprotoc 3.11.2

安装适用于Go的protoc插件。

为了在Go中使用protoc,需要安装插件。

go get -u github.com/golang/protobuf/protoc-gen-go

通过使用 protoc 工具生成文档(可选)。

这是可选的,但如果您安装了它,就可以从.proto生成HTML格式等文档,这样很方便。

go get -u github.com/pseudomuto/protoc-gen-doc/cmd/protoc-gen-doc

Protobuf的运行测试

我在这里准备了一个用于功能确认的 Git 仓库。

在项目根目录下的pb/文件夹中创建dog.proto文件。

syntax = "proto3";

service Dog {
    rpc FindCuteDog (FindCuteDogMessage) returns (FindCuteDogResponse) {}
}

message FindCuteDogMessage {
    string DogId = 1;
}

message FindCuteDogResponse {
    string name = 1;
    string kind = 2;
}

在项目根目录(我示范的项目为 /go/app)下执行下列命令。

protoc --go_out=plugins=grpc:. pb/dog.proto

我想你已经创建了一个名为pb/dog.pb.go的文件。

这是一个类似以下内容的文件(只包含部分内容)。

// Code generated by protoc-gen-go. DO NOT EDIT.
// source: pb/dog.proto

package dog

import (
    context "context"
    fmt "fmt"
    proto "github.com/golang/protobuf/proto"
    grpc "google.golang.org/grpc"
    codes "google.golang.org/grpc/codes"
    status "google.golang.org/grpc/status"
    math "math"
)

// Reference imports to suppress errors if they are not otherwise used.
var _ = proto.Marshal
var _ = fmt.Errorf
var _ = math.Inf

// This is a compile-time assertion to ensure that this generated file
// is compatible with the proto package it is being compiled against.
// A compilation error at this line likely means your copy of the
// proto package needs to be updated.
const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package

type FindCuteDogMessage struct {
    DogId                string   `protobuf:"bytes,1,opt,name=DogId,proto3" json:"DogId,omitempty"`
    XXX_NoUnkeyedLiteral struct{} `json:"-"`
    XXX_unrecognized     []byte   `json:"-"`
    XXX_sizecache        int32    `json:"-"`
}

func (m *FindCuteDogMessage) Reset()         { *m = FindCuteDogMessage{} }
func (m *FindCuteDogMessage) String() string { return proto.CompactTextString(m) }
func (*FindCuteDogMessage) ProtoMessage()    {}
func (*FindCuteDogMessage) Descriptor() ([]byte, []int) {
    return fileDescriptor_993586c250cd4a03, []int{0}
}

// 以下略

通过以上步骤,已经建立了可以使用Go + gRPC进行开发的环境。

最终的Dockerfile已在此附上。(内容与此链接相同)

FROM golang:1.13-alpine3.11 as build

WORKDIR /tmp

ENV PROTOBUF_VERSION 3.11.2
ENV PROTOBUF_URL https://github.com/protocolbuffers/protobuf/releases/download/v$PROTOBUF_VERSION/protobuf-cpp-$PROTOBUF_VERSION.tar.gz

RUN set -eux && \
  apk update && \
  apk add --no-cache git curl build-base autoconf automake libtool && \
  curl -L -o /tmp/protobuf.tar.gz $PROTOBUF_URL && \
  tar xvzf protobuf.tar.gz

WORKDIR /tmp/protobuf-$PROTOBUF_VERSION

RUN set -eux && \
  ./autogen.sh && \
  ./configure && \
  make -j 3 && \
  make install && \
  go get -u github.com/golang/protobuf/protoc-gen-go && \
  go get -u github.com/pseudomuto/protoc-gen-doc/cmd/protoc-gen-doc

WORKDIR /go/app

COPY . .

RUN set -eux && \
  go build -o golang-grpc-server && \
  go get gopkg.in/urfave/cli.v2@master && \
  go get github.com/oxequa/realize && \
  go get -u github.com/go-delve/delve/cmd/dlv && \
  go build -o /go/bin/dlv github.com/go-delve/delve/cmd/dlv

FROM alpine:3.11

WORKDIR /app

COPY --from=build /go/app/golang-grpc-server .

RUN set -x && \
  addgroup go && \
  adduser -D -G go go && \
  chown -R go:go /app/golang-grpc-server

CMD ["./golang-grpc-server"]

我之前写过一篇关于在Docker上调试Go编写的Web应用程序的文章,这篇文章中介绍了安装调试器等工具的步骤也是通过这个Dockerfile来进行的。

使用protoc生成文档

我会以这个项目为例来进行说明。

要生成HTML格式的文档,需要运行以下命令。

protoc --doc_out=html,index.html:./docs pb/*.proto

结果是会产生docs/index.html文件。

外貌看起来是这样的。

ProtocolDocumentation.png

使用grpc_cli来确认gRPC服务器的运行情况

使用gRPC命令行工具可以方便地进行功能验证,而不像使用curl等工具那样不够简便。

在Mac上进行安装。

brew install gflags

brew tap grpc/grpc

brew install grpc

如果您执行了grpc_cli并显示了/usr/local/bin/grpc_cli等内容,则表示安装成功。

grpc_cli的简单用法

通过以下方式获取服务的内容。

grpc_cli ls localhost:9998

下面是gRPC服务器的内容展示。

Cat
grpc.reflection.v1alpha.ServerReflection

通过指定方法,您可以确认接口如下。

grpc_cli ls localhost:9998 Cat.FindCuteCat -l

为了获取这些gRPC服务器的信息,需要在gRPC服务器端执行 reflection.Register。

请查看此处的代码以获取更多详细信息。

调用gRPC方法时,实际的执行步骤如下所示。

grpc_cli call localhost:9998 Cat.FindCuteCat 'catId: "moko"'

結束

以下是Go + gRPC的开发环境构建方法。

最近,因为微服务开发的普及,我觉得使用Go + gRPC的组合方案的采用案例越来越多。

如果这篇文章能对您有所帮助,我将感到非常幸福。

為了撰寫這篇文章,我參考了以下的文章。

    • Goで始めるgRPC入門

 

    • gRPC ドキュメント

 

    Protocol Buffers 公式ドキュメント
广告
将在 10 秒后关闭
bannerAds