1731770934
2024-11-14 12:07:00
PandApache3 Web サーバーは、モジュール式アーキテクチャに基づいています。しかし、これは実際には何を意味するのでしょうか?
Webサーバーのモジュール
PandApache3 サービスを「ブラック ボックス」と考えると、それを 3 つの主要なモジュールに分割できます。
-
モジュールウェブ : ポート 80 で HTTP リクエストを処理できるようになり、PandApache3 がホストするサイトへのアクセスが可能になります。
-
モジュール管理者 : PandApache サービスを管理するための Web インターフェイスを提供します。
-
テレメトリーモジュール :サービスの運営に関するデータを収集・分析するために利用します。
これらのモジュールは相乗的に機能しますが、独立して実行することもできるため、開発中に非常に便利です。たとえば、他のモジュールに妨げられることなく、テレメトリ モジュールのみをアクティブにしてテストできます。この柔軟性により、テストが簡素化され、開発サイクルが短縮されます。
このアーキテクチャを採用すると、将来の改善も大幅に促進されます。たとえば、サーバーに新しい機能を追加したい場合は、新しいモジュールを作成するだけです。このアプローチを使用すると、既存のモジュールを中断することなく、新しいモジュールを残りのコードに簡単に統合できます。
インターフェースとの簡単な統合
各モジュールの動作を標準化するために、PandApache3 は と呼ばれる C# インターフェイスを使用します。 IModule。インターフェイスが実際に何をもたらすかを見てみましょう。
あ インタフェース C# における は、一連のメソッドを実装せずに定義するコントラクトです。共通のフレームワークを適用することで、すべてのモジュールが同じ基本機能を備えていることが保証され、同時に各モジュールがその動作をカスタマイズできるようになります。
ここにインターフェースがあります IModule PandApache3 で使用される:
public interface IModule
{
Task StartAsync();
Task RunAsync();
Task StopAsync();
bool isEnable();
}
各モジュールは開始、実行、停止できる必要があります。方法 isEnable() モジュールがサービス構成に従ってアクティブ化されているかどうかを確認するために使用されます。このインターフェイスを実装することにより、各モジュールはこの構造を確実に尊重します。
テレメトリ モジュールの実装例:
public class TelemetryModule : IModule
{
public async Task StartAsync()
{
// Initialiser la collecte de données
}
public async Task RunAsync()
{
// Collecte en continue des métriques de télémétrie
}
public async Task StopAsync()
{
// Arrêter la collecte de données
}
public bool isEnable()
{
// Vérifier si le module est activé
return ModuleInfo.isEnable;
}
}
Web モジュールや管理モジュールと同様、テレメトリ モジュールはこのインターフェイスを使用して独自の機能を実装します。
ポリモーフィズムの使用
インターフェイスとそれを実装するクラスを定義したところで、それらを統一した方法で管理するにはどうすればよいでしょうか?ここで、 多態性 介入する。
ポリモーフィズムは、異なるクラスを同様に使用できるようにするプログラミングの概念です。インターフェースの使用 IModulePandApache3 は、実際のタイプに関係なく、すべてのモジュールを均一に扱うことができます。
メインサーバークラスでは、モジュールが初期化され、型ディクショナリに格納されます。 IModule :
public DictionaryModuleType, IModule> Modules = new DictionaryModuleType, IModule>();
// Initialisation des modules
TelemetryModule telemetryModule = new TelemetryModule(telemetryTaskScheduler);
ConnectionManagerModule webModule = new ConnectionManagerModule(ModuleType.Web, Pipelines["web"], webTaskScheduler);
ConnectionManagerModule adminModule = new ConnectionManagerModule(ModuleType.Admin, Pipelines["admin"], adminTaskScheduler);
Modules.Add(ModuleType.Telemetry, telemetryModule);
Modules.Add(ModuleType.Web, webModule);
Modules.Add(ModuleType.Admin, adminModule);
// Garder seulement les modules activés dans la configuration
foreach (var moduleKey in Modules.Keys.ToList())
{
if (!Modules[moduleKey].isEnable())
{
ExecutionContext.Current.Logger.LogWarning($"Module {moduleKey} désactivé");
Modules.Remove(moduleKey);
}
}
モジュールはオブジェクトとして作成されますが、 TelemetryModule または ConnectionManagerModule、の形式で保存されます。 IModule。そのため、特定の種類を知らなくても、それらを均一に管理できます。
モジュールの起動と実行
サーバーはポリモーフィズムのおかげで、ループを使用してアクティブ化されたすべてのモジュールを開始します。これは次のようになります。
foreach (var moduleName in Modules.Keys)
{
await Modules[moduleName].StartAsync();
}
の使用 IModule 各モジュールのタイプを気にせずに、同じループ内で各モジュールを開始、実行、停止できます。たとえば、すべてのモジュールを実行するには:
ListTask> tasks = new ListTask>();
foreach (var moduleName in Modules.Keys)
{
tasks.Add(Task.Run(() => Modules[moduleName].RunAsync()));
}
await Task.WhenAll(tasks);
そして彼らを止めるには:
foreach (var moduleName in Modules.Keys)
{
await Modules[moduleName].StopAsync();
}
新しいモジュールを追加する
このモジュラー アーキテクチャのおかげで、PandApache3 への新しいモジュールの追加は簡単です。実装する新しいクラスを記述するだけです。 IModule。インターフェイスはフレームワークを強制し、簡単で一貫した統合を保証します。
インターフェイスは、PandApache3 全体で重要な役割を果たします。たとえば、すべてのミドルウェアはインターフェイスに従います。 IMiddleware、オンチェーンで実行できるようになります。ソケット、ロガー、ファイル マネージャー、さらには構成マネージャーなどのコンポーネントもインターフェイスを使用するため、コードがより柔軟になり、テストが容易になります。
このモジュール式アプローチとインターフェイスのインテリジェントな使用により、PandApache3 は拡張可能で保守可能な Web サーバーとなり、既存のコード ベースに大幅な変更を必要とせずに新しい機能で進化できるようになります。
この記事が、C# におけるインターフェイスの具体的かつ重要な役割をより深く理解するのに役立つことを願っています。この言語に興味がある場合は、PandApache3 コードが次の場所で入手できることに注意してください。 GitHub そして生き続ける けいれん。迷わず冒険を続けましょう!
#のインターフェイスを使用してスケーラブルなアプリケーションを設計する