#013: Spring Boot Microservices 開発環境の準備

# 1. ツールのインストール

Java + Spring Boot を使ってMicroservice開発について調査を始める。
自分に必要なコマンドをインストール。
ついでに、あまり馴染みのないツールについては、少し調査。

```bash
brew tap spring-io/tap
brew install spring-boot
brew tap homebrew/cask-versions 
brew install --cask microsoft-openjdk
brew install --cask docker
brew install jq
brew install helm
brew install siege
```

## 1-1. Spring boot を追加

```bash
brew tap spring-io/tap
brew install spring-boot
```

### 1-1-1. brew tap

「tap」は、追加のbrewパッケージを提供するソースリポジトリ。

```bash
brew tap <リポジトリオーナー>/<リポジトリ名>
```

- リポジトリオーナー：githubの所有者名
- リポジトリ名：所有者が管理するリポジトリ名

「spring-io」というgithubアカウントの「tap」というリポジトリをbrewに追加し、brew経由でSpring関連パッケージを管理できるようにする。

### 1-1-2. brew tapの利点

- 公式に含まれないパッケージの利用
- 異なるバージョン（過去バージョンなど）のインストール

### 1-1-3. tapの削除

```bash
brew untap <リポジトリオーナー>/<リポジトリ名>
```

## 1-2. Microsoft Open JDKの追加

自分はこれを使っている。

どれでもいいけど、Azure勉強しているので、同じベンダーであるMicrosoftさんのJDKを使わせてもらう。

```bash
brew tap homebrew/cask-versions
brew install --cask microsoft-openjdk
```

### 1-2-1. homebrew/cask-versionsという追加パッケージ

homebrewの追加パッケージで、GUIアプリケーションや大きいパッケージ（pkg or dmg）をインストールするためのもの。

## 1-3. jsonデータの加工ツールの追加

「jq」はREST APIをデバッグするなどで重宝するので入れておいた方がよい。

```bash
brew install jq
```

### 1-3-1. jqの便利な使い方集

- jsonの整形

未整形のJSONを見やすい形式で出力する。

```bash
sato@[12:07:46]:~% echo '{"name":"John","age":30,"city":"New York"}' | jq
{
  "name": "John",
  "age": 30,
  "city": "New York"
}
```

- 特定キー値の抽出

`name`フィールドの値だけを取り出す。

```bash
sato@[12:10:43]:~% echo '{"name":"John","age":30,"city":"New York"}' | jq '.name'
"John"
```

- データのフィルター

配列データの中で条件を満たす要素だけを抽出。

```bash
sato@[12:11:58]:~% echo '[{"name":"John","age":30},{"name":"Jane","age":25}]' | jq '.[] | select(.age == 30)'
{
  "name": "John",
  "age": 30
}
```

- jsonの変更

たとえばjsonの`city`という項目の値を変更。

```bash
sato@[12:13:21]:~% echo '{"name":"John","age":30,"city":"New York"}' | jq '.city = "Los Angeles"'
{
  "name": "John",
  "age": 30,
  "city": "Los Angeles"
}

```

### 1-3-2. jqの利用シーン

- **APIのレスポンス解析**: REST APIからのJSONレスポンスを加工・フィルタリング
- **データ変換**: 大量のJSONデータから特定のキーを抽出したり、他のフォーマットに変換
- **ログやデバッグの補助**: JSON形式のログ解析時、特定フィールドのみを確認

## 1-4. K8Sパッケージマネージャーのインストール

helmについて簡単に整理。

### 1-4-1. Helmとは

- Kubernetes（K8s）でアプリケーションを管理するための **パッケージマネージャで、**Kubernetes上で複雑なアプリケーションのデプロイや管理を簡単にする
- アプリケーションを **チャート（Chart）** というパッケージ形式で管理、チャートには、Kubernetesのリソース（Pod、Service、Ingressなど）のテンプレートが含まれており、アプリケーションの構成情報や依存関係が記述されている
- アプリケーションのインストール、アップグレード、ロールバック、削除などの操作が一貫して行えるため、Kubernetes上でのアプリケーション管理が簡単になる

### 1-4-2. Helmの主な機能

- K8Sへのアプリケーションデプロイの簡素化
- バージョン管理（アップグレード、ロールバック）
- 再利用性（Helmチャートにより再利用可能パッケージ）

Helmの主要コマンド例

- helm install <release_name> <chart>
指定チャートを使ってK8Sクラスタにアプリケーションをデプロイ
- helm upgrade <release_name>
既存アプリケーションをアップグレード
- helm rollback <release_name>
アプリケーションを以前のバージョンにロールバック

### 1-4-3. helmを利用するメリット

- 複雑なアプリケーションデプロイの自動化
チャートを使うことで、複雑なアプリケーションの設定や依存関係を管理した状態でデプロイを自動化
- アップグレードとロールバックを管理
- マイクロサービスの管理
- helmチャートの再利用

## 1-5. コマンドラインベースのWEB負荷テストツールのインストール

多分使うのだろうから、これは入れておく。

```bash
brew install siege
```

### 1-5-1. Siegeとは

HTTPサーバーへの負荷テストを行うためのコマンドラインツール。ウェブアプリケーションのパフォーマンスを評価し、特定のURLに対して同時にリクエストを送信してサーバーの応答時間やパフォーマンスを測定できる。

### 1-5-2. Siegeの主な機能

- 同時リクエストをシミュレート
高負荷状態のサーバー動作を検証可能。
- シナリオ設定
URLリストやクエリパラメータを設定することで、様々なシナリオを定義可能
- 結果の分析
リクエストの成功率、応答時間、スループットの分析情報を確認できる

### 1-5-3. Siegeの主な利用例

同時アクセス数10、5回のリクエストを実行する。

```bash
siege -c 10 -r 5 http://example.com
```

### 1-5-4. MacOSへのインストール時に表示される留意事項

インストール時に以下のメッセージが表示される。

```bash
macOS has only 16K ports available that won't be released until socket
TIME_WAIT is passed. The default timeout for TIME_WAIT is 15 seconds.
Consider reducing in case of available port bottleneck.

You can check whether this is a problem with netstat:

    # sysctl net.inet.tcp.msl
    net.inet.tcp.msl: 15000

    # sudo sysctl -w net.inet.tcp.msl=1000
    net.inet.tcp.msl: 15000 -> 1000

Run siege.config to create the ~/.siegerc config file.
```

### 1-5-5. Siege利用時の制限

- 利用可能なポート数に制限がある

macOSでは、同時に利用できるポートが16kに限定される。

- TIME_WAITによるポート再利用までの待機時間ある

一度TCP接続に利用さたポートは、TCP切断後、「TIME-WAIT」(デフォルトで15秒)が経過するまで解放されず再利用できない

このため、siegeで大量の同時アクセスを行うと、ポートが枯渇する可能性がある。

### 1-5-6. Siege利用制限への対応方法

- TCP MSL (Maximum Segment Lifetime)の変更

TIME_WAITはMSLに設定されているので、これを変更することで制限を緩和できる。

```bash
# 現在のMSLを確認
sysctl net.inet.tcp.msl

# MSLを変更
sudo sysctl -w net.inet.tcp.msl=1000
```

## 1-6. Dockerデスクトップのインストール

DockerデスクトップはGUIも含めて大きなパッケージ。caskオプションでバイナリーを直接インストールする。

```bash
brew install --cask docker
```
## 1-7. k8sのコマンドラインツール「kubernetes-cli」（kubectl）のインストール

k8sクラスタを管理するためのコマンドラインツール。

```bash
brew install kubernetes-cli
```

### 1-7-1. kubectlの主な機能

- リソース管理
k8sクラスタ上のポッド、サービス、デプロイメントなどのリソースの作成、削除、更新、確認を行う。

```bash
kubectl get pods　# ポッド情報の取得
kubectl create -f deployment.yaml # デプロイメントの作成
kubectl delete pod my-pod # ポッドの削除
```

- クラスタ情報の取得
クラスタの状態、各リソースの状態を確認。

```bash
kubectl cluster-info # クラスタ情報の取得
kubectl get nodes # ノード情報の取得
```

- デバッグ・監視
ログ確認、リソースのイベント監視、ポッドへの接続

```bash
kubectl logs <pod-name> # ポッドのログ確認
kubectl exec -it <pod-name> -- /bin/bash # ポッドに接続してbashを実行
```

## 1-8. マイクロサービスのサービスメッシュレイヤーを実現するistioのコマンドラインツール「istioctl」をインストール

```bash
brew install istioctl
```

### 1-8-1. istioとは

マイクロサービス間の通信を効率的かつ安全に行うための技術として「サービスメッシュ」レイヤーがある。istioはサービスメッシュレイヤーを担う代表的なツール。

### 1-8-2. サービスメッシュレイヤーの主な機能

- サービス間トラフィック管理
ルーティングや負荷分散、障害時のリトライなどを管理する。１つのサービスをロールアウトして新バージョンに徐々に移行するカナリアリリース、１つのサービスの旧バージョンと新バージョンに対してトラフィックを分散するブルー・グリーンデプロイが可能。
- サービス間通信セキュリティ
サービス間の通信をTLSを使用して通信したり、サービス間で認証・認可の機能を提供する。
- 各サービスの観測
サービス間の通信状況、パフォーマンスメトリクス（遅延、スループット、エラー率など）を監視。
- フォールトトレランス
１つのサービスが一時的に遅延している場合にサーキットブレイカーを使用してそのサービスへのリクエストを一時的に停止し、回復後に再開するなどの制御が可能。

### 1-8-3. istioの構成

２つのプレーンで構成される。

- データプレーン
各サービスに配置するサイドカー（Envoyプロキシ）を通してサービス間のすべての通信を管理する。istioはサイドカーをすべてのサービスに自動的に追加、各サービス間の通信はすべてこのサイドカーを通して行われる。
- コントロールプレーン
サービスメッシュレイヤー全体の設定やポリシー（トラフィックルールやセキュリティポリシー）を一元管理する。

## 1-9. ローカル環境で実行できる小さなk8s環境「minikube」をインストール

```bash
brew install minikube
```

### 1-9-1. minikubeとは

ローカル環境でk8s向けアプリのクラスタのセットアップやテストが実行できる。通常K8sは複数のノード（クラスタ）で構成されるが、Minikubeにより１台のコンテナで軽量なk8sのシングルノードのクラスタを実行できる。

Docker や VirtualBoxが必要だが、今回はDockerを利用。

### 1-9-2. minikubeの主な機能

- ローカルk8s環境の提供
DockerやVirtualBoxを使ってローカルPC上で簡易なk8sアプリの開発、デバッグ、テストが実行可能。
- k8s用アプリのローカルテスト
クラウド上の環境にデプロイする前に、minikubeを使ってk8s対応アプリの動作確認が可能。
- k8sと同等の管理機能
k8sと同じようにkubectlでアプリケーションのデプロイやクラスタ管理が可能。