创建一个可以使用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文件。
外貌看起来是这样的。
使用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 公式ドキュメント