Golang + Nuxt.js + Kubernetes でWebサービスを作る - その①

GolangAPIサーバを作る

Golang + Nuxt.js + KubernetesWebサービスを作るシリーズ第一弾。 まずは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.goAPIサーバを書く。

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.comwhois情報が取得できていればAPIサーバの完成。 次はこのDockerイメージをデプロイするためのKubernetesクラスタを作成する。