SpringBoot3.3中實(shí)現(xiàn)多端口監(jiān)聽(tīng)的示例代碼
在 SpringBoot 應(yīng)用
中,通常情況下,我們只需要監(jiān)聽(tīng)一個(gè)端口來(lái)處理 HTTP 請(qǐng)求
。但在某些情況下,我們可能需要在同一個(gè)應(yīng)用中監(jiān)聽(tīng)多個(gè)端口,例如分別處理不同類型的請(qǐng)求,或者在同一個(gè)應(yīng)用中暴露多個(gè)服務(wù)接口。本篇文章將詳細(xì)講解如何在 SpringBoot
中實(shí)現(xiàn)多端口監(jiān)聽(tīng),并結(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)聽(tīng)
在 SpringBoot
中,通過(guò)配置 application.yml 文件
可以輕松實(shí)現(xiàn)多端口監(jiān)聽(tīng)。以下是配置示例:
server: port: 8080 # 主端口 # 額外的端口配置 additional-ports: - 8081 - 8082
3、編寫(xiě)配置類實(shí)現(xiàn)多端口監(jiān)聽(tīng)
在配置文件中指定了額外的端口后,我們需要編寫(xiě)一個(gè)配置類,使用 Spring
的 EmbeddedWebServerFactoryCustomizer
來(lái)實(shí)現(xiàn)多端口監(jiān)聽(tīng)。我們?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è)端口,之前的控制器定義無(wú)需改變:
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、編寫(xiě)前端頁(yè)面
在 src/main/resources/templates
目錄下創(chuàng)建一個(gè)簡(jiǎn)單的 index.html
頁(yè)面,使用 Thymeleaf
和 Bootstrap
進(jìn)行前端展示。
<!DOCTYPE html> <html xmlns:th="http://www.thymeleaf.org"> <head> <title>SpringBoot 多端口監(jiān)聽(tīng)</title> <link rel="external nofollow" rel="stylesheet"> </head> <body> <div class="container"> <h1 class="mt-5">SpringBoot 多端口監(jiān)聽(tīng)示例</h1> <p class="lead">此應(yīng)用監(jiān)聽(tīng)多個(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è)簡(jiǎn)單的控制器,用于處理 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è)簡(jiǎn)單的控制器類,提供了一個(gè)主頁(yè)和一個(gè)返回監(jiān)聽(tīng)端口信息的接口。
8、啟動(dòng)與驗(yàn)證
啟動(dòng) SpringBoot 應(yīng)用
后,在瀏覽器中訪問(wèn) http://localhost:8080
、http://localhost:8081
和 http://localhost:8082
,你會(huì)發(fā)現(xiàn)所有端口都可以正常響應(yīng)請(qǐng)求,說(shuō)明我們已經(jīng)成功實(shí)現(xiàn)了多端口監(jiān)聽(tīng)。
9、總結(jié)
通過(guò)本文的詳細(xì)講解,我們學(xué)習(xí)了如何在 SpringBoot
中實(shí)現(xiàn)多端口監(jiān)聽(tīng)。這一功能在處理不同類型的請(qǐng)求或暴露多個(gè)服務(wù)接口時(shí)非常有用。我們通過(guò)配置 application.yml
文件和編寫(xiě)自定義配置類,結(jié)合前端展示,實(shí)現(xiàn)了這一功能。
到此這篇關(guān)于SpringBoot3.3中實(shí)現(xiàn)多端口監(jiān)聽(tīng)的示例代碼的文章就介紹到這了,更多相關(guān)SpringBoot3.3 多端口監(jiān)聽(tīng)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
httpclient模擬post請(qǐng)求json封裝表單數(shù)據(jù)的實(shí)現(xiàn)方法
下面小編就為大家?guī)?lái)一篇httpclient模擬post請(qǐng)求json封裝表單數(shù)據(jù)的實(shí)現(xiàn)方法。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-12-12intellij IDEA配置springboot的圖文教程
Spring Boot是由Pivotal團(tuán)隊(duì)提供的全新框架,其設(shè)計(jì)目的是用來(lái)簡(jiǎn)化新Spring應(yīng)用的初始搭建以及開(kāi)發(fā)過(guò)程。接下來(lái)通過(guò)本文給大家介紹intellij IDEA配置springboot的圖文教程,感興趣的朋友一起看看吧2018-03-03在Spring Boot項(xiàng)目中引入本地JAR包的步驟和配置
本文探討了在Spring Boot項(xiàng)目中引入本地JAR包的步驟和必要的配置,通過(guò)使用Maven的system作用域,開(kāi)發(fā)者可以將自定義的本地庫(kù)或功能集成到Spring Boot應(yīng)用程序中,,需要的朋友可以參考下2023-10-10Java 使用json-lib處理JSON詳解及實(shí)例代碼
這篇文章主要介紹了Java 使用json-lib處理JSON詳解及實(shí)例代碼的相關(guān)資料,需要的朋友可以參考下2017-02-02詳解Java設(shè)計(jì)模式編程中命令模式的項(xiàng)目結(jié)構(gòu)實(shí)現(xiàn)
這篇文章主要介紹了Java設(shè)計(jì)模式編程中命令模式的項(xiàng)目結(jié)構(gòu)實(shí)現(xiàn),命令模式將請(qǐng)求與執(zhí)行分離,可以多個(gè)命令接口的實(shí)現(xiàn)類,隱藏真實(shí)的被調(diào)用方,需要的朋友可以參考下2016-04-04Java設(shè)計(jì)者模式簡(jiǎn)單工廠模式解析
這篇文章主要介紹了Java設(shè)計(jì)者模式簡(jiǎn)單工廠模式解析,介紹了其簡(jiǎn)介,實(shí)例以及優(yōu)缺點(diǎn)分析,具有一定參考價(jià)值,需要的朋友可以了解下。2017-11-11