SpringBoot3.3中實(shí)現(xiàn)多端口監(jiān)聽的示例代碼
在 SpringBoot 應(yīng)用中,通常情況下,我們只需要監(jiān)聽一個(gè)端口來處理 HTTP 請(qǐng)求。但在某些情況下,我們可能需要在同一個(gè)應(yīng)用中監(jiān)聽多個(gè)端口,例如分別處理不同類型的請(qǐng)求,或者在同一個(gè)應(yīng)用中暴露多個(gè)服務(wù)接口。本篇文章將詳細(xì)講解如何在 SpringBoot 中實(shí)現(xiàn)多端口監(jiān)聽,并結(jié)合代碼示例進(jìn)行深入講解。
運(yùn)行效果:

1、項(xiàng)目環(huán)境與依賴配置
首先,我們需要?jiǎng)?chuàng)建一個(gè) SpringBoot 項(xiàng)目,并確保項(xiàng)目中包含必要的依賴。以下是 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、配置多端口監(jiān)聽
在 SpringBoot 中,通過配置 application.yml 文件可以輕松實(shí)現(xiàn)多端口監(jiān)聽。以下是配置示例:
server: port: 8080 # 主端口 # 額外的端口配置 additional-ports: - 8081 - 8082
3、編寫配置類實(shí)現(xiàn)多端口監(jiān)聽
在配置文件中指定了額外的端口后,我們需要編寫一個(gè)配置類,使用 Spring 的 EmbeddedWebServerFactoryCustomizer 來實(shí)現(xiàn)多端口監(jiān)聽。我們?cè)?nbsp;MultiPortConfig 類中為每個(gè)端口配置一個(gè)獨(dú)立的 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;
}
}
在這個(gè)配置類中,createAndStartContext 方法為 8081 和 8082 端口創(chuàng)建了獨(dú)立的 Spring 上下文,每個(gè)上下文對(duì)應(yīng)一個(gè)配置類(Port8081Config 和 Port8082Config),這些配置類會(huì)定義對(duì)應(yīng)端口下的控制器。
4、為每個(gè)端口創(chuàng)建獨(dú)立的配置類
現(xiàn)在,我們?yōu)槊總€(gè)端口創(chuàng)建獨(dú)立的配置類,這些配置類將會(huì)注冊(cè)相應(yīng)的控制器。
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();
}
}
這些配置類會(huì)在相應(yīng)的端口上下文中注冊(cè)對(duì)應(yīng)的控制器。
5、控制器類定義
定義控制器類,每個(gè)控制器類對(duì)應(yīng)一個(gè)端口,之前的控制器定義無需改變:
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 的服務(wù)數(shù)據(jù)", 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 的服務(wù)數(shù)據(jù)", 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 的服務(wù)數(shù)據(jù)", headers, HttpStatus.OK);
}
}
6、編寫前端頁面
在 src/main/resources/templates 目錄下創(chuàng)建一個(gè)簡單的 index.html 頁面,使用 Thymeleaf 和 Bootstrap 進(jìn)行前端展示。
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<title>SpringBoot 多端口監(jiān)聽</title>
<link rel="external nofollow" rel="stylesheet">
</head>
<body>
<div class="container">
<h1 class="mt-5">SpringBoot 多端口監(jiān)聽示例</h1>
<p class="lead">此應(yīng)用監(jiān)聽多個(gè)端口,分別處理不同的請(qǐng)求。</p>
<p>主端口:8080</p>
<p>額外端口:8081, 8082</p>
<div class="row">
<div class="col-md-4">
<h3>端口 8080 數(shù)據(jù)</h3>
<p id="data-8080">加載中...</p>
</div>
<div class="col-md-4">
<h3>端口 8081 數(shù)據(jù)</h3>
<p id="data-8081">加載中...</p>
</div>
<div class="col-md-4">
<h3>端口 8082 數(shù)據(jù)</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、視圖控制器實(shí)現(xiàn)
在 src/main/java/com/icoderoad/controller 目錄下創(chuàng)建一個(gè)簡單的控制器,用于處理 HTTP 請(qǐng)求。
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";
}
}
上述代碼中,我們創(chuàng)建了一個(gè)簡單的控制器類,提供了一個(gè)主頁和一個(gè)返回監(jiān)聽端口信息的接口。
8、啟動(dòng)與驗(yàn)證
啟動(dòng) SpringBoot 應(yīng)用后,在瀏覽器中訪問 http://localhost:8080、http://localhost:8081 和 http://localhost:8082,你會(huì)發(fā)現(xiàn)所有端口都可以正常響應(yīng)請(qǐng)求,說明我們已經(jīng)成功實(shí)現(xiàn)了多端口監(jiān)聽。
9、總結(jié)
通過本文的詳細(xì)講解,我們學(xué)習(xí)了如何在 SpringBoot中實(shí)現(xiàn)多端口監(jiān)聽。這一功能在處理不同類型的請(qǐng)求或暴露多個(gè)服務(wù)接口時(shí)非常有用。我們通過配置 application.yml文件和編寫自定義配置類,結(jié)合前端展示,實(shí)現(xiàn)了這一功能。
到此這篇關(guān)于SpringBoot3.3中實(shí)現(xiàn)多端口監(jiān)聽的示例代碼的文章就介紹到這了,更多相關(guān)SpringBoot3.3 多端口監(jiān)聽內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
詳解SpringBoot中實(shí)現(xiàn)依賴注入功能
這篇文章主要介紹了詳解SpringBoot中實(shí)現(xiàn)依賴注入功能,SpringBoot的實(shí)現(xiàn)方式基本都是通過注解實(shí)現(xiàn)的。有興趣的可以了解一下。2017-04-04
SpringBoot Actuator埋點(diǎn)和監(jiān)控及簡單使用
最近做的項(xiàng)目涉及到埋點(diǎn)監(jiān)控、報(bào)表、日志分析的相關(guān)知識(shí),于是搗鼓的一番,下面把涉及的知識(shí)點(diǎn)及SpringBoot Actuator埋點(diǎn)和監(jiān)控的簡單用法,給大家分享下,感興趣的朋友一起看看吧2021-11-11
Mybatis如何按順序查詢出對(duì)應(yīng)的數(shù)據(jù)字段
這篇文章主要介紹了Mybatis如何按順序查詢出對(duì)應(yīng)的數(shù)據(jù)字段,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-01-01
IntelliJ IDEA彈出“IntelliJ IDEA License Activation”的處理方法
這篇文章主要介紹了IntelliJ IDEA彈出“IntelliJ IDEA License Activation”的處理方法,本文給出解決方法,對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-09-09
用攔截器修改返回response,對(duì)特定的返回進(jìn)行修改操作
這篇文章主要介紹了用攔截器修改返回response,對(duì)特定的返回進(jìn)行修改操作。具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-09-09
Java實(shí)現(xiàn)簡易版猜燈謎游戲的示例代碼
燈謎是中秋節(jié)傳統(tǒng)的活動(dòng)之一,而現(xiàn)代化的方式則是將其制作成一個(gè)小游戲,讓用戶在游戲的過程中猜燈謎,互動(dòng)體驗(yàn)更佳,所以本文小編就用Java制作一款猜燈謎小游戲吧2023-09-09

