Nginx+SpringBoot による負荷分散の実装例

Nginx+SpringBoot による負荷分散の実装例

負荷分散の概要

Nginx の負荷分散実装を紹介する前に、負荷分散の分類について簡単に説明します。負荷分散は、主にハードウェア負荷分散とソフトウェア負荷分散に分かれます。ハードウェア負荷分散は、専用のソフトウェアとハ​​ードウェアを組み合わせて使用​​するデバイスです。機器ベンダーは、F5 などの完全で成熟したソリューションを提供します。これは、データの安定性とセキュリティの面で非常に信頼性が高いですが、ソフトウェアよりも高価です。ソフトウェア負荷分散は、主に Nginx などのソフトウェアに基づいており、メッセージ キュー分散メカニズムを実装しています。

簡単に言えば、負荷分散とは、多数のリクエストを転送し、異なるサーバーに割り当てて処理することです。たとえば、A、B、C の 3 つのサーバーがあり、ポーリング戦略を使用して Nginx で負荷分散を行っているとします。この時点で 9 つのリクエストを受信した場合、これらの 9 つのリクエストは A、B、Cf サーバーに均等に分散され、各サーバーは 3 つのリクエストを処理します。このように、複数のマシン クラスターの特性を利用して、単一のサーバーにかかる負荷を軽減できます。

負荷分散を実装する Nginx の例の図:

負荷分散戦略

NGINX Open Source では 4 つの負荷分散方法をサポートしており、NGINX Plus ではさらに 2 つの方法が追加されています。

1.ラウンドロビン:

すべてのリクエストをポーリングして送信します。これがデフォルトの割り当て方法です。

nginx.conf の設定例:

上流
  サーバー www.panchengming.com;
  サーバー www.panchengming2.com;
}

注: 上記のドメイン名は IP に置き換えることもできます。

2. 接続数が最も少ない:

サーバーの重みも考慮して、アクティブな接続数が最も少ないサーバーにリクエストを送信します。

nginx.conf の設定例:

上流
  最小接続数;
  サーバー www.panchengming.com;
  サーバー www.panchengming2.com;
}

3.IPハッシュ:

リクエストが送信されるサーバーは、クライアントの IP アドレスによって決まります。この場合、ハッシュ値の計算には IPv4 アドレスの最初の 3 バイトまたは IPv6 アドレス全体が使用されます。この方法により、サーバーが利用できない場合を除き、同じアドレスからのリクエストが同じサーバーに到達することが保証されます。

上流
   ip_ハッシュ;
   サーバー www.panchengming.com;
   サーバー www.panchengming2.com;
}

4.汎用ハッシュ:

リクエストが送信されるサーバーは、ユーザー定義のキーによって決定されます。ユーザー定義のキーは、テキスト文字列、変数、またはその組み合わせにすることができます。

	上流
	  ハッシュ $request_uri は一貫しています。
	  サーバー www.panchengming.com;
    サーバー www.panchengming2.com;
	}

5. 最短時間(NGINX Plusのみ)

NGINX Plus は、リクエストごとに、平均レイテンシが最も低く、アクティブな接続数が最も少ないサーバーを選択します。平均レイテンシの最小値は、least_time ディレクティブを含む次のパラメータに基づいて計算されます。

  • ヘッダー: サーバーから最初のバイトを受信した時刻。
  • last_byte: サーバーから完全な応答を受信した時刻。
  • last_byte inflight: サーバーから完全な応答を受信した時刻。
上流
least_time ヘッダー;
サーバー www.panchengming.com;
サーバー www.panchengming2.com;
}

6. ランダム:

各リクエストはランダムに選択されたサーバーに渡されます。両方のパラメータが指定されている場合、NGINX は最初にサーバーの重みに基づいて 2 つのサーバーをランダムに選択し、次に指定された方法を使用してそのうちの 1 つを選択します。

  • least_conn : アクティブな接続の最小数
  • least_time=header (NGINX Plus): サーバーから応答ヘッダーを受信する最短平均時間 ($upstream_header_time)。
  • least_time=last_byte (NGINX Plus): サーバーから完全な応答を受信するまでの最小平均時間 ($upstream_response_time)。
上流
ランダム2 least_time=last_byte;
サーバー www.panchengming.com;
サーバー www.panchengming2.com;
}

負荷分散を実現するNginx+SpringBoot

環境の準備

  • JDK 1.8 以降に依存します。
  • Nginx 環境に依存します。

このプロジェクトでは、私が以前に作成した SpringBoot プロジェクトを使用しています。SpringBoot のプロジェクト アドレスは次のとおりです: https://github.com/xuwujing/springBoot-study/tree/master/springboot-thymeleaf

まず、プロジェクトをダウンロードし、 mvn clean packageと入力して、プロジェクトを jar ファイルにパッケージ化します。次に、 application.propertiesとこの jar プロジェクトをフォルダーに配置し、フォルダーをコピーします (ここではわかりやすくするためにコピーしていますが、実際にはポートを変更せずに再起動できます)。次に、コピーしたフォルダーapplication.propertiesのポートを、たとえば 8086 に変更します。

Nginx の設定

nginx/conf/nginx.conf ディレクトリにある nginx 設定ファイル nginx.conf を見つけて、設定を変更し、次の設定を追加します。

上流 pancm{
  サーバー 127.0.0.1:8085;
  サーバー 127.0.0.1:8086;
}
  • アップストリーム pancm: 名前を定義します。任意の名前でかまいません。
  • サーバー + IP:ポートまたはドメイン名;

ラウンドロビン戦略を使用しない場合は、別の戦略に切り替えることができます。

次に、サーバー上で次の構成を追加/変更します。

 サーバー{
    聞く 80;
    サーバー名 127.0.0.1;


    位置 / {
      ルートhtml;
      proxy_pass http://pancm;
      proxy_connect_timeout 3秒;
      proxy_read_timeout 5秒;
      proxy_send_timeout 3秒;	
      インデックス index.html index.htm;
    }

    エラーページ 500 502 503 504 /50x.html;
    場所 = /50x.html {
      ルートhtml;
    }
  }

設定手順:

  • サーバー: 仮想ホストの名前。1 つの http で複数のサーバーを設定できます。
  • listen: Nginx のデフォルト ポート。
  • server_name: Nginx サービスのアドレス。ドメイン名を使用できます。複数の名前はスペースで区切られます。
  • proxy_pass: プロキシパス。一般的には、負荷分散を実現するためにアップストリームが設定された後に名前が設定され、ジャンプ先の IP を直接設定することもできます。

nginx.conf の完全な設定:

イベント {
  ワーカー接続 1024;
}

error_log nginx-error.log 情報;
http {
  mime.types を含めます。
  デフォルトタイプ アプリケーション/オクテットストリーム;
  ファイル送信オン;
  キープアライブタイムアウト65;

   上流 pancm{
    サーバー 127.0.0.1:8085;
    サーバー 127.0.0.1:8086;
  }
  
  サーバー{
    聞く 80;
    サーバー名 127.0.0.1;


    位置 / {
      ルートhtml;
      proxy_pass http://pancm;
      proxy_connect_timeout 3秒;
      proxy_read_timeout 5秒;
      proxy_send_timeout 3秒;	
      インデックス index.html index.htm;
    }

    エラーページ 500 502 503 504 /50x.html;
    場所 = /50x.html {
      ルートhtml;
    }
  }
}

負荷分散テスト

Nginx の設定が完了したら、Nginx を起動します。
Linux では、 /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.confと入力します。起動している場合は、 /usr/local/nginx/sbin/nginx -s reloadコマンドを使用して、構成ファイルをホット リロードできます。Windows では、Nginx ディレクトリのnginx.exeを直接クリックするか、 cmd start nginxを実行して起動します。起動している場合は、 nginx -s reloadを使用してホット リロードできます。

Nginx を起動したら、ダウンロードした Springboot と、変更されたポートがコピーされたプロジェクトを順に起動し、 java -jar springboot-jsp-thymeleaf.jarと入力して起動します。

すべてが正常に起動したら、ブラウザにサービス IP を入力してアクセスできるようになります。

サンプル画像:

注: ここではテストに Windows システムを使用していますが、実際の Linux システムも同じです。

次にそれを実行して、コンソール ログを確認します。

上記の例の図から、4 つのインターフェース更新要求が行われ、最終的に 2 つのサービスに均等に分散されました。上記のテスト結果から、負荷分散が実現されました。

ここでは、Nginx を使用する際の注意事項について説明します。学習やテストの際には、一般的に nginx のデフォルト ポートを使用して負荷分散を実現しても問題ありません。ただし、プロジェクトで使用する場合、特にログイン インターフェイスがあり、ポートが 80 でない場合は、ログイン インターフェイスをリダイレクトできません。デバッグ時に、net::ERR_NAME_NOT_RESOLVED などのエラーが表示されます。これは、nginx のデフォルト ポートが 80 であり、デフォルトのジャンプもこれであるためです。したがって、このような場合は、location の下に proxy_set_header Host $host:port 構成を追加し、ポートと listen ポートが一致している必要があります。

上記は、負荷分散を実現するための Nginx+SpringBoot の例の詳細です。負荷分散を実現するための Nginx の詳細については、123WORDPRESS.COM の他の関連記事に注目してください。

以下もご興味があるかもしれません:
  • Docker Swarm のサービス検出と負荷分散の原則の詳細な説明
  • サーバー負荷分散とはどういう意味ですか(サーバー負荷分散の基本機能と実装原則)
  • ソフトウェア ロード バランサを使用して Web サーバー クラスターを実装する (iis+nginx)
  • Nginx ロードバランシングとは何か、そしてそれをどのように設定するか
  • ASP.NET Core 3.1 Ocelot 負荷分散の実装
  • Nginx + consul + upsync を使用して動的負荷分散を実現する方法の詳細な説明
  • Spring Cloudシリーズのロードバランシングリボンのサンプルコード
  • サービス検出と負荷分散の詳細について簡単に説明します

<<:  CentOS8 で MySQL 8.0 をインストールしてデプロイする方法

>>:  Vue3はJingdong製品詳細ページの虫眼鏡効果コンポーネントをカプセル化します

推薦する

階段を転がす特殊効果を実現する JavaScript (jQuery 実装)

皆さんもJDを使ったことがあると思います。ホームページには非常によく見られる機能があります。階段の特...

1つの記事でJavaScript DOM操作の基本を学ぶ

DOM の概念DOM: ドキュメント オブジェクト モデル: ドキュメント オブジェクト モデルは、...

MySQLの結合の基本原理についての簡単な説明

目次結合アルゴリズム駆動テーブルと非駆動テーブルの違い1. 単純なネストループ結合、単純なネスト、イ...

WeChat アプレット計算機の例

WeChatアプレット計算機の例、参考までに、具体的な内容は次のとおりです。インデックス.wxml ...

Vueフィルターの詳細な説明

<本文> <div id="ルート"> <h2&...

最小限のルートファイルシステムを構築するためにbusyboxを移植するための詳細な手順

Busybox: 小さなコマンドが詰まったスイスアーミーナイフ。ステップ1: ディレクトリ構造を作成...

Vue コンポーネントでのアンチシェイクとスロットリングの使用例の分析

入力ボックスへのユーザー入力、ウィンドウのサイズ変更、スクロール、Intersection Obse...

iOS、Android、ミニプログラムアプリの敷居の低い開発のためのフロントエンドフレームワークを詳しく解説

現在、クロスプラットフォーム開発技術はもはや新しい話題ではありません。市場にはいくつかのオープンソー...

MySQLの累積集計原理と使用例の分析

この記事では、例を使用して、MySQL 累積集計の原理と使用方法を説明します。ご参考までに、詳細は以...

スワイパープラグインを使用して Vue でカルーセルを実装する例

目次vue - スワイパープラグインを使用してカルーセルを実装するカルーセルのバグを解決するには、w...

レスポンシブ原則のソースコード分析のVue解釈

目次初期化初期化状態()初期化プロパティ()初期化データ()観察する()オブザーバーリアクティブを定...

Docker Compose のインストールと使用手順

目次1. Docker Compose とは何ですか? 2. Docker Composeのインスト...

ChromeはCookieの変更を監視し、値を割り当てます

次のコードは、Chrome による Cookie の変更の監視を導入しています。コードは次のとおりで...

JavaScript 配列の Reduce() メソッドの構文と例の分析

序文Reduce() メソッドは関数を累積器として受け取り、配列内の各値 (左から右へ) が単一の値...

vue の webpack -v エラー解決の概要

XiaobaiはVueについて学び、次にwebpackについて学び、そしてさまざまなものをインストー...