Java Spring Boot:如何添加tomcat连接器以绑定到控制器

Java Spring Boot:如何添加tomcat连接器以绑定到控制器,java,spring,spring-boot,Java,Spring,Spring Boot,在Spring引导文档中,有一节描述了如何为tomcat()启用多个连接器 但是有没有一种方法可以简单地将连接器添加到现有的连接器(web和管理连接器)?并将它们绑定到一些mvc控制器? 我想做的是创建一些可以在不同端口上访问的web服务。您可以为每个服务使用子应用程序,通过设置其服务器.port属性,将每个子应用程序配置为使用单独的端口。要隔离的任何组件都应该放在其中一个子组件中。您想要共享的任何组件都应该放在父组件中 下面是这种方法的一个例子。有两个子应用程序,一个在端口8080上侦听,另一

在Spring引导文档中,有一节描述了如何为tomcat()启用多个连接器

但是有没有一种方法可以简单地将连接器添加到现有的连接器(web和管理连接器)?并将它们绑定到一些mvc控制器?
我想做的是创建一些可以在不同端口上访问的web服务。

您可以为每个服务使用子应用程序,通过设置其
服务器.port
属性,将每个子应用程序配置为使用单独的端口。要隔离的任何组件都应该放在其中一个子组件中。您想要共享的任何组件都应该放在父组件中

下面是这种方法的一个例子。有两个子应用程序,一个在端口8080上侦听,另一个在端口8081上侦听。每个包含一个控制器,分别映射到
/one
/two

package.com.example;
导入org.springframework.boot.autoconfigure.EnableAutoConfiguration;
导入org.springframework.boot.builder.SpringApplicationBuilder;
导入org.springframework.context.annotation.Bean;
导入org.springframework.context.annotation.Configuration;
导入org.springframework.web.bind.annotation.RequestMapping;
导入org.springframework.web.bind.annotation.ResponseBody;
公共类应用程序{
公共静态void main(字符串[]args){
SpringApplicationBuilderParentBuilder
=新的SpringApplicationBuilder(ApplicationConfiguration.class);
parentBuilder.child(ServiceOneConfiguration.class)
.properties(“server.port:8080”).run(args);
parentBuilder.child(ServiceTwoConfiguration.class)
.properties(“server.port:8081”).run(args);
}
@配置
静态类应用程序配置{
@豆子
public MySharedService sharedService(){
返回新的MySharedService();
}   
}
@配置
@启用自动配置
静态类ServiceOneConfiguration{
@豆子
公共控制器控制器(MySharedService服务){
返回新控制员(服务);
}
}
@配置
@启用自动配置
静态类ServiceTwoConfiguration{
@豆子
公共控制器两个控制器(MySharedService服务){
返回新控制器2(服务);
}
}
@请求映射(“/one”)
静态类控制器{
私人最终MySharedService服务;
公共控制器(MySharedService){
服务=服务;
}
@请求映射
@应答器
公共字符串getMessage(){
返回“ControllerOne says\”“+this.service.getMessage()+”\”;
}
}
@请求映射(“/two”)
静态类控制器二{
私人最终MySharedService服务;
公共控制器2(MySharedService服务){
服务=服务;
}
@请求映射
@应答器
公共字符串getMessage(){
返回“ControllerTwo says\”“+this.service.getMessage()+”\”;
}
}
静态类MySharedService{
公共字符串getMessage(){
回复“你好”;
}
}
}

服务器.端口
管理.端口
管理.上下文路径
属性(访问
执行器
端点的最后两个)可以设置为使嵌入式容器侦听不同的端口

如果希望侦听的端口不是
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.java

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

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

在中,我介绍了如何使嵌入式Tomcat在不同的端口上侦听,并将
JavaMelody
配置为通过该新端口以独占方式访问它。

是否要使所有web服务在多个端口上可用(例如8080和8081上的服务a和服务B),或者您想在某些端口上提供某些服务(例如8080上的服务A和8081上的服务B)?端口8080上的服务A和端口8081上的服务B,等等…如果我想让用户在属性文件中设置两个API的端口,并使它们都特定于配置文件,该怎么办?在本例中,我认为需要使用两个名称不同的属性,如
api1.server.port
api2.server.port
。使用标准spring boot的环境和配置文件处理,可以轻松配置这些配置文件。但是我如何才能将这些属性作为
server.port
属性传递给每个子上下文?@ruslantelmachenko听起来您想要做的是将父级中的一个属性映射到子级中的另一个属性。我认为这需要一个单独的问题,以便能够正确地回答,而不是在评论中迷失方向。不完全是这样。我只想知道实现它的任何方法:允许用户设置特定于子级的属性,但保留使用外部
application.properties
application.yml
文件执行此操作的能力,在配置文件等的支持下,将chilld1的api1.server.port映射到
server.port
的方法就是一个例子。这可以是另一种方法。e、 g.使每个上下文的基本属性文件名不同:
application.yml
+
child1.yml
+
child2.yml
(支持特定于配置文件的后缀)。我只想知道任何工作方法。我将试着问新的问题这里是我的新问题:保存了我的一天:)这些额外的端口不只是镜像基本端口而不是服务于不同的端点吗?如果是,那么我看不出有任何理由这样做。不同的端口通常需要为不同的内容(控制器)提供服务,可能具有不同的授权、日志记录等。我认为Spring Boot通过管理端口为执行器端点提供支持,管理端口可以
@SpringBootApplication
@ComponentScan(...)
@Import(EmbeddedTomcatConfiguration.class)
public Application {

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