2

負荷分散された環境に 2 つの Web サーバーがあり、両方の Web サーバーの Tomcat サーバーに 2 つの Web アプリケーションがデプロイされています。これら 2 つの Web アプリケーションへのアクセスには、2 つの異なるドメイン名が使用されます。

両方の Web アプリの両方の Web サーバーで何かを個別にリロードする必要がある状況に遭遇しました。そのため、各 Web サーバーと各 Web アプリケーションに http 要求を送信してリロードする必要があります (基本的に、ロード バランサーをバイパスしたい)。

特定のドメイン名の実行時に特定の Web サーバーにリクエストを送信できるように、HTTP ヘッダーを追加する方法はありますか? または、これを達成する他の方法はありますか?

注: この HTTP 要求は、いずれかの Web サーバーにデプロイされた Java コードから送信できます。したがって、基本的には、ローカル ネットワーク内の Web サーバー間の通信と見なすことができます。

4

2 に答える 2

0

IMOこの質問は奇妙です。
ロード バランサーがある場合、つまり、同じアプリケーションを展開し、一貫性が必要な 2 つのバックエンド サーバー間で負荷を分散することを意味します。つまり、両方の部分にまったく同じデータベースが必要です (同じクライアントが 1 つのサーバーから提供される可能性があるため)。ロードバランサーの設定にもよりますが、次のリクエストでいずれかの接続で)。
したがって、この場合、特定の解釈を持つ特定の要求を送信すると、両方の部分同期し、データベースが本質的にミラーリングされるため、どのサーバーがそれを受信して​​も問題ありません。他のサーバーも、データがミラーリングされているため、この要求が送信されたことを理解する必要があります。
つまり、データベースで特定の更新を行い、データベースの更新が他のサーバーでも表示されるとすぐにサーバーをリロードします。
ロードバランサーを使用していないか、適切に使用していない限り...

そして、ロードバランサーをバイパスする方法についての質問に答えてください。ロード バランサーを使用する場合、ロード バランサーを「指す」仮想 IP または特定のドメイン名を使用すると、ロード バランサーは利用可能なサーバーにリダイレクトします。そのため、ロード バランサーの IP の代わりにサーバーの IP を直接使用すると、ロード バランサーをバイパスできます。

于 2012-10-26T20:06:58.033 に答える
0

これが私が試みる解決策です。小さな概念実証でうまくいったようで、実際のアプリケーションで試してみます。

解決:

  1. URL は、Web サーバーの IP アドレスまたはサーバー ホスト名である必要があります。
    例: http:///

  2. HTTP リクエストの場合、「Host」ヘッダーを、アクセスする実際のドメイン名として設定します。私の場合、Tomcat にデプロイしたのは 2 番目の webapp (test.myapp2.com) です。

  3. HTTP 要求を送信します。

最初に、Firefox で「Poster」アドオンを試したときに機能しましたが、私の Java コードでは機能しませんでした。エラーも表示されませんでした。私が設定した「Host」ヘッダーを単に無視しました。Java ライブラリは、一部の Request ヘッダー値のオーバーライドを制限しており、"Host" はその 1 つです。したがって、制限付きヘッダーを受け入れるように明示的に設定する必要がありました。

私が持っていた最初のコードは次のとおりです。

URL url = new URL("http://<IP-ADDRESS>/");
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setRequestProperty("Host", "test.myapp2.com");
BufferedReader rd = new BufferedReader(new InputStreamReader(connection.getInputStream()));

新しい修正:

String allowRestrictedHeader = System.getProperty("sun.net.http.allowRestrictedHeaders");
System.setProperty("sun.net.http.allowRestrictedHeaders", "true");
try {
    URL url = new URL("http://<IP-ADDRESS>/");
    HttpURLConnection connection = (HttpURLConnection) url.openConnection();
    connection.setRequestProperty("Host", "test.myapp2.com");
    // use connection
    .
    .
    .
}
finally {
    if (allowRestrictedHeader == null) {
        System.clearProperty("sun.net.http.allowRestrictedHeaders");
    } else {
        System.setProperty("sun.net.http.allowRestrictedHeaders",
                allowRestrictedHeader);
    }
}
于 2012-10-29T20:06:19.000 に答える