SpringBoot同时监听多个端口的完整方法

 更新时间:2025年11月06日 09:09:03   作者:SimonKing  
这篇文章主要为大家详细介绍了SpringBoot同时监听多个端口的相关方法,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下

01 引言

平时开发中常见的是一个Tomcat一个端口被访问。从来没有考虑过一个接口可以通过多个端口同时访问。

直到前两天看到一个帖子说,SpringBoot同时监听多个端口。于是自己玩了一下,感觉蛮有意思的,就整理一下分享给大家。

02 场景假设

假设有一套系统运行平稳,得到合作商的青睐,想要有一套一模一样的系统。领导要求重新部署一套,但是为了节省经费,领导不提供多余的服务器,希望能够在原来的服务器的基础上技能让自己用,也能让合作商使用。

# 自己使用
curl http://localhost:8081/a/api/foo

# 合作商使用
curl http://localhost:8082/b/api/foo

这样的情况下,聪明的你想到了同一个Tomcat开放两个端口,一个给自己用,一个给合作商用。

03 问题解决

3.1 开发多接口

我们先不管端口的分配,我们先看看能不能开方多个接口。当然可以。

我们需要配置org.springframework.boot.web.servlet.server.ServletWebServerFactoryl类:

@Bean
public ServletWebServerFactory servletContainer() {
    TomcatServletWebServerFactory factory = new TomcatServletWebServerFactory();
    Connector aConnector = new Connector(TomcatServletWebServerFactory.DEFAULT_PROTOCOL);
    aConnector.setPort(8081);
    factory.addAdditionalTomcatConnectors(aConnector);

    Connector bConnector = new Connector(TomcatServletWebServerFactory.DEFAULT_PROTOCOL);
    bConnector.setPort(8082);
    factory.addAdditionalTomcatConnectors(bConnector);
    return factory;
}

这里开放了80818082两个接口。这两个接口不影响默认端口,加上默认端口8080总共有3个端口可以同时访问。

Java测试

@Slf4j
@RestController
@RequestMapping("/api")
public class FooController {

    @GetMapping("/foo")
    public String foo() {
        return "foo";
    }
}
# 可以访问的路径
curl http://localhost:8080/api/foo
curl http://localhost:8081/api/foo
curl http://localhost:8082/api/foo

上面的三种方式都可以访问。这就实现了一个接口三个端口都可以访问的效果。

3.2 端口分配

为了实现不同接口的资源隔离。我们将代码复制了一份,为了方便演示,修改了一点提示语。

假设FooController控制层给自己用,使用8081端口,并加前缀a。而FooV2Controller给合作商用,使用8082端口,并加前缀b

我们将在不改变控制层代码的情况下,通过配置的方式完成资源的隔离。通过拦截器使用端口路由拦截。

public class MultiPortIntercpetor implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        int localPort = request.getLocalPort();
        String requestURI = request.getRequestURI();
        if (localPort == 8081 && requestURI.startsWith("/a")) {
            return true;
        }
        if (localPort == 8082 && requestURI.startsWith("/b")) {
            return true;
        }

        Map<String, Object>  map = new HashMap<>();
        map.put("code", 404);
        map.put("success", false);
        map.put("message", "请求错误");
        response.setContentType("application/json;charset=UTF-8");
        response.getWriter().write(JSON.toJSONString(map));
        return false;
    }
}

拦截器的配置:

@Override
public void addInterceptors(InterceptorRegistry registry) {
    registry.addInterceptor(new MultiPortIntercpetor()).addPathPatterns("/**");
}

3.3 配置前缀

前两天刚好介绍了configurePathMatch配置方法,那我们就用起来。

@Override
public void configurePathMatch(PathMatchConfigurer configurer) {
    configurer.addPathPrefix("/a", clazz -> clazz.equals(FooController.class));
    configurer.addPathPrefix("/b", clazz -> clazz.equals(FooV2Controller.class));
}

这里的配置直接使用控制层的类,也可以通过自定义的注解获取比对。

3.4 测试

04 小结

这是一个有意思的技术点。真实场景一般不会通过一个Tomcat控制两套系统。而多端口真正的使用场景,小编暂时还想不到。大家都会用在什么地方,一起唠唠!

到此这篇关于SpringBoot同时监听多个端口的完整方法的文章就介绍到这了,更多相关SpringBoot监听端口内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java设计模式之策略模式深入刨析

    Java设计模式之策略模式深入刨析

    策略模式属于Java 23种设计模式中行为模式之一,该模式定义了一系列算法,并将每个算法封装起来,使它们可以相互替换,且算法的变化不会影响使用算法的客户。本文将通过示例详细讲解这一模式,需要的可以参考一下
    2022-05-05
  • Java开发深入分析讲解二叉树的递归和非递归遍历方法

    Java开发深入分析讲解二叉树的递归和非递归遍历方法

    树是一种重要的非线性数据结构,直观地看,它是数据元素(在树中称为结点)按分支关系组织起来的结构,很象自然界中的树那样。树结构在客观世界中广泛存在,如人类社会的族谱和各种社会组织机构都可用树形象表示,本篇介绍二叉树的递归与非递归遍历的方法
    2022-05-05
  • SpringMVC接收前台传递过来的值的实例

    SpringMVC接收前台传递过来的值的实例

    下面小编就为大家分享一篇SpringMVC接收前台传递过来的值的实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-03-03
  • 如何理解Java线程池及其使用方法

    如何理解Java线程池及其使用方法

    线程池是首先创建一些线程,它们的集合称为线程池。使用线程池可以提高性能,它在系统启动时创建大量空闲的线程,程序将一个任务传给线程池,它就会启动一条线程来执行这个任务,执行结束以后,该线程并不会死亡,而是再次返回线程池中成为空闲状态,等待执行下一个任务
    2021-06-06
  • Java中常用文本加解密工具类总结

    Java中常用文本加解密工具类总结

    这篇文章主要为大家详细介绍了Java中常用的几种文本加解密工具类,包括AES对称加密、RSA非对称加密、哈希算法加密和Base64编解码,需要的可以参考下
    2024-11-11
  • java编程中自动拆箱与自动装箱详解

    java编程中自动拆箱与自动装箱详解

    这篇文章主要介绍了java编程中自动拆箱与自动装箱详解,具有一定参考价值,需要的朋友可以了解下。
    2017-11-11
  • java 中断线程的几种方式 interrupt()详解

    java 中断线程的几种方式 interrupt()详解

    中断(Interrupt)一个线程意味着在该线程完成任务之前停止其正在进行的一切,有效地中止其当前的操作。这篇文章主要介绍了java 中断线程的几种方式 interrupt(),需要的朋友可以参考下
    2021-11-11
  • springboot设置多环境配置文件

    springboot设置多环境配置文件

    本文介绍了在Spring Boot项目中配置多个环境(如dev、test、prod)的方法,可以通过创建多个`.yml`文件来实现,每个文件对应一个环境,并在`application.yml`中指定激活的配置文件,感兴趣的朋友跟随小编一起看看吧
    2025-12-12
  • 浅析我对 String、StringBuilder、StringBuffer 的理解

    浅析我对 String、StringBuilder、StringBuffer 的理解

    StringBuilder、StringBuffer 和 String 一样,都是用于存储字符串的。这篇文章谈谈小编对String、StringBuilder、StringBuffer 的理解,感兴趣的朋友跟随小编一起看看吧
    2020-05-05
  • JVM中的程序计数寄存器PC是什么详解

    JVM中的程序计数寄存器PC是什么详解

    这篇文章主要介绍了JVM中的程序计数寄存器PC原理分析,JVM中的程序计数寄存器(Program Counter Register),Register的命名源于CPU的寄存器,寄存器存储指令相关的现场信息
    2021-09-09

最新评论