0


在Spring Boot中实现单应用多端口监听以部署多应用

引言

在软件开发过程中,有时会遇到一个特殊的需求:在单个Spring Boot应用中监听多个端口,以便提供不同服务的访问入口。虽然传统的做法是将每个服务单独部署为一个独立的应用,但在某些场景下,如微服务架构中的某些聚合服务,或者出于简化部署和维护成本的考虑,我们可能需要将多个服务整合到一个Spring Boot应用中。本文将探讨如何在Spring Boot中实现单应用多端口监听,并给出相应的解决方案。

背景与挑战

Spring Boot是一个流行的Java框架,它提供了自动配置、快速开发、便捷部署等一系列特性。然而,Spring Boot默认只支持一个HTTP和一个HTTPS端口的配置。当我们需要在一个Spring Boot应用中监听多个端口时,就需要采取一些特殊的手段。

解决方案

1. 常规的解决方案

Spring Boot默认使用Tomcat、Jetty或Undertow作为嵌入式Servlet容器。这些容器都支持配置多个Connector(连接器),每个Connector可以监听不同的端口。我们可以通过编程方式配置这些Connector,以实现多端口监听。示例代码(以Tomcat为例):

@Bean
public ServletWebServerFactory servletContainer() {
    TomcatServletWebServerFactory factory = new TomcatServletWebServerFactory();
    
    // 配置主端口8080
    factory.setPort(8080);
    
    // 添加额外的Connector监听8081端口
    Connector additionalConnector = new Connector("org.apache.coyote.http11.Http11NioProtocol");
    additionalConnector.setScheme("http");
    additionalConnector.setPort(8081);
    factory.addAdditionalTomcatConnectors(additionalConnector);
    
    // 以此类推,可以添加更多Connector监听不同端口
    
    return factory;
}

除了配置多个Connector外,我们还可以为每个端口配置不同的

DispatcherServlet

。这样,不同的端口可以处理不同的请求映射和控制器。示例代码:

@Configuration
public class MultiPortConfig {

    @Bean(name = "dispatcherServlet8080")
    public ServletRegistrationBean<DispatcherServlet> dispatcherServlet8080() {
        DispatcherServlet dispatcherServlet = new DispatcherServlet();
        AnnotationConfigWebApplicationContext context = new AnnotationConfigWebApplicationContext();
        context.register(WebConfig8080.class); // 注册8080端口的配置类
        dispatcherServlet.setApplicationContext(context);

        ServletRegistrationBean<DispatcherServlet> registrationBean = new ServletRegistrationBean<>(dispatcherServlet, "/8080/*");
        registrationBean.setName("dispatcherServlet8080");
        registrationBean.setLoadOnStartup(1);
        return registrationBean;
    }

    // 同理,可以为8081、8082等端口配置类似的ServletRegistrationBean

    // 配置类WebConfig8080等需要定义各自的请求映射和控制器
}

除了

DispatcherServlet

外,我们还可以为每个端口创建不同的应用上下文(

ApplicationContext

)。这样,每个端口可以有自己独立的Bean定义和配置。示例代码:

@Configuration
@ComponentScan(basePackages = "com.example.app8080") // 扫描8080端口的Bean定义
public class WebConfig8080 {
    // ... 8080端口的配置和Bean定义 ...
}

// 为8081、8082等端口创建类似的配置类

// 在ServletRegistrationBean中指定使用不同的应用上下文

注意:

  • 在多端口监听时,需要确保不同端口之间的服务互不干扰,避免端口冲突和资源竞争。
  • 对于安全性要求较高的服务,建议将敏感服务单独部署为独立的应用,并采取相应的安全措施。
  • 在配置多端口监听时,需要仔细考虑性能、可维护性和扩展性等方面的因素。

结论

通过上述方法,我们可以在Spring Boot应用中实现多端口监听,从而部署多个服务。然而,这种方法并非没有代价,它可能会增加应用的复杂性和维护成本。因此,在选择是否使用多端口监听时,需要根据具体需求和项目特点进行权衡。在大多数情况下,将每个服务单独部署为独立的应用仍然是一个更好的选择。

2. 全新的解决方案

本文将以Maven构建工具和Spring Boot框架为基础,详细阐述(或说明)相关的技术实现或概念。

  • 构建Maven多模块项目,构建过程略,结构如下:
    目录结构说明demomaven构建的多模块admin主应用adminsrc../javaAdminApplication.java../resourcesapplication.yml主应用8080pom.xmlgit从应用gitsrc../javaGitApplication.java../resourcesapplication-git.yml配置端口8081pom.xmlsealos从应用sealossrc../javaSealosApplication.java../resourcesapplication-sealos.yml配置端口8082pom.xmlpom.xml
    AdminApplication.java
package com.xxx;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

import com.xxx.git.GitApplication;
import com.xxx.sealos.SealosApplication;

/**
 * 主
 */
@SpringBootApplication
public class AdminApplication
{
    public static void main(String[] args)
    {
        // 主应用 8080 
        new SpringApplication(AdminApplication.class).run(args);

        // 从应用git应用 8081
        SpringApplication git = new SpringApplication(GitApplication.class);
        git.setAdditionalProfiles("git");
        git.run(args);

        // 从应用Sealos应用 8082
        SpringApplication sealos = new SpringApplication(SealosApplication.class);
        sealos.setAdditionalProfiles("sealos");
        sealos.run(args);
    }

}

application.yml

# 主服务
server:
  port: 8080

# Spring配置
spring:
  application:
   admin:
      # 必须重新命名
      jmx-name: org.springframework.boot:type=Admin,name=AdminApplication

GitApplication.java

package com.xxx.git;

import org.springframework.boot.autoconfigure.SpringBootApplication;

/**
 * git 应用代理
 */
@SpringBootApplication
public class GitApplication
{
}

application-git.yml

# 服务
server:
  port: 8081

# Spring配置
spring:
  application:
   admin:
      jmx-name: org.springframework.boot:type=Admin,name=GitApplication

SealosApplication.java

package com.xxx.sealos;

import org.springframework.boot.autoconfigure.SpringBootApplication;

/**
 * Sealos
 */
@SpringBootApplication
public class SealosApplication
{
}

application-sealos.yml

# 服务
server:
  port: 8082

# Spring配置
spring:
  application:
   admin:
      jmx-name: org.springframework.boot:type=Admin,name=SealosApplication

在结束之前,特别强调一点:关于

jmx-name

的命名必须进行重新调整。这是至关重要的步骤,因为如果不进行重命名,将会导致潜在的命名冲突,进而影响到系统的正常运行。通过重新命名

jmx-name

,我们可以确保每个应用都能够独立、顺畅地运行,为大家的操作提供极大的便利性和稳定性。请务必注意并执行此步骤。

标签: spring boot java 后端

本文转载自: https://blog.csdn.net/ouzengqi2010/article/details/140461711
版权归原作者 310_辰丨紫天 所有, 如有侵权,请联系我们删除。

“在Spring Boot中实现单应用多端口监听以部署多应用”的评论:

还没有评论