복붙노트

[SPRING] Spring-Boot : tomcat 커넥터를 추가하여 컨트롤러에 바인딩하는 방법

SPRING

Spring-Boot : tomcat 커넥터를 추가하여 컨트롤러에 바인딩하는 방법

Spring-Boot 문서에는 tomcat 용 다중 커넥터를 활성화하는 방법을 설명하는 절이 있습니다 (http://docs.spring.io/spring-boot/docs/1.1.7.RELEASE/reference/htmlsingle/#howto- enable-multiple-connectors-in-tomcat).

그러나 단순히 기존 커넥터 (웹 및 관리 커넥터)에 커넥터를 추가하는 방법이 있습니까? 그리고 일부 mvc 컨트롤러에 바인딩 할? 내가 원하는 것은 다른 포트에서 액세스 할 수있는 웹 서비스를 만드는 것입니다.

해결법

  1. ==============================

    1.각 서비스에 대해 자식 응용 프로그램을 사용할 수 있으며 각 자식은 server.port 속성을 설정하여 별도의 포트를 사용하도록 구성됩니다. 격리하려는 모든 구성 요소는 하위 중 하나에 있어야합니다. 공유하려는 구성 요소는 모두 상위 항목에 있어야합니다.

    각 서비스에 대해 자식 응용 프로그램을 사용할 수 있으며 각 자식은 server.port 속성을 설정하여 별도의 포트를 사용하도록 구성됩니다. 격리하려는 모든 구성 요소는 하위 중 하나에 있어야합니다. 공유하려는 구성 요소는 모두 상위 항목에 있어야합니다.

    다음은이 접근법의 예입니다. 두 개의 하위 응용 프로그램이 있습니다. 하나는 포트 8080에서 청취하고 다른 하나는 포트 8081에서 청취하는 응용 프로그램입니다. 각각은 / 1 및 / 2에 각각 맵핑되는 제어기를 포함합니다.

    package com.example;
    
    import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
    import org.springframework.boot.builder.SpringApplicationBuilder;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.ResponseBody;
    
    public class Application {
    
        public static void main(String[] args) {
            SpringApplicationBuilder parentBuilder 
                    = new SpringApplicationBuilder(ApplicationConfiguration.class);
            parentBuilder.child(ServiceOneConfiguration.class)
                    .properties("server.port:8080").run(args);
            parentBuilder.child(ServiceTwoConfiguration.class)
                    .properties("server.port:8081").run(args);      
        }
    
        @Configuration
        static class ApplicationConfiguration {
    
            @Bean
            public MySharedService sharedService() {
                return new MySharedService();
    
            }   
        }
    
        @Configuration
        @EnableAutoConfiguration
        static class ServiceOneConfiguration {
    
            @Bean
            public ControllerOne controller(MySharedService service) {
                return new ControllerOne(service);
            }
        }
    
        @Configuration
        @EnableAutoConfiguration
        static class ServiceTwoConfiguration {
    
            @Bean
            public ControllerTwo controller(MySharedService service) {
                return new ControllerTwo(service);
            }
        }
    
        @RequestMapping("/one")
        static class ControllerOne {
    
            private final MySharedService service;
    
            public ControllerOne(MySharedService service) {
                this.service = service;
            }
    
            @RequestMapping
            @ResponseBody
            public String getMessage() {
                return "ControllerOne says \"" + this.service.getMessage() + "\"";
            }
        }
    
        @RequestMapping("/two")
        static class ControllerTwo {
    
            private final MySharedService service;
    
            public ControllerTwo(MySharedService service) {
                this.service = service;
            }
    
            @RequestMapping
            @ResponseBody
            public String getMessage() {
                return "ControllerTwo says \"" + this.service.getMessage() + "\"";
            }
        }
    
       static class MySharedService {
    
            public String getMessage() {
                return "Hello";
            }
        }
    }
    
  2. ==============================

    2.server.port, management.port 및 management.context-path 속성 (액추에이터 끝점에 액세스하는 마지막 두 개)은 포함 된 컨테이너가 다른 포트에서 수신 대기하도록 설정할 수 있습니다.

    server.port, management.port 및 management.context-path 속성 (액추에이터 끝점에 액세스하는 마지막 두 개)은 포함 된 컨테이너가 다른 포트에서 수신 대기하도록 설정할 수 있습니다.

    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에서 임베디드 Tomcat을 다른 JavaMelody를 독점적으로 새로운 포트를 통해 액세스하도록 구성했습니다.

  3. from https://stackoverflow.com/questions/26111050/spring-boot-how-can-i-add-tomcat-connectors-to-bind-to-controller by cc-by-sa and MIT license