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 {@Beanpublic ServletWebServerFactory servletWebServerFactory() {TomcatServletWebServerFactory factory = new TomcatServletWebServerFactory();factory.addAdditionalTomcatConnectors(createConnector(8081)); // Add additional port 8081factory.addAdditionalTomcatConnectors(createConnector(8082)); // Add additional port 8082return 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 {@Beanpublic 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 {@Beanpublic 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文件和编写自定义配置类,结合前端展示,实现了这一功能。

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

Git分支

目录​​​​​​​ 一、分支是什么 二、查看、创建分⽀(git branch) 查看分支 创建分支 三、切换分支(git checkout&#xff0c;git checkout -b) 四、合并分支(git merge、git log查看合并情况) 五、删除分支&#xff08;git branch -d []&#xff09; 六、合并冲突&…

sigmoid和softmax有什么区别,softmax的本质是最大熵?

本文理论依据王木头的视频&#xff1a; softmax是为了解决归一问题凑出来的吗&#xff1f;和最大熵是什么关系&#xff1f;最大熵对机器学习为什么非常重要&#xff1f;_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1cP4y1t7cP/?spm_id_from333.999.0.0&vd_sourc…

stm32 挂死定位(死循环)

1&#xff0c;调式程序时先看初始化和轮询点灯流程&#xff0c;如果灯没有闪烁则表明程序进入了死循环。 2&#xff0c;程序调式进入调式debug接口&#xff1b; 3&#xff0c;打断点依次运行&#xff1b; 4&#xff0c;查看寄存器&#xff1b; LR在异常后通常为0xFFFFFFFx&am…

ZFC in Lean 之 前集及其成员关系(S, ∈)是良创的(Well-founded)

基于前文&#xff0c;对前集&#xff08;S&#xff0c;pre-set&#xff09;、其成员关系&#xff08;∈&#xff0c;membership&#xff09;&#xff0c;以及良创&#xff08;Well-Founded&#xff09;的定义&#xff0c;此文&#xff0c;分析&#xff08;S, ∈&#xff09;是良…

【暴刷力扣】59. 螺旋矩阵 II

题目 给你一个正整数 n &#xff0c;生成一个包含 1 到 n2 所有元素&#xff0c;且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix 。 题解 leetcode 大部分题解写的不知道都是什么——代码非常杂乱。 还是直接放上紫书&#xff08;《算法竞赛入门指南》&#xff09;…

vue3+ts+element-ui实现的可编辑table表格组件 插入单行多行 组件代码可直接使用

最近需求越来越离谱&#xff0c;加班越来越严重&#xff0c;干活的牛马也越来越卑微。写了一个可编辑表格&#xff0c;并已封装好组件&#xff0c;可直接使用。 基于这位大佬的 动态表格自由编辑 方法和思路&#xff0c;于是参考和重写了表格&#xff0c;在基础上增加和删除了…

zxing生成、解析二维码,条形码

1、maven依赖 <!--zxing依赖--><dependency><groupId>com.google.zxing</groupId><artifactId>core</artifactId><version>3.1.0</version></dependency><dependency><groupId>com.google.zxing</groupI…

JQuery设置Cookie操作,设置、获取、删除三种方法

//触发条件 当用户点击或者操作时需要设置cookie时 //方法里面定义了三个处理cookie的方法 $(document).ready(function(e) {$("#btnsetcookie").click(function() {setCookie("Demo", "我的示例Cookie数据", 2); //设置cookie});$("#btn…

bert-base-uncased使用

1.下载模型 https://github.com/google-research/bert?tabreadme-ov-file 2.下载config.json和pytorch_model.bin https://huggingface.co/google-bert/bert-base-uncased/tree/main 3.解压缩到同一文件夹 4.代码测试 from transformers import BertModel,BertTokenizerBER…

【人工智能】阿里云PAI平台DSW实例一键安装Python脚本

阿里云的DSW实例自带的镜像很少而且并不好用&#xff0c;所以我在这里写三个一键编译安装Python3.8&#xff0c;Python3.9&#xff0c;Python3.10的Shell脚本。 安装Python3.8 wget https://www.smallbamboo.cn/install_python38.sh && chmod x install_python38.sh …

每日科技资讯:2024年11月09日【龙】农历十月初九 ---文末送书

目录 1.史上最强游戏CPU&#xff01;9800X3D首发评测2.苹果喊话iPhone 13和14钉子户&#xff1a;16方方面面都升级了3.加拿大政府下令 TikTok 关闭该国业务&#xff0c;但应用仍可以继续访问4.OpenAI 刚刚花了超过 1000 万美元购买了Chat.com5.Max 加入打击密码共享行列6.微软可…

「实战应用」如何用图表控件LightningChart .NET在WPF中制作表格?(一)

LightningChart .NET完全由GPU加速&#xff0c;并且性能经过优化&#xff0c;可用于实时显示海量数据-超过10亿个数据点。 LightningChart包括广泛的2D&#xff0c;高级3D&#xff0c;Polar&#xff0c;Smith&#xff0c;3D饼/甜甜圈&#xff0c;地理地图和GIS图表以及适用于科…

大数据学习11之Hive优化篇

1.Hive压缩 1.1概述 当前的大数据环境下&#xff0c;机器性能好&#xff0c;节点更多&#xff0c;但并不代表我们无条件直接对数据进行处理&#xff0c;在某些情况下&#xff0c;我们依旧需要对数据进行压缩处理&#xff0c;压缩处理能有效减少存储系统的字节读取数&#xff0…

【Linux】【Vim】多文件编辑与分屏

多文件编辑 编辑另一个文件文件列表分屏vimdiff文件跳转 编辑另一个文件 除了为每一个要编辑的文件运行一次 Vim 之外&#xff0c;还可以在当前 Vim 中开始编辑另一个文件。 :edit foo.txtVim 会关闭当前正在编辑的文件打开指定的新文件进行编辑。如果当前文件还有未存盘的内容…

Fastify Swagger:自动化API文档生成与展示

在现代软件开发中&#xff0c;API文档的生成和维护是一个不可或缺的环节。Fastify Swagger 是一个专为 Fastify 框架设计的插件&#xff0c;它能够自动生成符合 Swagger&#xff08;OpenAPI v2 或 v3&#xff09;规范的文档&#xff0c;从而帮助开发者轻松创建和维护API文档。本…

SQL,力扣题目262,行程和用户

一、力扣链接 LeetCode_262 二、题目描述 表&#xff1a;Trips ----------------------- | Column Name | Type | ----------------------- | id | int | | client_id | int | | driver_id | int | | city_id | int | | status …

【复旦微FM33 MCU 开发指南】ADC

前言 本系列基于复旦微FM33LC0系列单片机的DataSheet编写&#xff0c;旨在提供手册解析和开发指南。 本文章及本系列其他文章将持续更新&#xff0c;本系列其它文章请跳转【复旦微FM33 MCU 外设开发指南】总集篇 本文章最后更新日期&#xff1a;2024/11/09 全文字数&#xff…

机器学习—是否有路通向AGI(通用人工智能)

AI包含两个非常不同的东西&#xff0c;一个是ANI&#xff0c;代表人工狭义智能&#xff0c;这是一个人工智能系统&#xff0c;只做一件事&#xff0c;狭隘的任务&#xff0c;可能非常有价值&#xff0c;比如智能音箱或者网络搜索或AI应用于特定应用。例如&#xff0c;过去几年的…

2.4w字 —TS入门教程

目录 1. 什么是TS 2. TS基本使用 3 TS基础语法 3.1 基础类型约束 3.11 string&#xff0c;number&#xff0c;boolean&#xff0c; null和undefined 3.12 any 3.13 unknown 3.14 void 3.15 数组 3.16 对象 3.2 函数的约束 3.21 普通写法 3.22 函数表达式 3.22 可选…

深度学习注意力机制类型总结pytorch实现代码

一、注意力机制的基本原理 在深度学习中&#xff0c;注意力机制&#xff08;Attention Mechanism&#xff09;已经成为一种重要的技术。意力机制通过动态调整模型的注意力权重&#xff0c;来突出重要信息&#xff0c;忽略不重要的信息&#xff0c;大大提高了模型的效果 注意力…