目標
echoのインストールから初期設定からサーバーの起動までを行う
DBからの取得は次回に実施する
echo
GoのWebフレークワークの1つ
WebフレームワークとしてはGinが有名ではあるが、近年は注目を集めている様子がある。
スター数などは全然Ginのほうが圧倒的な状況でもある。
採用理由は、ベースの使い方は同じなのでトレンドっぽさで選択した。
参考: https://go.libhunt.com/compare-gin-vs-echo
echoを導入する
利用環境についてはこちら
https://qiita.com/dsricekun/items/33968201abdc2992671d
STEP1 echoモジュールを取得
コンテナ内でモジュールを取得する
go get github.com/labstack/echo/v4
STEP2 サーバー起動設定
サーバー起動したときにポートに1323番を使用するのでdocker-compose.ymlを見直す
version: '3'
services:
go_echo:
container_name: go_echo
build:
context: ./echo/
volumes:
- ./echo:/go/src/app
tty: true
environment:
- TZ=Asia/Tokyo
ports:
- 1323:1323
go_echo_db:
image: mysql:5.7
container_name: mysql_host
environment:
MYSQL_ROOT_PASSWORD: root
MYSQL_DATABASE: echo
MYSQL_USER: docker
MYSQL_PASSWORD: docker
TZ: 'Asia/Tokyo'
command: mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
volumes:
- ./database/data:/var/lib/mysql
ports:
- 3306:3306
今までの構成に新しくmain.goを追加する
tree.nathanfriend.io
What is this?
database
echo
main.go(new)
go.mod
Dockerfile
docker-compose.yml
database
echo
main.go(new)
go.mod
Dockerfile
docker-compose.yml
.
├── database
├── echo/
│ ├── main.go(new)
│ ├── go.mod
│ └── Dockerfile
└── docker-compose.yml
main.goはechoのチュートリアルに従って次の実装をする
package main
import (
"github.com/labstack/echo/v4"
"net/http"
)
func main() {
server := echo.New()
server.GET("/", func(ctx echo.Context) error {
return ctx.String(http.StatusOK, "Hello, World")
})
server.Logger.Fatal(server.Start(":1323"))
}
コンテナ内でサーバー起動を行う
コマンド
go run main.go
実行結果はこちら
/go/src/app # go run main.go
____ __
/ __/___/ / ___
/ _// __/ _ \/ _ \
/___/\__/_//_/\___/ v4.10.2
High performance, minimalist Go web framework
https://echo.labstack.com
____________________________________O/_______
O\
⇨ http server started on [::]:1323
出力が確認できたらブラウザから「http://localhost:1323 」にアクセスする
正常に設定できていたら
の出力確認ができる。
出力確認ができたらechoの導入は成功になる
echoを触っていくための構成を少し整理
本格的な構成は仕様を整理してからになるが、さすがにあまりイケていないので構成を整理する
ここからはechoファルダ内のみの構成を記載する。
全体図が気になる方はgithubのアクセスURLを記載するのでそちらを見てください。
URL: https://github.com/dsrice/go_echo/tree/part2
.
├── controllers/
│ └── hello.go
├── infra/
│ └── server.go
└── main.go
各役割を説明すると
- controllersディレクトリ
- EPの実処理にあたるコントローラー置き場
- hello.go
- 暫定で用意するコントローラー controllersパッケージになるのでファイル名にはcontrollerはつけない
- infraディレクトリ
- 環境関連ファイル置き場
- server.go
- ルーティングなどサーバーに関する処理をまとめるファイル
- main.go
- サーバーの起動といった起動処理をまとめるファイル
hello.go
package controllers
import (
"github.com/labstack/echo/v4"
"net/http"
)
type HelloController struct{}
func NewHelloController() *HelloController {
return &HelloController{}
}
func (controller *HelloController) GetMessage(ctx echo.Context) error {
return ctx.String(http.StatusOK, "Hallow World!")
}
server.go
package infra
import (
"app/controllers"
"github.com/labstack/echo/v4"
)
type Server struct {
Echo *echo.Echo
}
func NewServer() *Server {
return &Server{
Echo: echo.New(),
}
}
func (server *Server) Start() {
server.Echo.GET("/", controllers.NewHelloController().GetMessage)
server.Echo.Start(":1323")
}
main.go
package main
import "app/infra"
func main() {
server := infra.NewServer()
server.Start()
}
終わりに
今回はechoを導入してチュートリアルに沿った簡単な実装を対応した。
echoが使えるようになったので次回から公式ドキュメントを参考に設定を追加していこうと考えている
参考文献