Golang + Nuxt.js + Kubernetes でWebサービスを作る - その①
Golang でAPIサーバを作る
Golang + Nuxt.js + Kubernetes でWebサービスを作るシリーズ第一弾。 まずはGolangでシンプルなAPIサーバを作成してみる。
今回はGETリクエストで渡されたドメインのwhois情報を取得するAPIサーバを書く。
APIサーバのソースコードはGitHubにアップロード済み https://github.com/famasoon/webapp-api
まずは適当なディレクトリを作る。
mkdir webapp-api cd webapp-api
次にGoの依存関係を初期化。
GO111MODULE=on go mod init
今回はGo言語のEchoというモジュールでHTTPリクエストを、gowhoisでwhois関連の処理を行う。
必要なモジュールをgo get
で取得。
go get github.com/labstack/echo/... go get -u github.com/famasoon/gowhois
下記のmain.go
でAPIサーバを書く。
package main import ( "net/http" "github.com/famasoon/gowhois/whois" "github.com/labstack/echo" ) type whoisInfo struct { Domain string `json:"domain"` WhoisResult string `json:"result"` } func main() { e := echo.New() e.GET("/", func(c echo.Context) error { return c.String(http.StatusOK, "OK") }) e.GET("/api/v1/whois/:domain", getWhoisResult) e.Logger.Fatal(e.Start(":8080")) } func getWhoisResult(c echo.Context) error { domain := c.Param("domain") result, err := whois.Whois(domain) if err != nil { return err } return c.JSON(http.StatusOK, whoisInfo{ Domain: domain, WhoisResult: result, }) }
APIサーバは本番環境と開発環境を一つのDockerfileで書く。 下記記事を参考にマルチステージ対応のDockerfileを書いた https://qiita.com/po3rin/items/8b57e6c22f2b34751333
また、開発環境ではファイル更新の度にビルドし直すのが面倒なため、ホットリロードな環境を用意すべくfresh
というモジュールを利用している。
fresh
については下記記事を参考
https://qiita.com/po3rin/items/9acd41ef428436335c97
Dockerfile
FROM golang:1.12 as builder WORKDIR /go/api COPY . . ENV GO111MODULE=on RUN CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo . FROM alpine:latest as prod EXPOSE 8080 WORKDIR /api COPY --from=builder /go/api/ . RUN pwd CMD ["./webapp-api"] FROM golang:1.12 as dev EXPOSE 8080 WORKDIR /go/src/whoisapp COPY . . ENV GO111MODULE=on RUN go get github.com/pilu/fresh CMD ["fresh"]
docker-compose
version: '3' services: app: build: . volumes: - ./:/go/src/whoisapp ports: - "8080:8080"
開発環境と本番環境をビルドするためのMakefile
all: dev prod dev: docker build -t api-dev --target dev . prod: docker build -t api-prod --target prod .
docker-composeの設定を書いておいたので実行。
docker-compose up
とりあえず/api/v1/whois/:domain
にアクセスすると当該ドメインのwhois情報を取得するようになっている(使用しているライブラリの性質上、いくつかのドメインのwhois情報を取得できないが、それは一旦無視する)
http://127.0.0.1:8080/api/v1/whois/example.com へアクセス。
example.com
のwhois情報が取得できていればAPIサーバの完成。
次はこのDockerイメージをデプロイするためのKubernetesクラスタを作成する。