私はマイクロサービスについてかなりの読書をしましたが、今のところ何も設計していません。私は今それを行うために取り組んでおり、どのアプローチが正しいのか疑問に思っています(下の画像を参照)。
基本的に、各マイクロサービスはそのデータを所有し、API経由でのみ公開する必要があることを読みましたが、それは完全に理にかなっています。ただし、それ自体がマイクロサービスの専門性を示すものではありません。モノリスを分解するとき、どこで停止しますか?私の直感は、多くのオンライン例が行き過ぎだということです。
特に、Customers/Accounts/AccountTransactions
やUsers/Posts/Comments
は可能ですが、アーキテクチャの観点からすると、私には非常に間違っていると感じています。このデータは相互依存的であり、相互に依存することを意図しています。なぜそれを強制的に分離しようとするのですか?何か不足していますか?
データの所有権や同棲状況とは別に、マイクロサービスとエンドポイントの間の適切なマッピングについてもう1つの問題があります。 RESTful APIを介してマイクロサービスにアクセスする方法を選択する場合、エンドポイントごとに1つのマイクロサービスにする必要がありますか、それとも1つのマイクロサービスに複数のエンドポイントを設定できますか?ベストプラクティスは何ですか? 3つのエンドポイントを持つ1つのマイクロサービスと、3つすべてにサービスを提供する1つのデータベースを使用できますか?
マイクロサービスにはサブディビジョンがありますか?ある場合、それは何と呼ばれますか?方法?これは前の質問に関連しています。 1つのマイクロサービスが複数のことを実行できる場合、それらのことを行うことはどのように呼ばれますか?
マイクロサービスアーキテクチャでは、互いに属しているものを分離する必要はありません。
今、エンドポイントは別の話です。もちろん、各マイクロサービスを外部の世界に公開することもできます。ただし、 APIゲートウェイ と呼ばれる外部の世界を経由する一種のファサードの後ろにそれを隠すことにより、はるかに多くの利点と柔軟性があります。これにより、機能の追加、削除、移動が必要になる可能性のあるマイクロサービスビューが、1つの統合されたインターフェイスを表示するフロントエンドの世界から切り離されます。
マイクロサービスのポイントは、独立したソフトウェアを取得することです。この独立性は、保守性、組織の適合性、スケーラビリティーなどの複数の目的に役立ちます。これらは、状況に応じて有利になる場合があります。
データに基づいてサービスに分割することは、人気があるようですが、マイクロサービスに適しているとは言えません。単純な理由は、independentピースにならないことです。
独立したピースに到達する唯一の方法は、垂直に分割することです。つまり特定のケースに必要なサービスにすべてを入れます。サービス間の要求/応答ベースの通信は最小限に抑え、理想的には完全に排除する必要があります。
理想的には、これはサービスが独自のUIをもたらす必要があることも意味します!繰り返しますが、これは独立性を保証する唯一の方法であり、サービスを維持するチームを完全に制御できます。 UIが個別のものである場合は、コンポーネント、チーム、リリーススケジュールなどのハードカップリングをすでに導入しています。
したがって、私はnoneと言いますが、これらのデザインのいずれかを使用できる特別な状況があるかもしれません。
黄色はモノリスのようです。
赤は機能を介してマイクロサービスを分割したもので、モノリスに適切にマッピングできます。
青と緑はビジネスエンティティを介して分離されているため、より有効に見えます。
さて、
a)前述のように、ゲートウェイを使用してみることができます。これにより、問題が簡単になります。
b)必要な数のエンドポイントを公開します。これはいかなる原則にも違反しません。ここでの目標は、高い凝集性と疎結合を実現することです。つまり、関連する機能が一緒に配置されます。
c)マイクロサービスの目的は、それらを個別にデプロイできるため、構成管理(変更要求、新機能など)のコストを削減できることです(ソフトウェアの進化)。
これも パターン であり、各マイクロサービスに独自のデータベースが必要な理由を説明しています。