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

推薦する

HTML テーブル マークアップ チュートリアル (43): テーブル ヘッダーの VALIGN 属性

垂直方向では、ヘッダーの配置を上、中央、下に設定できます。基本的な構文構文Top は上、Middle...

Linuxでスクリーンショットを撮って編集するための最高のツール

メインのオペレーティング システムを Windows から Ubuntu に切り替えたとき、最初に考...

Windows での MySQL のダウンロード、インストール、設定、使用に関するチュートリアル

MySQLの概要MySQL はリレーショナル データベース管理システムです。データベースは構造化され...

MySQL クエリのソートとクエリ集計関数の使用法の分析

この記事では、例を使用して、MySQL クエリのソート関数とクエリ集計関数の使用方法を説明します。ご...

ウェブデザインのグラフィック構成と組版機能の紹介

すべてには基礎が必要です。家を建てるには基礎が必要です。方程式を解くには、まず九九を覚える必要があり...

JavaScript関数導入の詳しい説明

目次機能紹介関数関数の作成コンストラクタは関数を作成する関数宣言は関数を作成する関数式関数を作成する...

HTML でシンプルな ListViews 効果を実装するためのサンプル コード

シンプルなリストビュー効果を実現するHTML結果: CSS スタイル ファイル listviewTe...

MySQL 5.6 の「暗黙的な変換」によりインデックスが失敗し、データが不正確になる

背景SQL クエリを実行するときに、where 条件の vachar 型フィールドの単一引用符を削除...

ウェブサイトがhttpsを有効にした後のSSLのセキュリティ構成と検出

最近のウェブサイトでは SSL を有効にするのが標準となっています。ただし、SSL を設定した後も、...

resizeを使用して画像切り替えプレビュー機能を実装する方法

要点CSS resize プロパティを使用すると、要素のサイズ変更可能性を制御できます。サイズ変更を...

MySQLのロックについて理解しておくべきこと

1. はじめにMySQL ロックは、その範囲に応じて、グローバル ロック、テーブル ロック、行ロック...

TypeScript 開発のための 6 つの実用的なヒント

目次1. 開発前にエンティティの種類を決定する2. インターフェースをリクエストするときは、使用する...

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

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

Dockerでの接続例外中のエラーを解決する

Docker を初めて使い始めると、通常とは異なる問題に遭遇して、必然的に混乱してしまいます。大丈夫...

MySQL無料インストールバージョンの設定チュートリアル

この記事では、参考までにMySQLの無料インストール構成チュートリアルを紹介します。具体的な内容は次...