Tomcat マルチレイヤーコンテナの設計に関する簡単な説明

Tomcat マルチレイヤーコンテナの設計に関する簡単な説明

Tomcat のコンテナは Servlet をロードするために使用されます。では、Tomcat のサーブレット コンテナはどのように設計されているのでしょうか?

コンテナ階層

Tomcatは、エンジン、ホスト、コンテキスト、ラッパーの4つのコンテナを設計しました。

この階層化により、Tomcat はサーブレット コンテナーを非常に柔軟にします。

  • コンテキストはWebアプリケーションを表します
  • ラッパーはサーブレットを表します。Web アプリケーションには複数のサーブレットが存在する場合があります。
  • ホストは仮想ホストまたはサイトを表します。Tomcat には複数の仮想ホスト アドレスを設定でき、複数の Web アプリケーションを仮想ホストの下にデプロイできます。
  • Engine は、複数の仮想サイトを管理するために使用されるエンジンを表します。サービスには最大 1 つのエンジンを含めることができます。

Tomcat の server.xml 構成ファイルを確認します。 Tomcatはコンポーネント化された設計を採用しており、最外層はサーバーである。

これらのコンテナは親子関係を持ち、ツリー構造を形成します。Tomcat は複合モードを使用してこれらのコンテナを管理します。

すべてのコンテナコンポーネントはコンテナインターフェースを実装しているため、複合モードではユーザーは

単一のコンテナオブジェクトの最下位レベルのラッパー

複合コンテナオブジェクトのコンテキスト、ホスト、またはエンジン
の使用は一貫しています。

コンテナインターフェースの定義:

パブリックインターフェースコンテナはライフサイクルを拡張します {
    パブリック void setName(文字列名);
    パブリック コンテナ getParent();
    パブリック void setParent(コンテナー コンテナー);
    パブリック void addChild(コンテナの子);
    パブリック void removeChild(コンテナの子);
    パブリック コンテナ findChild(文字列名);
}

サーブレットの検索を要求するプロセス

コンテナーのレベルが非常に多い場合、Tomcat はどの Wrapper コンテナー内のどの Servlet がリクエストを処理するかをどのように決定するのでしょうか?
Tomcat はこのタスクを実行するために Mapper コンポーネントを使用します。

マッパーはユーザーが要求したURLをサーブレットに見つけます

仕組み

マッパーコンポーネントは、Webアプリケーションの構成情報(コンテナコンポーネントとアクセスパス間のマッピング関係など)を保存します。

  • ホストコンテナに設定されたドメイン名
  • コンテキストコンテナ内のWebアプリケーションパス
  • ラッパーコンテナ内のサーブレットマッピングのパス

これらの構成情報は、複数レベルのマップです。

リクエストが届くと、Mapper コンポーネントはリクエスト URL 内のドメイン名とパスを解析し、保存されているマップ内を検索することでサーブレットを見つけることができます。
リクエスト URL は最終的に 1 つのラッパー コンテナー、つまりサーブレットのみを検索します。

オンラインショッピングシステムがあれば、

  • Bサイドマネージャー向けバックエンド管理システム
  • Cエンドユーザー向けオンラインショッピングシステム

2 つのシステムは同じ Tomcat 上で実行されます。アクセス ドメイン名を分離するために、2 つの仮想ドメイン名が構成されています。

管理ショッピング
管理者は、このドメイン名を通じて Tomcat にアクセスし、ユーザーと製品を管理します。ユーザー管理と製品管理は、2 つの別々の Web アプリケーションです。

ユーザー.shopping.com
C エンド ユーザーは、このドメイン名を使用して製品を検索し、注文します。検索機能と注文管理も 2 つの独立した Web アプリケーションです。

このデプロイメントでは、Tomcat はサービス コンポーネントとエンジン コンテナ コンポーネントを作成し、エンジン コンテナの下に 2 つのホスト サブコンテナを作成し、各ホスト コンテナの下に 2 つのコンテキスト サブコンテナを作成します。 Web アプリケーションには通常複数のサーブレットがあるため、Tomcat は各コンテキスト コンテナーに複数の Wrapper サブコンテナーも作成します。各コンテナには対応するアクセスパスがある

Tomcat はどのようにしてサーブレットへの URL を見つけるのでしょうか?

まず、プロトコルとポート番号に応じてサービスとエンジンを選択します。
Tomcat の各コネクタは異なるポートをリッスンします。たとえば、Tomcat のデフォルトの HTTP コネクタはポート 8080 をリッスンし、デフォルトの AJP コネクタはポート 8009 をリッスンします。この URL はポート 8080 にアクセスするため、HTTP コネクタによって受信され、コネクタはサービス コンポーネントに属しているため、サービス コンポーネントが決定されます。サービス コンポーネントには複数のコネクタに加えてエンジン コンテナーもあるため、サービスが決定されるとエンジンも決定されます。

ドメイン名に基づいてホストを選択します。
Mapper コンポーネントは、user.shopping.com などの URL 内のドメイン名を通じて対応する Host コンテナーを検索するため、Mapper は Host2 コンテナーを見つけます。

URLパスに基づいてコンテキストコンポーネントを見つける
ホストが決定された後、Mapper は URL パスに従って対応する Web アプリケーションのパスを照合します。たとえば、例では /order にアクセスしているため、コンテキスト コンテナ Context4 が見つかります。

最後に、URLパスに基づいてラッパー(サーブレット)を見つけます。
コンテキストが決定された後、マッパーは web.xml で構成されたサーブレット マッピング パスに従って特定のラッパーとサーブレットを検索します。

リクエストを処理するのはサーブレットだけではありません。検索パス上の親コンテナと子コンテナもリクエストを処理します。

  • コネクタ内のアダプタはコンテナのサービスメソッドを呼び出してサーブレットを実行します。
  • リクエストを受信する最初のコンテナは、エンジン コンテナです。リクエストを処理した後、エンジン コンテナはリクエストを子コンテナのホストに渡してさらに処理します。
  • 最後に、リクエストは Wrapper コンテナに渡され、Wrapper はそれを処理するために最終的なサーブレットを呼び出します。

この呼び出しプロセスは、Pipeline-Valve パイプラインと責任連鎖モデルを使用します。リクエスト処理プロセス中、多くのハンドラーが順番にリクエストを処理します。各ハンドラーは独自の処理を担当します。処理後、次のハンドラーが呼び出され、処理が続行されます。

Valve は、権限認証やログ記録などの処理ポイントを表します。

パブリックインターフェースValve {
  パブリック Valve getNext();
  public void setNext(Valve バルブ);
  public void invoke(Request リクエスト、Response レスポンス)
}

Valve は処理ポイントであるため、リクエストを処理するためにinvoke メソッドが使用されます。
パイプラインインターフェース:

パブリックインターフェースPipelineはContainedを拡張します{
  public void addValve(Valve バルブ);
  パブリック Valve getBasic();
  public void setBasic(Valve バルブ);
  パブリック Valve getFirst();
}

したがって、Valve のリンク リストがパイプライン内に維持され、Valve をパイプラインに挿入できます。
Valve が自身の処理を完了した後、getNext.invoke を呼び出して次の Valve を呼び出すことによって呼び出しチェーン全体がトリガーされるため、Pipeline には呼び出しメソッドがありません。

各コンテナにはパイプライン オブジェクトがあります。パイプラインの最初のバルブがトリガーされると、このコンテナのパイプライン内のすべてのバルブが呼び出されます。しかし、異なるコンテナのトリガー パイプラインを連鎖するにはどうすればよいでしょうか?
たとえば、エンジン内のパイプラインは、下位レベルのコンテナー ホスト内のパイプラインを呼び出す必要があります。
パイプラインには getBasic メソッドがあります。この BasicValve は Valve チェーンの最後にあり、下位のコンテナーのパイプラインの最初の Valve を呼び出す役割を担います。


呼び出しプロセス全体はコネクタ内のアダプタによってトリガーされ、エンジンの最初のバルブを呼び出します。

ラッパー

コンテナの最後のバルブはフィルター チェーンを作成し、doFilter メソッドを呼び出します。このメソッドは最終的にサーブレットのサービス メソッドに呼び出されます。

バルブとフィルターの違いは何ですか?

  • Valve は Tomcat のプライベート メカニズムであり、Tomcat と密接に結合されています。サーブレットAPIは公開標準であり、Jettyを含むすべてのWebコンテナはフィルターをサポートしています。
  • Valve は Web コンテナ レベルで動作し、すべてのアプリケーション要求をインターセプトします。サーブレット フィルターはアプリケーション レベルで動作し、特定の Web アプリケーションに対するすべてのリクエストのみをインターセプトします。 Web コンテナ全体のインターセプターになりたい場合は、Valve を使用する必要があります。

Tomcat マルチレイヤー コンテナの設計に関するこの記事はこれで終わりです。Tomcat マルチレイヤー コンテナに関するより関連性の高いコンテンツについては、123WORDPRESS.COM の過去の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • Spring Boot プロジェクトを Tomcat コンテナに公開する (Tomcat6 への公開方法を含む)
  • DockerにTomcatコンテナを追加したときにホームページにアクセスできない問題の解決方法
  • Tomcat コンテナ管理セキュリティの認証方法の概要
  • スーパーバイザーを使用して nginx + tomcat コンテナを管理する例
  • SpringBoot2 は Jetty コンテナ操作を使用します (デフォルトの Tomcat を置き換えます)
  • Spring が Tomcat Servlet コンテナをシャットダウンするときに発生するメモリ リークの解決策
  • Tomcat コンテナに基づく Springboot の自動起動プロセスの分析
  • 負荷分散と動的および静的分離操作を実現するDocker NginxコンテナとTomcatコンテナ

<<:  ウェブフロントエンド開発の細部

>>:  HTML タグのカスタム属性に関する質問

推薦する

Vue における Vue.use() の原理と基本的な使用法

目次序文1. 例で理解する2. ソースコードを分析する3. まとめ要約する序文他の人のコンポーネント...

クロスブラウザの問題に対する 5 つの解決策 (要約)

簡単なレビュー: ブラウザの互換性の問題は、しばしば頭痛の種となります。ここでは、これらの問題を回避...

HTMLテキスト内のすべてのタグを置き換える方法

(?i) は大文字と小文字を区別しないことを意味します。大文字と小文字をすべて置き換えます。 htm...

Nginx+Tomcat 負荷分散クラスタの実装例

目次導入1. 事例の概要2. 環境の展開3. Nginxホストのインストール4. Tomcatのイン...

雨滴効果を実現する JavaScript キャンバス

この記事では、雨滴効果を実現するためのJavaScriptキャンバスの具体的なコードを参考までに紹介...

VMware 仮想マシンのインストール Apple Mac OS の超詳細なチュートリアル

目次要約する仕事の都合で Apple の Mac OS に対応するソフトウェアをインストールする必要...

HTML コメント HTML 内のテキストコメントをマークするための記号

HTML コメント。コードの横に HTML コメントを付ける必要があることがよくあります。そうするこ...

サーバー上で Nginx を使用して Springboot プロジェクトをデプロイする方法の詳細なチュートリアル (jar パッケージ)

1. Javaプロジェクトをjarパッケージにパッケージ化するここではMavenツールを使用します...

CSS画像結合技術(スプライト画像)の詳しい説明

CSS画像結合技術1. 画像のステッチ画像ステッチング技術は、個々の画像を収集する技術です。画像の多...

理論の普及——ユーザーエクスペリエンス

1. 概念分析 1: UE ユーザー エクスペリエンス <br />英語ではユーザー エ...

MySQL でストアド プロシージャを作成し、データ テーブルに新しいフィールドを追加する方法の分析

この記事では、例を使用して、MySQL でストアド プロシージャを作成し、データ テーブルに新しいフ...

Docker ベースの Redis 1 マスター、2 スレーブ、3 センチネルの実装

現在、Redis とコンテナについて学習中なので、Docker を使用して Redis マスタースレ...

vue.js ルーターのネストされたルートの実例

目次序文Vue CLI での設定基本コードVueルーターの登場ネストされたルートの設定要約する序文V...