SoftwareDesign マイクロサービスアーキテクチャをまとめてみた

# マイクロサービスの基本

## マイクロサービスアーキテクチャとは？

- プログラムをバラバラにする
    - 独立して動く多数の小さなサービス群に分割して、緩やかに連動させる
    - それぞれ独立して変化していくことを重視
- 分散協調技術の低コスト化に伴い広まる
    - 実行環境の仮想化（コンテナ）
    - 実行環境間の通信（HTTP通信、非同期処理）
    - クラウドサービス
    - 対応したフレームワーク、ライブラリ

## どう設計する？

- 直列｜並列　＆　同期｜非同期　を組み合わせる

※非同期がおすすめ（疎結合にできる）
## どういう方針で分割する？

- 独立性と境界
    - 意味的に独立し、サービスの境界が単純明解になる場所を探す
    - データベースも分割（疎結合）
        - 原本管理責任の明確化と目的別の複製
        - データの一貫性や整合性は最重要ではない（ビジネス活動の文脈で、サービス側の要求を正しく理解してデータ管理の方式を設計することが大切）
            - 取引系（お金が発生する系）は整合性が大事
            - 照会系はあまり重要じゃないかも
## どのようなテスト？

- E2Eは重要ではない
    - エンドツーエンドでないと処理の正しさがわからない状態はダメ。マイクロサービスアーキテクチャの「変更の低コスト化」ができていない。
    - 分割と連携の設計を改善する余地あり
- インターフェースのテストが大事
    - サービス間のインターフェース（サービス間の利用の約束事）の部分を明確化し、テストを自動化することが大事（CDC）

# サービスの作り方

## サービスの単位

1. 独立性（隠蔽性と交換可能性）
2. 技術的な選択肢の拡大（低コスト高パフォーマンス、競争優位性）
3. 開発効率

※考えることを減らし、適材適所で考えられ、効率よく開発できる

## 具体例

1. ドメインの境界で分ける
ドメインとは、問題領域（境界づけられたコンテキスト）
2. 再利用性の高いもので分ける
他サービスから共通して利用される再利用性が高いコンポーネントは、独立したドメインと位置づけられる
3. プログラミング言語や採用技術で分ける
サービスを技術領域ごとに別々のサービスに分割できれば、それぞれに適した技術を採用できる
4. 組織構造に合わせる
一つのサービスに対して複数のチームが手を入れると開発効率が下がる
なるべく、チームが扱っている範囲で分割したり、外部要因を受けやすい箇所をマイクロサービスとして切り分けることが大切

# マイクロサービスの管理

- サービスが複雑になるとサービス間の通信管理が大変になる

## サービスメッシュ

サービスメッシュとは、個々のサービス内通信に制御周りの機能を実装するのではなく、通信制御に関する専用のレイヤを追加することでサービス間接続の管理を実現させようという考え方です

## Istioとは

サービスメッシュを実現するためのツールの一つです。Istioは、サービス間の通信を管理し、トラフィックの制御、セキュリティポリシーの適用、モニタリング、ログ収集などを提供します

Istioの大きな特徴は、KubernetesのPodごとにEnvoy(Proxy)をサイドカーとしてデプロイすることでPod間通信を全てEnvoy経由で制御し、管理できるところにあります

### サイドカーとは

サイドカーは、各マイクロサービスの隣に配置される独立したコンポーネントです。サイドカーは、そのサービスの通信や機能を補完・強化する役割を果たします。サービスごとに異なるネットワーキングやセキュリティ要件を満たすため、サイドカーが個々のサービスに対して必要な機能を提供します

KubernetesのPod内で主たるコンテナを補助する役割を持つ別のコンテナを同居させる構成パターンを指します

### Envoyとは

Envoyは、サイドカーの一種であり、Istioの中で主に使用されるプロキシ（中継装置）です。サービス間通信の受け渡しやルーティングを担当し、トラフィックの監視や制御も行います

各サービスが他のサービスを直接参照することなくEnvoyプロキシを経由して通信するため、コンテナの入れ替わりで動的に変わるIPアドレスなどの接続先情報をサービス自身が意識しなくても良くなり、通信先が変わってもアプリケーション側のコードを変更せず、Envoy側で接続先情報を更新するだけで済む

### データプレーンとは

データプレーンは、実際にアプリケーションの通信が行われる場所です。

これは、マイクロサービス間のリクエストやレスポンスがやり取りされる部分です。

Istioでは、データプレーンの中でサービス間の通信を処理し、ルーティング、トラフィックの制御、セキュリティなどを担当する「プロキシ」と呼ばれるコンポーネント（通常Envoyというプロキシが使われます）が動作します。

プロキシは、通信の中継役として働き、リクエストやレスポンスを監視し、必要な処理を行います

### コントロールプレーンとは

コントロールプレーンは、データプレーンの振る舞いを管理し、設定や制御を行う場所です。

これは、サービスメッシュ全体を制御するための中央の仕組みです。

Istioのコントロールプレーンには、トラフィックのルーティングやセキュリティポリシーの設定、モニタリングの設定などを行うコンポーネントが含まれています。

コントロールプレーンは、アプリケーションの管理者がポリシーや設定を変更して、データプレーンの動作を調整するための手段となります

## Istioの主要機能

### トラフィックマネジメント

トラフィックマネジメントは、サービスメッシュ内の異なるサービス間でどのように通信が行われるかを制御する機能

### セキュリティ

セキュリティは、サービス間通信やアプリケーションのセキュリティを強化するための機能。Istioでは、トラフィックの暗号化、認証、アクセス制御などのセキュリティ機能を提供

### 可観測性

可観測性は、サービスの挙動やトラフィックの状態をモニタリングし、トラブルシューティングや性能の最適化を行うための機能。Istioは、トラフィックの監視、ログ収集、メトリクスの収集と表示などをサポート

# OpenShiftとは

マイクロサービスアーキテクチャは、アプリケーションを小さな独立した部品（マイクロサービス）に分割し、それらを連携させる方法です。

OpenShiftは、マイクロサービスアーキテクチャを効果的に実現するためのプラットフォームです。

OpenShiftはコンテナオーケストレーションの力を活かして、マイクロサービスを独立したコンテナとしてデプロイし、管理することができます。各マイクロサービスは、自身のコンテナ内で実行され、それぞれの状態やリソースを独立して管理します。これにより、アプリケーションの異なる部分を独立して開発、デプロイ、スケーリングできるようになります。

また、OpenShiftはプロジェクトとアプリケーションの隔離を提供し、異なるチームが異なるマイクロサービスを開発・運用する際に役立ちます。さらに、アプリケーションのビルドとデプロイメントを自動化するCI/CDパイプラインを構築し、アジャイルな開発サイクルをサポートします。

総括すると、OpenShiftはマイクロサービスアーキテクチャをサポートし、アプリケーションをコンテナとして分割・デプロイし、コンテナオーケストレーションを通じて効率的に運用するためのプラットフォームと言えます。

## OpenShiftの概要

OpenShiftは、コンテナベースのアプリケーションの開発、デプロイメント、管理を支援するプラットフォームです。

**1. コンテナとコンテナオーケストレーション**
コンテナは、アプリケーションとその依存関係を包括する軽量で独立した実行単位です。OpenShiftは、Dockerなどのコンテナランタイムを使用してアプリケーションをコンテナ化し、コンテナ間の管理を自動化します。これにより、アプリケーションの一貫した環境での実行やスケーラビリティが実現されます。

**2. コンテナオーケストレーション**
OpenShiftは、Kubernetesと呼ばれるオープンソースのコンテナオーケストレーションツールをベースにしています。コンテナオーケストレーションは、コンテナ化されたアプリケーションのデプロイ、スケーリング、ロードバランシング、障害対応などの自動化を行う仕組みです。OpenShiftは、これらのオーケストレーション機能を提供して、アプリケーションの運用を簡素化します。

**3. プロジェクトとアプリケーション**
OpenShift内では、プロジェクトと呼ばれる単位でアプリケーションがグループ化されます。プロジェクトは、異なるアプリケーションやチームが独立して作業できるようにする仕組みです。各プロジェクト内には、コンテナ化されたアプリケーションや関連するリソースが含まれます。

**4. ビルドとデプロイメント**
OpenShiftでは、アプリケーションのビルドとデプロイメントもサポートされています。ソースコードからコンテナイメージをビルドし、それをデプロイして実行するプロセスが自動化されています。CI/CD（継続的インテグレーション／継続的デリバリー）パイプラインを設定して、アプリケーションの開発とリリースを効率的に行うことができます。

**5. クラスタとノード**
OpenShiftは、複数のコンピュータリソース（ノード）をクラスタとしてまとめます。クラスタは、コンテナオーケストレーションの中心であり、アプリケーションのデプロイメントと管理を担当します。ノードは、実際にコンテナが実行される場所です