web-dev-qa-db-fra.com

Configurer Spring Boot avec deux ports

J'essaie de configurer une application dans Spring Boot avec deux ports différents, mais je ne l'ai pas encore. Ma première aproximation a été avec deux contrôleurs et j'ai défini un @Bean à l'intérieur des deux contrôleurs avec container.setPort (8080); Et ma deuxième approximation a été d'ajouter la dépendance de l'actionneur et de changer le port de la gestion, mais mon application ne fonctionne pas. "Adresse déjà utilisée: bind", Comment configurer une application avec deux ports? Je veux un port pour l'administrateur et l'autre port est pour les consultations de mon api.

14
nole

Comme cela a été mentionné précédemment, server.port et management.port de même que management.context-path Les propriétés peuvent être définies pour que le conteneur intégré écoute sur différents ports (propriétés liées à la gestion pour accéder aux points de terminaison Actuator).

Pour écouter sur des ports autres que server.port et 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);
    }
}

J'ai récemment blogué sur ce sujet à http://tech.asimio.net/2016/12/15/Configuring-Tomcat-to-Listen-on-Multiple-ports-using-Spring-Boot.html =

24
ootero

Depuis springboot 2, EmbeddedServletContainerFactory mentionné dans solution ootero n'est plus disponible, vous devez donc utiliser TomcatServletWebServerFactory ou TomcatReactiveWebServerFactory selon votre contexte.

La solution reste la même en dehors de l'injection d'usine:

@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

Pour modifier le port de gestion de l'actionneur, vous pouvez utiliser la propriété

management.port=8081

Voir la liste complète des propriétés ici

Mise à jour: L'actuateur crée une autre instance Embedded Tomcat (conteneur de servlet) dans ce cas. Voir ici et ici

1
Dennis R

C'est un ancien article et le problème est probablement déjà résolu, mais je voulais quand même dire mon avis pour d'autres lecteurs. Je pense que c'est une mauvaise façon de penser et je ne vois pas vraiment quand vous aurez besoin d'une application avec deux ports.

Spring Boot est créé pour être utilisé dans l'architecture de microservices. Donc, dans ce cas, vous devez séparer votre application en 2 applications, où chacune aura son propre port. C'est bon pour différentes raisons, une des plus évidentes est que votre API peut avoir 1.000.000 de demandes par jour et 10 administrateurs seulement.

Très probablement, vous avez beaucoup de code partagé, mais ce sera la troisième application que vous devrez empaqueter en tant que jar et l'importer dans les deux projets api et admin.

0
mommcilo