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

推薦する

Docker MySQLコンテナデータベースへの変更が有効にならない問題を解決する

公式の MySQL イメージを使用するには、構成ファイル、DB データ ファイル ディレクトリなどの...

Linux で rsync を使用する方法

目次1. はじめに2. インストール3. 基本的な使い方3.1、-rパラメータ3.2、-aパラメータ...

JavaScript はチェックボックスの選択機能を実装します

この記事の例では、すべてのチェックボックスの選択を実現するためのJavaScriptの具体的なコード...

Linux環境にJDKとTomcatをインストールする詳細な手順

目次1. JDKをインストールする手動インストール2. トムキャット1. JDKをインストールする注...

Vue はカスタム「モーダル ポップアップ ウィンドウ」コンポーネントのサンプル コードを実装します

目次序文レンダリングサンプルコード要約する序文ダイアログ ボックスは非常に一般的なコンポーネントであ...

Uniapp WeChatアプレット: キー障害の解決策

ユニアプリコード <テンプレート> <表示> <image v-for...

入力ボックスの値を取得する方法のReactの例

入力ボックスの値を取得する複数の方法最初の方法は、制御されていないコンポーネントの取得です2番目の方...

docker イメージのプル速度が遅い問題の解決策

現在、Docker には中国向けの公式ミラーがあります。詳細については、https://www.do...

node.js でマルチコア CPU を最大限に活用する方法

目次概要node.js でマルチコア CPU を最大限に活用する方法Node で子プロセスを作成する...

LeetCode の SQL 実装 (183. 注文をしたことがない顧客)

[LeetCode] 183.注文しない顧客Web サイトに、Customers テーブルと Or...

VM VirtualBox 仮想マシンのマウント共有フォルダ

一つの環境CentOS 7にVMware Toolsをインストールしてホストの共有フォルダへのアクセ...

ウェブページの内部アンカーポイントを実現するための純粋なCSSの上下オフセットコード例

最近、「フットボール ナビゲーション」Web サイトに取り組んでいるときに、上部の固定ナビゲーション...

js の通常形式の日付と時刻に 0 を自動的に追加する 2 つのソリューション

目次背景解決策1アイデア:コード:解決策2アイデア:要約する参照する背景日付と時間をフォーマットする...

MacOS で Docker を使用して MySQL マスター スレーブ データベースを作成する方法

1. MySQLイメージを取得するターミナルから最新のMySQLイメージを取得するdocker pu...

証明書を使用してリモート Docker サーバーに接続する方法

目次1. スクリプトを使用してDockerのTLSを暗号化する2. Dockerの設定を変更してリモ...