久しぶりの投稿となりました。
しばらくSpring界隈から離れていましたが、ここ数年でいろいろなプロダクトの変遷があったようなので、
今回からSpring Cloudファミリーのプロダクトとdockerを使ったシンプルなマイクロサービス構成を紹介していきます。
概要
このシリーズでは図のような構成でサービスを立て、そこから少しずつテーマを設けて掘り下げていきたいと思います。
- REST API Server
- DBにアクセスしてJSONベースのやり取りをするREST APIを提供する。
- 同じAPIを負荷分散のために複数インスタンス用意する。
- Service Discovery
- APIのインスタンス情報(ホスト、ポート番号など)を保持し、クライアントにリストを提供する。
- 冗長構成をとる。
- API Gateway
- APIに対してリバースプロキシとなるサービス。
- Service DiscoveryからSerivce Listを取得し、アルゴリズムに応じて負荷分散をしてAPIへアクセスする。
- 認証関連、ルーティング(リクエストパスとサービスの関係解決)、フィルタリング、アクセス流量制御など、APIに持ち込みたくない共通の関心事を解決するモノ。
環境
以下が動く環境を前提とします。
- docker & docker-compose
- JDK11
- なんらかのエディタ、IDE
WindowsだとDocker Desktop for Windows & Ubuntu 20.04 on WSL2とか
MacだとDocker desktop for Mac とかで動くはずです。
ここではセットアップの手順は省きますので、他の記事を参考にセットアップしてください。
<補足>
私はDocker Desktop for Windows とWLS2の連携がいまいち調子が悪く、
以下の記事を参考に「Docker Desktop for Windows」をインストールせずにWSL2&Ubuntu2.0の環境を使っています。
Install Docker on Ubuntu 18.04 on WSL2
docker-composeを利用してDBと管理Webツールをセットアップする
まずはAPIが使用するDB(PostgreSQL)とDB用の管理Webをセットアップします。
便利な世の中なので、docker-composeを使って、さくっとセットアップできちゃいます。
下記のフォルダ構成を作成し、docker-compose.yml と DB初期データ作成のSQLを配置します。
spring-msa
├── docker-compose.yml
└── db
└── init
├── 01_create_table.sql
└── 02_insert_data.sql
version: '3'
volumes:
pgdata:
networks:
default:
services:
db:
image: postgres
container_name: db
ports:
- 5432:5432
environment:
- POSTGRES_DB=${DB_NAME:-db}
- POSTGRES_USER=${DB_USER:-postgres}
- POSTGRES_PASSWORD=${DB_PASSWORD:-postgres}
volumes:
- pgdata:/var/lib/postgresql/data
- ./db/init:/docker-entrypoint-initdb.d
adminer:
image: michalhosna/adminer
container_name: adminer
ports:
- 8000:8080
restart: always
depends_on:
- db
environment:
# specify service name of PostgreSQL to ADMINER_SERVER
- ADMINER_SERVER=db
- ADMINER_DRIVER=pgsql
- ADMINER_DB=${DB_NAME:-db}
- ADMINER_USERNAME=${DB_USER:-postgres}
- ADMINER_PASSWORD=${DB_PASSWORD:-postgres}
- ADMINER_NAME=ADMINER for PostgreSQL DB
## uncommnet to enable auto-login
# - ADMINER_AUTOLOGIN=1
postgresは公式イメージを使っています。
dockerのVolume機能を使ってローカルのディレクトリ(今回はdb/init)を /docker-entrypoint-initdb.d
ディレクトリにbindし、その中にprefixとして連番のついたSQLファイルを配置しておくと、DBの初回起動時に自動実行してくれます。(PostgreSQLの公式Dockerイメージの機能)
便利ですねー。
adminerはDBメンテツールでWeb上でPostgreSQLのデータを参照、編集ができる便利なやつです。
DBへの接続情報を自動設定(初期表示)してくれるようにカスタマイズされたイメージがありましたので、使わせてもらいます。
※DB名やDBユーザ、パスワードはホスト側の環境変数で上書きできるようにしていますが、あまり気にしなくて良いでしょう
さて、DBをセットアップするためのSQLを用意しましょう。
ここではaccount
テーブルをcreateして3行の初期データをinsertします。
CREATE TABLE account (
id bigserial,
uname VARCHAR(30),
token VARCHAR(100),
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
INSERT INTO account (uname, token) VALUES ('sato', 'AAAA');
INSERT INTO account (uname, token) VALUES ('yamada', 'BBBB');
INSERT INTO account (uname, token) VALUES ('suzuki', 'CCCC');
さてここまできたらdocker-compose.ymlのあるディレクトリで以下を実行し、PostgreSQLとAdminerを起動します。
(サービスを指定して起動する場合)
$ docker-compose up -d db adminer
(全サービスを一気に起動する場合)
$ docker-compose up -d
では、Webブラウザで http://localhost:8000 にアクセスしてみましょう。
Adminerのログイン画面が出るはずです。
ログインして、accout
テーブルとデータが3行入っているのが確認できればOKです。
確認が終わったら一応、コンテナを止めて破棄しておきましょう。
(個別にサービスを指定してコンテナを停止する場合)
$ docker-compose stop db adminer
(起動中のすべてのコンテナを止めて、ネットワークを含めて破棄する場合)
$ docker-compose down
作ったDBの内容も一緒に破棄する場合は、Volumeも破棄する「-v」を付けます。
$ docker-compose down -v
次回予告
今回はDBのセットアップだけでしたが、次回はDBをCRUD操作するREST APIをSpring Bootでさらっと作りたいと思います。
ではでは。