2

私のアーキテクチャでは、Spring を Web サーバーとして使用し、静的な html および javascript ページを提供し、残りの API として使用しています。現在、Spring アプリはポート 8080 でリッスンしています。ポート 80 に簡単に変更できますが、API と Web サーバーは別のポートに配置する必要があり、静的コンテンツを提供するためだけに別のアプリを作成する理由はないと思います。どの春が簡単にできるか。

私はオンラインでいくつかの他の質問を調べましたが、Spring は複数のサーブレット コンテナーを使用して 2 つの異なるポートでリッスンできることがわかりました。複数のアプリケーション コンテキストを作成するだけでよいという質問さえありました。

ただし、特にSpring Bootを使用する場合、少なくとも私にとっては簡単ではありません。

  1. 複数のポート (80 および 8080) でリッスンするために、複数のサーブレット コンテナーまたは複数のアプリケーション コンテキストを作成するにはどうすればよいですか?
  2. それらを設定した後、どのサーブレットが何をするかを制御するにはどうすればよいですか? つまり、どちらが静的ページを提供し、どれが残りの API を提供するのでしょうか?

-

編集

次の質問は私自身のものと一致しているようですが、前述のように、特に xml 構成ではなく Spring Boot/Annotations を使用する場合、これを実装する方法がわかりません。

スプリング ブートで複数のサーブレット コンテナ/サーブレットを構成する

編集 (2)

そのようなことの良い使用例は、サイトを SSL 対応にすることですが、必須ではありません。つまり、potr 443 経由で ssl を有効にしながら、ユーザーがポート 80 経由で安全でないアクセスを使用できるようにする必要があります。

編集 (3)

Dave Syer の回答が最適かどうかはわかりませんが、うまくいくようです。彼の方法とは異なり、私はサーブレット コンテナー カスタマイザーを使用してポートを変更していますが、それでも 2 番目のスレッドを使用して 2 番目のスプリング アプリケーションを作成していることに注意してください。

編集(回答)

Dave Syer の元の回答は機能していますが、私が探していたものではありませんでした。彼のコメントの 1 つに記載されているように、Tomcat サーブレット コンテナー (Spring のデフォルト)、または jetty の Handler を使用している場合、答えは 2 番目の Connector オブジェクトを作成することです。

私は次のようなものを使用しました:

public class App implements EmbeddedServletContainerCustomizer {
  public void customize(ConfigurableEmbeddedServletContainer container) {
    TomcatEmbeddedServletContainerFactory tombat = (TomcatEmbeddedServletContainerFactory)container;

    tomcat.addAditinoalTomcatConnectors(...);
  }
}
4

1 に答える 1

0

なぜこれを行う必要があるのか​​はまだわかりませんが (単一のコンテナーを実行するだけの利点は何ですか?)、 を使用して2つのサーバーを簡単に実行できますSpringApplication。バックグラウンド スレッドを使用した例:

new Thread(new Runnable() { public void run() {
    SpringApplication.run(StaticServer.class, "--server.port=${static.port:8081}");
}}).start();
SpringApplication.run(ApiServer.class, args);
于 2014-12-23T07:02:19.650 に答える