source

2개의 포트를 사용하여 스프링 부트를 설정하다

gigabyte 2023. 3. 15. 19:41
반응형

2개의 포트를 사용하여 스프링 부트를 설정하다

2개의 다른 포트를 사용하여 Spring Boot에서 애플리케이션을 설정하려고 하는데 아직 설정되지 않았습니다.첫 번째 접근은 2개의 컨트롤러에서 이루어졌으며 컨테이너가 있는 2개의 컨트롤러 내에 @Bean을 정의했습니다.setPort(8080);또, 액튜에이터의 의존 관계를 추가해, 관리 포토를 변경했습니다만, 애플리케이션이 실행되지 않습니다."Address in address: bind", 응용 프로그램에 2개의 포트를 설정하려면 어떻게 해야 합니까?한쪽 포트는 admin용이고 다른 한쪽 포트는 my api 컨설트용입니다.

아까도 말씀드렸듯이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

어플.자바

@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에 블로그를 올렸습니다.

스프링부트 2부터EmbeddedServletContainerFactoryotero 솔루션에서 언급된 것은 더 이상 사용할 수 없으므로, 다음 중 하나를 사용해야 합니다.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;
}

액추에이터 관리 포트를 변경하려면 속성을 사용할 수 있습니다.

management.port=8081

여기서 전체 속성 목록 보기

업데이트: 이 경우 액추에이터는 Embedded Tomcat(서블릿 컨테이너) 인스턴스를 하나 더 만듭니다.이쪽과 이쪽을 봐 주세요.

단일 프로젝트 내에서 둘 이상의 응용 프로그램을 실행하거나 기본 포트를 변경하려면 다음과 같은 작업을 수행합니다.

@SpringBootApplication
public class NewApplication {
     public static void main(String[] args) {
         SpringApplication app = new SpringApplication(NewApplication .class);
         app.setDefaultProperties(Collections.singletonMap("server.port", "8083"));
         app.run(args);
     }
}

추가 포트를 1개만 여는 경우 다음 것으로 충분합니다(Kotlin).

@Configuration
class AdditionalEndpointConfig {

    @Bean
    @ConditionalOnProperty(PORT_PROPERTY)
    fun tomcatServletWebServerFactory(@Value("\${$PORT_PROPERTY}") additionalPort: Int) =
        TomcatServletWebServerFactory().apply {
            addAdditionalTomcatConnectors(
                Connector("org.apache.coyote.http11.Http11NioProtocol").apply {
                    scheme = "http"
                    port = additionalPort
                })
        }

    companion object {
        const val PORT_PROPERTY = "server.additional.port"
    }
}

언급URL : https://stackoverflow.com/questions/36357135/configure-spring-boot-with-two-ports

반응형