web-dev-qa-db-ja.com

2つのポートでSpring Bootを構成する

Spring Bootで2つの異なるポートを使用してアプリケーションを構成しようとしていますが、まだ利用できません。私の最初の近似は2つのコントローラーであり、container.setPort(8080)で2つのコントローラー内に@Beanを定義しました。そして、2つ目の近似として、アクチュエータの依存関係を追加して管理のポートを変更しましたが、アプリケーションが実行されません。 「すでに使用されているアドレス:bind」、2つのポートを持つアプリケーションを構成するにはどうすればよいですか?管理用に1つのポートが必要で、他のポートは私のAPIの相談用です。

14
nole

前述のように、server.portおよびmanagement.portとともにmanagement.context-pathプロパティを設定して、埋め込みコンテナーが異なるポートでリッスンするようにすることができます(Actuatorエンドポイント)。

server.portおよびmanagement.port以外のポートでリッスンするには:

@Configuration
public class EmbeddedTomcatConfiguration {

    @Value("${server.additionalPorts}")
    private String additionalPorts;

    @Bean
    public EmbeddedServletContainerFactory servletContainer() {
        TomcatEmbeddedServletContainerFactory Tomcat = new TomcatEmbeddedServletContainerFactory();
        Connector[] additionalConnectors = this.additionalConnector();
        if (additionalConnectors != null && additionalConnectors.length > 0) {
            Tomcat.addAdditionalTomcatConnectors(additionalConnectors);
        }
        return Tomcat;
    }

    private Connector[] additionalConnector() {
        if (StringUtils.isBlank(this.additionalPorts)) {
            return null;
        }
        String[] ports = this.additionalPorts.split(",");
        List<Connector> result = new ArrayList<>();
        for (String port : ports) {
            Connector connector = new Connector("org.Apache.coyote.http11.Http11NioProtocol");
            connector.setScheme("http");
            connector.setPort(Integer.valueOf(port));
            result.add(connector);
        }
        return result.toArray(new Connector[] {});
    }
}

application.yml

server:
  port: ${appPort:8800}
  additionalPorts: 8881,8882

Application.Java

@SpringBootApplication
@ComponentScan(...)
@Import(EmbeddedTomcatConfiguration.class)
public Application {

    public static void main(String[] args) {
        SpringApplication.run(Application .class, args);
    }
}

私は最近このトピックについて http://tech.asimio.net/2016/12/15/Configuring-Tomcat-to-Listen-on-Multiple-ports-using-Spring-Boot.html でブログを書いています=

24
ootero

Springboot 2以降、 ootero solution で言及されているEmbeddedServletContainerFactoryは使用できなくなったため、状況に応じてTomcatServletWebServerFactoryまたはTomcatReactiveWebServerFactoryを使用する必要があります。

解決策は、工場出荷時以外は同じままです。

@Bean
public TomcatServletWebServerFactory servletContainer() {
    TomcatServletWebServerFactory Tomcat = new TomcatServletWebServerFactory();
    Connector[] additionalConnectors = this.additionalConnector();
    if (additionalConnectors != null && additionalConnectors.length > 0) {
        Tomcat.addAdditionalTomcatConnectors(additionalConnectors);
    }
    return Tomcat;
}
2
Camille Vienot

アクチュエータ管理ポートを変更するには、プロパティを使用できます

management.port=8081

プロパティの完全なリストを見る ここ

Update:この場合、アクチュエータは1つ以上の組み込みTomcat(サーブレットコンテナ)インスタンスを作成します。 here および here を参照してください

1
Dennis R

これは古い投稿であり、おそらく問題はすでに解決されていますが、とにかく読者の皆さんに私の意見を伝えたかったのです。これは間違った考え方だと思います。2つのポートを備えたアプリが本当に必要になるのはいつかわかりません。

スプリングブートは、マイクロサービスアーキテクチャで使用するために作成されます。したがって、この場合は、アプリを2つのアプリに分けて、それぞれに独自のポートを割り当てる必要があります。これはさまざまな理由から良いことですが、最も明白なのは、APIが1日あたり1.000.000のリクエストを処理でき、管理者が10しか保持できないことです。

ほとんどの場合、共有コードはたくさんありますが、jarとしてパッケージ化してプロジェクトapiとadminの両方にインポートするのは、3番目のアプリよりも多くなります。

0
mommcilo