#隨機端口可以自動找指定範圍內可使用的端口,不需要在配置文件中指定固定的啟動連接埠
例如在SpringBoot中假如需要運行多個實例,則需要單獨修改設定檔比較麻煩
隨機連接埠的原理是與對應socket端口建立連接,能連接則已被使用,反之未被使用
#隨機獲取的端口校驗可使用之後通過System.setProperty("屬性名稱" , port);寫入內存,然後就可以在配置文件中獲取到
如果寫入的名稱為server.port則不用在配置文件中指定端口,否則需要配置server.port=${屬性名稱}
本實作基於SpringBoot普通工程,直接建立專案腳手架即可
ServerPortUtil .java連接埠工具類,使用socket連接指定端口,例如有以下條件
b. 識別端口是否使用,已被使用則繼續隨機產生
c. 如果全部端口不可用則直接拋出錯誤,中斷運行
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(); // 最大尝试次数为端口范围 int maxRetryCount = MAX_PORT - MIN_PORT; while (maxRetryCount > 0) { // 指定范围内随机端口,随便写的算法,根据自己需要调整 int port = random.nextInt(MAX_PORT - MIN_PORT) + MIN_PORT; boolean isUsed = isLocalePortUsing(port); if (!isUsed) { return String.valueOf(port); } --maxRetryCount; } System.out.println("系统暂无端口可用,运行结束"); System.exit(1); return null; } /** * 检查给定端口是否可用 * * @author tianxincode@163.com * @since 2020/10/14 */ public static boolean isLocalePortUsing(int port) { try { // 建立一个Socket连接, 如果该端口还在使用则返回true, 否则返回false, 127.0.0.1代表本机 new Socket(InetAddress.getByName("127.0.0.1"), port); return true; } catch (Exception e) { // 异常说明端口连接不上,端口能使用 } return false; } }創建
StartCommand.java命令類,調用隨機端口功能獲取端口信息,然後將端口信息寫入運行環境中
a. 如果傳入的參數包含了端口則使用指定的,否則使用自動生成
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); } }在啟動類啟動前向環境寫入連接埠資訊
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) { // 写入端口信息 new StartCommand(args); SpringApplication.run(SpringbootRandomPortApplication.class, args); } }在設定檔中指定連接埠為隨機產生的連接埠資訊
server: # 随机端口配置 port: ${auto.port}項目測試正常啟動項目,可以在控制台看到啟動的連接埠資訊 二、SpringBoot多實例運行SpringBoot的多實例運行在IDEA中配置如下 #然後在啟動上run/debug啟動即可
以上是SpringBoot隨機連接埠啟動怎麼實現的詳細內容。更多資訊請關注PHP中文網其他相關文章!