SpringBoot隨機(jī)端口啟動(dòng)的實(shí)現(xiàn)
一、SpringBoot隨機(jī)端口
1.基礎(chǔ)介紹
- 隨機(jī)端口可以自動(dòng)找指定范圍內(nèi)可使用的端口,不需要在配置文件中指定固定的啟動(dòng)端口
- 例如在SpringBoot中假如需要運(yùn)行多個(gè)實(shí)例,則需要單獨(dú)修改配置文件比較麻煩
- 隨機(jī)端口的原理就是與對(duì)應(yīng)socket端口建立連接,能連接則已被使用,反之未被使用
- 隨機(jī)獲取的端口校驗(yàn)可使用之后通過(guò)System.setProperty("屬性名稱", port);寫(xiě)入內(nèi)存,然后就可以在配置文件中獲取到
- 如果寫(xiě)入的名稱為server.port則不用在配置文件中指定端口,否則需要配置server.port=${屬性名稱}
- 本實(shí)踐基于SpringBoot普通工程,直接創(chuàng)建項(xiàng)目腳手架即可
- 【tip】例如在SpringCloud項(xiàng)目中服務(wù)提供者,可以使用隨機(jī)端口快速啟動(dòng)多個(gè)服務(wù),而不需要單獨(dú)修改配置文件再啟動(dòng)
2.實(shí)現(xiàn)步驟
創(chuàng)建ServerPortUtil .java
端口工具類,使用socket連接指定端口,例如有以下條件
a. 指定端口范圍為8000-65535
b. 識(shí)別端口是否使用,已被使用則繼續(xù)隨機(jī)產(chǎn)生
c. 如果全部端口不可使用則直接拋出錯(cuò)誤,中斷運(yùn)行
import java.net.InetAddress; import java.net.Socket; import java.util.Random; public class ServerPortUtil { private static final int MAX_PORT = 65535; private static final int MIN_PORT = 8000; public static String getAvailablePort() { Random random = new Random(); // 最大嘗試次數(shù)為端口范圍 int maxRetryCount = MAX_PORT - MIN_PORT; while (maxRetryCount > 0) { // 指定范圍內(nèi)隨機(jī)端口,隨便寫(xiě)的算法,根據(jù)自己需要調(diào)整 int port = random.nextInt(MAX_PORT - MIN_PORT) + MIN_PORT; boolean isUsed = isLocalePortUsing(port); if (!isUsed) { return String.valueOf(port); } --maxRetryCount; } System.out.println("系統(tǒng)暫無(wú)端口可用,運(yùn)行結(jié)束"); System.exit(1); return null; } /** * 檢查給定端口是否可用 * * @author tianxincode@163.com * @since 2020/10/14 */ public static boolean isLocalePortUsing(int port) { try { // 建立一個(gè)Socket連接, 如果該端口還在使用則返回true, 否則返回false, 127.0.0.1代表本機(jī) new Socket(InetAddress.getByName("127.0.0.1"), port); return true; } catch (Exception e) { // 異常說(shuō)明端口連接不上,端口能使用 } return false; } }
創(chuàng)建StartCommand.java
命令類,調(diào)用隨機(jī)端口功能獲取端口信息,然后將端口信息寫(xiě)入運(yùn)行環(huán)境中
a. 如果傳入的參數(shù)包含了端口則使用指定的,否則使用自動(dòng)生成
import com.codecoord.randomport.util.ServerPortUtil; import org.springframework.util.StringUtils; public class StartCommand { /** * 端口屬性名稱,如果名稱為server.port則在配置文件中不用指定,否則需要指定為此處配置的名稱,如${auto.port} */ private static final String SERVER_PORT = "auto.port"; public StartCommand(String[] args) { boolean isServerPort = false; String serverPort = ""; if (args != null) { for (String arg : args) { if (StringUtils.hasText(arg) && arg.startsWith("--server.port" )) { isServerPort = true; serverPort = arg; break; } } } String port; if (isServerPort) { port = serverPort.split("=")[1]; } else { port = ServerPortUtil.getAvailablePort(); } System.out.println("Current project port is " + port); System.setProperty(SERVER_PORT, port); } }
在啟動(dòng)類啟動(dòng)前向環(huán)境寫(xiě)入端口信息
import com.codecoord.randomport.config.StartCommand; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplicatio public class SpringbootRandomPortApplication { public static void main(String[] args) { // 寫(xiě)入端口信息 new StartCommand(args); SpringApplication.run(SpringbootRandomPortApplication.class, args); } }
在配置文件中指定端口為隨機(jī)生成的端口信息
server: # 隨機(jī)端口配置 port: ${auto.port}
項(xiàng)目測(cè)試 正常啟動(dòng)項(xiàng)目,可以在控制臺(tái)看到啟動(dòng)的端口信息
二、SpringBoot多實(shí)例運(yùn)行
SpringBoot的多實(shí)例運(yùn)行在IDEA中配置如下
然后在啟動(dòng)上run/debug啟動(dòng)即可
到此這篇關(guān)于SpringBoot隨機(jī)端口啟動(dòng)的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)SpringBoot隨機(jī)端口啟動(dòng)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java中的HashSet集合存儲(chǔ)數(shù)據(jù)的結(jié)構(gòu)詳解
這篇文章主要介紹了Java中的HashSet集合存儲(chǔ)數(shù)據(jù)的結(jié)構(gòu)詳解,數(shù)組結(jié)構(gòu)他把元素進(jìn)行分組,相同哈希值的元素是一組,鏈表/紅黑樹(shù)結(jié)構(gòu)把相同哈希值的元素鏈接到一起,存儲(chǔ)數(shù)據(jù)到集合中,先計(jì)算元素的哈希值,需要的朋友可以參考下2023-09-09SpringBoot注解@ConditionalOnClass底層源碼實(shí)現(xiàn)
這篇文章主要為大家介紹了SpringBoot注解@ConditionalOnClass底層源碼實(shí)現(xiàn),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-02-02解決Java & Idea啟動(dòng)tomcat的中文亂碼問(wèn)題
這篇文章主要介紹了Java & Idea啟動(dòng)tomcat的中文亂碼問(wèn)題,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-07-07Java數(shù)組優(yōu)點(diǎn)和缺點(diǎn)_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
本文給大家簡(jiǎn)單介紹下java數(shù)組的優(yōu)點(diǎn)和缺點(diǎn)知識(shí),需要的的朋友參考下吧2017-04-04Java的RocketMq水平擴(kuò)展及負(fù)載均衡詳解
這篇文章主要介紹了Java的RocketMq水平擴(kuò)展及負(fù)載均衡詳解,RocketMQ是一個(gè)分布式具有高度可擴(kuò)展性的消息中間件,本文旨在探索在broker端,生產(chǎn)端,以及消費(fèi)端是如何做到橫向擴(kuò)展以及負(fù)載均衡的,需要的朋友可以參考下2024-01-01Java實(shí)現(xiàn)矩陣順時(shí)針旋轉(zhuǎn)90度的示例
今天小編就為大家分享一篇Java實(shí)現(xiàn)矩陣順時(shí)針旋轉(zhuǎn)90度的示例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-01-01maven多profile 打包下 -P參和-D參數(shù)的實(shí)現(xiàn)
這篇文章主要介紹了maven多profile 打包下 -P參和-D參數(shù)的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-11-11IDEA2020.2.3中創(chuàng)建JavaWeb工程的完整步驟記錄
這篇文章主要給大家介紹了關(guān)于IDEA2020.2.3中創(chuàng)建JavaWeb工程的完整步驟,文中通過(guò)圖文介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-12-12