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 タグのカスタム属性に関する質問

推薦する

mysql8でルートユーザーのパスワードをリセットする手順を完了します

序文最近、多くの新しい同僚がこの質問をしてきました。特に、homebrew を通じて自動的にインスト...

MySQLインストール後のデフォルトデータベースの役割の詳細な説明

MySQL を学習すると、インストール後にいくつかのデフォルトのデータベースが付属していることに気付...

MySQLはライブラリ内の主キーなしでテーブルインスタンスコードを素早く取得します

概要MySQL データベースで主キーのないテーブルを表示するための SQL ステートメントをいくつか...

Linux C バックグラウンドサービスプログラムの単一プロセス制御の実装

導入通常、バックグラウンド サーバー プログラムには 1 つのプロセスのみが必要ですが、単一のプロセ...

シンプルなタブバー切り替えコンテンツバーを実装するJavaScript

この記事では、タブバーの切り替えコンテンツバーを簡単に実現するためのJavaScriptの具体的なコ...

CocosCreatorを使ってシューティングゲームを作る方法

製造手順を分析します。 1. リソースを準備してシーンを構築するオンラインでリソースを探すか、私のリ...

Vueはdivホイールのズームインとズームアウトを実装します

Vue プロジェクトで div ホイールのズームインとズームアウト、ドラッグ効果、キャンバス効果に似...

tomcat デプロイメント プロジェクトの実装と IDEA との統合

目次Tomcat でプロジェクトを展開する 3 つの方法プロジェクトをwebappsディレクトリに直...

MySQL 5.7.21 のインストールと設定方法のグラフィックチュートリアル (ウィンドウ)

ウィンドウ環境にmysql5.7.21をインストールします。詳細は次のとおりです。 1. MySQL...

Firefoxでリンクをクリックしたときに点線の枠線を削除する方法

今日、ブラウザの互換性の問題にいくつか遭遇しました。そのうちの 1 つは奇妙に感じました。Firef...

Vue命令の実装原理の分析

目次1. 基本的な使い方2. 指示の動作原理2.1. 初期化2.2 テンプレートのコンパイル2.3....

Linux で Sudo を使用して権限を委譲する

sudo 権限委譲の概要su スイッチ ID: su –l ユーザー名 –c 'コマンド&#...

MySQLデータベースでスロークエリログを有効にする方法の詳細な説明

データベースはスロークエリログを有効にします設定ファイルを変更する設定ファイルmy.iniに次の2つ...

3つの主要データベース(Mysql、SqlServer、Oracle)の違いについて簡単に説明します。

マイグレーションアドバンテージ:小型、高速、総所有コストが低い、オープンソース。複数のオペレーティン...

Tomcat の文字化けしたコードとポート占有の解決方法について簡単に説明します

Tomcat サーバーは、無料でオープン ソースの Web アプリケーション サーバーです。軽量のア...