趣味で、マイクロサービス アーキテクチャを使用していくつかの Web アプリケーションを設計しています。構成管理を行うための最善の方法を決定しようとしていますが、構成に対する私のアプローチにはいくつかの大きな落とし穴があるのではないか、またはより良い方法が存在するのではないかと心配しています。
問題を組み立てるために、C++ で記述された認証サービス、Rust で記述された ID サービス、Haskell で記述された分析サービス、scala で記述されたいくつかの中間層、および JavaScript で記述されたフロントエンドがあるとします。対応する ID DB、認証 DB、分析 DB (おそらくセッションの redis キャッシュ) などもあります。これらのアプリはすべて docker swarm を使用してデプロイしています。
これらのアプリの 1 つが展開されるたびに、必ず他のすべてのアプリケーションを検出する必要があります。私は docker swarm を使用しているので、すべてのノードが必要なオーバーレイ ネットワークを共有している限り、検出は問題になりません。
ただし、各アプリケーションには依然としてアップストリーム サービスの host_addr、おそらくポート、一部の DB または封印されたサービスの資格情報などが必要です。
docker にはsecrets
、アプリがコンテナーから構成を読み取れるようにする機能があることは知っていますが、各サービスの各言語で構成パーサーを作成する必要があります。これは厄介なようです。
私がむしろしたいのはconfiguration service
、他のすべてのサービスを構成する方法に関する知識を維持する です。したがって、各アプリケーションは、実行時にアプリケーションの構成を取得するように設計された RPC 呼び出しで開始されます。何かのようなもの
int main() {
AppConfig cfg = configClient.getConfiguration("APP_NAME");
// do application things... and pass around cfg
return 0;
}
AppConfig は IDL で定義されるため、クラスはすぐに使用可能になり、言語に依存しなくなります。
これは良い解決策のように思えますが、おそらく私はここでポイントを逃しています。大規模であっても、いくつかの構成サービスで数万のノードを簡単に処理できるため、スケーリングの問題は予想されません。繰り返しますが、これは単なる趣味のプロジェクトですが、「もしも」のシナリオについて考えるのが好きです :)
構成スキームはマイクロサービス アーキテクチャでどのように処理されますか? これは合理的なアプローチのように思えますか? Facebook、Google、LinkedIn、AWS などの主要なプレーヤーは何をしていますか?