SpringBoot开发——SpringBoot3.3 中实现多端口监听

文章目录

  • 1、项目环境与依赖配置
  • 2、配置多端口监听
  • 3、编写配置类实现多端口监听
  • 4、为每个端口创建独立的配置类
    • 4.1 8081 端口配置类
    • 4.2 8082 端口配置类
  • 5、控制器类定义
    • 5.1 8080 端口的控制器(保持原有配置)
    • 5.2 8081 端口的控制器
    • 5.3 8082 端口的控制器
  • 6、编写前端页面
  • 7、视图控制器实现
  • 8、启动与验证
  • 9、总结

SpringBoot3.3 中如何实现多端口监听

SpringBoot 应用中,通常情况下,我们只需要监听一个端口来处理 HTTP 请求。但在某些情况下,我们可能需要在同一个应用中监听多个端口,例如分别处理不同类型的请求,或者在同一个应用中暴露多个服务接口。本篇文章将详细讲解如何在 SpringBoot 中实现多端口监听,并结合代码示例进行深入讲解。

运行效果:
在这里插入图片描述

1、项目环境与依赖配置

首先,我们需要创建一个 SpringBoot 项目,并确保项目中包含必要的依赖。以下是 pom.xml的配置:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>3.3.3</version>
		<relativePath/> <!-- lookup parent from repository -->
	</parent>
	<groupId>com.icoderoad</groupId>
	<artifactId>multi-port-demo</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<name>multi-port-demo</name>
	<description>Demo project for Spring Boot</description>
	
	<properties>
		<java.version>17</java.version>
	</properties>
	<dependencies>
		
		<!-- Spring Boot Web Starter -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        
        <!-- Thymeleaf 依赖 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-thymeleaf</artifactId>
        </dependency>

		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
		</dependency>
	</dependencies>

	<build>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
			</plugin>
		</plugins>
	</build>

</project>

2、配置多端口监听

SpringBoot 中,通过配置 application.yml 文件可以轻松实现多端口监听。以下是配置示例:

server:
  port: 8080 # 主端口

# 额外的端口配置
additional-ports:
  - 8081
  - 8082

3、编写配置类实现多端口监听

在配置文件中指定了额外的端口后,我们需要编写一个配置类,使用 SpringEmbeddedWebServerFactoryCustomizer 来实现多端口监听。我们在 MultiPortConfig 类中为每个端口配置一个独立的 Spring 上下文

package com.icoderoad.multi_port_demo.config;

import org.apache.catalina.connector.Connector;
import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory;
import org.springframework.boot.web.servlet.server.ServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class MultiPortConfig {

    @Bean
    public ServletWebServerFactory servletWebServerFactory() {
        TomcatServletWebServerFactory factory = new TomcatServletWebServerFactory();
        factory.addAdditionalTomcatConnectors(createConnector(8081)); // Add additional port 8081
        factory.addAdditionalTomcatConnectors(createConnector(8082)); // Add additional port 8082
        return factory;
    }

    private Connector createConnector(int port) {
        Connector connector = new Connector(TomcatServletWebServerFactory.DEFAULT_PROTOCOL);
        connector.setPort(port);
        return connector;
    }
}

在这个配置类中,createAndStartContext 方法为 8081 和 8082 端口创建了独立的 Spring 上下文,每个上下文对应一个配置类(Port8081ConfigPort8082Config),这些配置类会定义对应端口下的控制器。

4、为每个端口创建独立的配置类

现在,我们为每个端口创建独立的配置类,这些配置类将会注册相应的控制器。

4.1 8081 端口配置类

package com.icoderoad.multi_port_demo.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;

import com.icoderoad.multi_port_demo.controller.Port8081Controller;

@Configuration
@EnableWebMvc
public class Port8081Config {

    @Bean
    public Port8081Controller port8081Controller() {
        return new Port8081Controller();
    }
}

4.2 8082 端口配置类

package com.icoderoad.multi_port_demo.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;

import com.icoderoad.multi_port_demo.controller.Port8082Controller;

@Configuration
@EnableWebMvc
public class Port8082Config {

    @Bean
    public Port8082Controller port8082Controller() {
        return new Port8082Controller();
    }
}

这些配置类会在相应的端口上下文中注册对应的控制器。

5、控制器类定义

定义控制器类,每个控制器类对应一个端口,之前的控制器定义无需改变:

5.1 8080 端口的控制器(保持原有配置)

package com.icoderoad.multi_port_demo.controller;

import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class Port8080Controller {

    @GetMapping("/port8080/service")
    public ResponseEntity<String>  service() {
    	
    	HttpHeaders headers = new HttpHeaders();
        headers.setContentType(org.springframework.http.MediaType.TEXT_PLAIN);
        headers.set(HttpHeaders.CONTENT_TYPE, "text/plain; charset=UTF-8");
        
        return new ResponseEntity<>("端口 8080 的服务数据", headers, HttpStatus.OK);
        
    }
}

5.2 8081 端口的控制器

package com.icoderoad.multi_port_demo.controller;

import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class Port8081Controller {

	@CrossOrigin(origins = "http://localhost:8080") // 允许的前端地址
    @GetMapping("/port8081/service")
	public ResponseEntity<String>  service() {
    	
    	HttpHeaders headers = new HttpHeaders();
        headers.setContentType(org.springframework.http.MediaType.TEXT_PLAIN);
        headers.set(HttpHeaders.CONTENT_TYPE, "text/plain; charset=UTF-8");
        
        return new ResponseEntity<>("端口 8081 的服务数据", headers, HttpStatus.OK);
        
    }
}

5.3 8082 端口的控制器

package com.icoderoad.multi_port_demo.controller;

import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class Port8082Controller {

	@CrossOrigin(origins = "http://localhost:8080") // 允许的前端地址
    @GetMapping("/port8082/service")
	public ResponseEntity<String>  service() {
    	
    	HttpHeaders headers = new HttpHeaders();
        headers.setContentType(org.springframework.http.MediaType.TEXT_PLAIN);
        headers.set(HttpHeaders.CONTENT_TYPE, "text/plain; charset=UTF-8");
        
        return new ResponseEntity<>("端口 8082 的服务数据", headers, HttpStatus.OK);
        
    }
}

6、编写前端页面

src/main/resources/templates 目录下创建一个简单的 index.html 页面,使用 ThymeleafBootstrap 进行前端展示。

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
    <title>SpringBoot 多端口监听</title>
   <link href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css" rel="stylesheet">
</head>
<body>
<div class="container">
    <h1 class="mt-5">SpringBoot 多端口监听示例</h1>
    <p class="lead">此应用监听多个端口,分别处理不同的请求。</p>
    <p>主端口:8080</p>
    <p>额外端口:8081, 8082</p>
    
    <div class="row">
        <div class="col-md-4">
            <h3>端口 8080 数据</h3>
            <p id="data-8080">加载中...</p>
        </div>
        <div class="col-md-4">
            <h3>端口 8081 数据</h3>
            <p id="data-8081">加载中...</p>
        </div>
        <div class="col-md-4">
            <h3>端口 8082 数据</h3>
            <p id="data-8082">加载中...</p>
        </div>
    </div>
</div>

<script>
    fetch('http://localhost:8080/port8080/service')
        .then(response => response.text())
        .then(data => {
            document.getElementById('data-8080').textContent = data;
        });

    fetch('http://localhost:8081/port8081/service')
        .then(response => response.text())
        .then(data => {
            document.getElementById('data-8081').textContent = data;
        });

    fetch('http://localhost:8082/port8082/service')
        .then(response => response.text())
        .then(data => {
            document.getElementById('data-8082').textContent = data;
        });
</script>
</body>
</html>

7、视图控制器实现

src/main/java/com/icoderoad/controller 目录下创建一个简单的控制器,用于处理 HTTP 请求

package com.icoderoad.multi_port_demo.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;

@Controller
public class IndexController {

    @GetMapping("/")
    public String index() {
        return "index";
    }
}

上述代码中,我们创建了一个简单的控制器类,提供了一个主页和一个返回监听端口信息的接口。

8、启动与验证

启动 SpringBoot 应用后,在浏览器中访问 http://localhost:8080http://localhost:8081http://localhost:8082,你会发现所有端口都可以正常响应请求,说明我们已经成功实现了多端口监听。

9、总结

通过本文的详细讲解,我们学习了如何在 SpringBoot中实现多端口监听。这一功能在处理不同类型的请求或暴露多个服务接口时非常有用。我们通过配置 application.yml文件和编写自定义配置类,结合前端展示,实现了这一功能。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/911628.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

大数据湖项目建设方案(100页WORD)

文档介绍&#xff1a; 随着信息技术的飞速发展&#xff0c;数据量呈现出爆炸性增长的趋势。企业、政府机构及科研单位在运营过程中积累了大量的数据资源&#xff0c;这些数据中蕴含着巨大的价值&#xff0c;但如何高效地存储、处理和分析这些数据&#xff0c;成为了一个亟待解…

【SpringBoot】SpringCloud一些常用依赖

SpringChoudAlibaba springcloud版本对应关系 可以按照hm这样写 ----以下是我自己使用过的&#xff0c;比较乱 parent <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><versi…

Webserver(5.3)线程池实现

目录 线程池locker.hthreadpool.h 线程池 相比于动态地创建子线程&#xff0c;选择一个已经存在的子线程的代价显然要小得多。至于主线程选择哪个子线程来为新任务服务&#xff0c;有多种方式&#xff1a; 主线程使用某种算法来主动选择子线程。最简单、最常用的算法是随机算…

解决:使用EasyExcel导入Excel模板时出现数据导入不进去的问题

解决&#xff1a;使用EasyExcel导入Excel模板时出现数据导入不进去的问题 在Java中&#xff0c;当我们用EasyExcel导入Excel时&#xff0c;可能会出现数据导入不进去的问题。例如&#xff1a; 这种异常等。 问题原因1&#xff1a;这个1代表从第几行开始&#xff0c;你的exce…

可视化建模与UML《类图实验报告》

史铁生&#xff1a; 余华和莫言扛着我上火车&#xff0c; 推着走打雪仗&#xff0c; 还带我偷西瓜&#xff0c; 被人发现后他们拔腿就跑&#xff0c; 却忘了我还在西瓜地里。 一、实验目的&#xff1a; 1、熟悉类图的构件事物。 2、熟悉类之间的泛化、依赖、聚合和组合关系…

python(自用查看版)

目录 1.注意事项 1.1 python的除法不是整除&#xff0c;得到的是浮点数 1.2算术符号基于数学的算术优先级。具体可自行查看。 1.3注释 1.4缩进 1.5换行 1.6常见关键字 1.7续行符 1.8报错 1.9赋值 1.10比较运算符 2.常量和表达式 3.变量 4.数据类型 4.1整型int …

TMDOG的Gin学习笔记_02——Gin集成支付宝支付沙箱环境

TMDOG的Gin学习笔记_02——Gin集成支付宝支付沙箱环境 博客地址&#xff1a;TMDOG的博客 作者自述&#xff1a; 最近忙着整理自己的项目代码&#xff0c;终于有时间更新一下博客。这次的内容是关于如何在Gin框架下集成支付宝的支付沙箱环境&#xff0c;具体包括如何初始化支付…

cmake could not find a package configuration file provided by “Microsoft.GSL“

通过查找 dir C:\vcpkg\installed\x64-windows /s /b | findstr Microsoft.GSL vspkg安装 git clone https://github.com/microsoft/vcpkg.git cd vcpkg .\bootstrap-vcpkg.bat .\vcpkg --version

cocos creator 3.8.3物理组件分组的坑

坑&#xff0c;坑的不行的大坑 group用的二进制的左移获取十进制的数值 目前是这样判断的&#xff0c;也不知道对不对&#xff0c;什么get、set Group没找到

【AI写作宝-注册安全分析报告-无验证方式导致安全隐患】

前言 由于网站注册入口容易被黑客攻击&#xff0c;存在如下安全问题&#xff1a; 1. 暴力破解密码&#xff0c;造成用户信息泄露 2. 短信盗刷的安全问题&#xff0c;影响业务及导致用户投诉 3. 带来经济损失&#xff0c;尤其是后付费客户&#xff0c;风险巨大&#xff0c;造…

计算机毕业设计Python流量检测可视化 DDos攻击流量检测与可视化分析 SDN web渗透测试系统 网络安全 信息安全 大数据毕业设计

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…

2024.11最新Hexo+GitHub搭建个人博客

2024.11最新HexoGitHub搭建个人博客 一、Hexo介绍 Hexo 是一个快速、简洁且高效的博客框架&#xff0c;有丰富的主题和插件可供使用。 Hexo 使用 Markdown&#xff08;或其他标记语言&#xff09;解析文章&#xff0c;在几秒内&#xff0c;即可利用靓丽的主题生成静态网页。这…

王道考研之数据结构

数据结构系列 提示&#xff1a;这里可以添加系列文章的所有文章的目录&#xff0c;目录需要自己手动添加 数据结构 数据结构系列1.线性表1.1 线性表的定义和相关概念1.2 线性表的创销 增删查改 判空表长打印 2.顺序表2.1 顺序表定义和相关概念2.2 顺序表的静态实现2.3 顺序表的…

java导出word文件(手绘)

文章目录 代码细节效果图参考资料 代码细节 使用的hutool的WordUtil&#xff0c;WordUtil对poi进行封装&#xff0c;但是这一块的官方封装的很少&#xff0c;很多细节都没有。代码中是常见的绘制段落&#xff0c;标题、表格等常用api Word07Writer writer WordUtil.getWriter(…

LeetCode 0685.冗余连接 II:并查集(和I有何不同分析)——详细题解(附图)

【LetMeFly】685.冗余连接 II&#xff1a;并查集&#xff08;和I有何不同分析&#xff09;——详细题解(附图) 力扣题目链接&#xff1a;https://leetcode.cn/problems/redundant-connection-ii/ 在本问题中&#xff0c;有根树指满足以下条件的 有向 图。该树只有一个根节点&…

git原理与上传

言&#xff1a; git是一个软件&#xff0c;gitee/github是一个网站&#xff0c;这里有什么联系吗&#xff1f;我们身为一个程序员不可能不知道github&#xff0c;但是毕竟这是外国的网站&#xff0c;我们不翻墙的情况下&#xff0c;是无法访问的(或者就是太慢了&#xff0c;或…

Go语言的常用内置函数

文章目录 一、Strings包字符串处理包定义Strings包的基本用法Strconv包中常用函数 二、Time包三、Math包math包概述使用math包 四、随机数包&#xff08;rand&#xff09; 一、Strings包 字符串处理包定义 Strings包简介&#xff1a; 一般编程语言包含的字符串处理库功能区别…

React 入门课程 - 使用CDN编程React

1. 第一个React 注意&#xff1a;在vscode里&#xff0c;使用Live Server来运行html文件。 index.html <html><head><link rel"stylesheet" href"index.css"><script crossorigin src"https://unpkg.com/react17/umd/react.de…

苍穹外卖day09超出配送范围前端不提示问题

同学们在写苍穹外卖项目day09时调用了百度地图api来判断用户地址是否超出配送范围&#xff0c; 但是在黑马官方的课程或资料中&#xff0c;出现这样的问题时只会向用户端的控制台报错并不会提醒用户 如下图&#xff1a; 解决方法&#xff1a; 其实解决方法很简单只需要找到向…

ARXML汽车可扩展标记性语言规范讲解

ARXML: Automotive Extensible Markup Language &#xff08;汽车可扩展标记语言&#xff09; xmlns: Xml name space &#xff08;xml 命名空间&#xff09; xsd: Xml Schema Definition (xml 架构定义) 1、XML与HTML的区别&#xff0c;可扩展。 可扩展&#xff0c;主要是…