欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

SpringBoot隨機端口啟動的實現(xiàn)

 更新時間:2021年07月21日 17:13:44   作者:TianXinCoord  
本文主要介紹了SpringBoot隨機端口啟動的實現(xiàn),文中通過示例代碼介紹的非常詳細,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

一、SpringBoot隨機端口

1.基礎(chǔ)介紹

  • 隨機端口可以自動找指定范圍內(nèi)可使用的端口,不需要在配置文件中指定固定的啟動端口
  • 例如在SpringBoot中假如需要運行多個實例,則需要單獨修改配置文件比較麻煩
  • 隨機端口的原理就是與對應(yīng)socket端口建立連接,能連接則已被使用,反之未被使用
  • 隨機獲取的端口校驗可使用之后通過System.setProperty("屬性名稱", port);寫入內(nèi)存,然后就可以在配置文件中獲取到
  • 如果寫入的名稱為server.port則不用在配置文件中指定端口,否則需要配置server.port=${屬性名稱}
  • 本實踐基于SpringBoot普通工程,直接創(chuàng)建項目腳手架即可
  • 【tip】例如在SpringCloud項目中服務(wù)提供者,可以使用隨機端口快速啟動多個服務(wù),而不需要單獨修改配置文件再啟動

2.實現(xiàn)步驟

創(chuàng)建ServerPortUtil .java端口工具類,使用socket連接指定端口,例如有以下條件

a. 指定端口范圍為8000-65535
b. 識別端口是否使用,已被使用則繼續(xù)隨機產(chǎn)生
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();
		// 最大嘗試次數(shù)為端口范圍
        int maxRetryCount = MAX_PORT - MIN_PORT;
        while (maxRetryCount > 0) {
        	// 指定范圍內(nèi)隨機端口,隨便寫的算法,根據(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)暫無端口可用,運行結(jié)束");
        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;
    }
}

創(chuàng)建StartCommand.java命令類,調(diào)用隨機端口功能獲取端口信息,然后將端口信息寫入運行環(huán)境中
a. 如果傳入的參數(shù)包含了端口則使用指定的,否則使用自動生成

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);
    }
}

在啟動類啟動前向環(huán)境寫入端口信息

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啟動即可

到此這篇關(guān)于SpringBoot隨機端口啟動的實現(xiàn)的文章就介紹到這了,更多相關(guān)SpringBoot隨機端口啟動內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 客戶端設(shè)置超時時間真的很重要

    客戶端設(shè)置超時時間真的很重要

    今天小編就為大家分享一篇關(guān)于客戶端設(shè)置超時時間真的很重要,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2018-12-12
  • Java中的HashSet集合存儲數(shù)據(jù)的結(jié)構(gòu)詳解

    Java中的HashSet集合存儲數(shù)據(jù)的結(jié)構(gòu)詳解

    這篇文章主要介紹了Java中的HashSet集合存儲數(shù)據(jù)的結(jié)構(gòu)詳解,數(shù)組結(jié)構(gòu)他把元素進行分組,相同哈希值的元素是一組,鏈表/紅黑樹結(jié)構(gòu)把相同哈希值的元素鏈接到一起,存儲數(shù)據(jù)到集合中,先計算元素的哈希值,需要的朋友可以參考下
    2023-09-09
  • SpringBoot注解@ConditionalOnClass底層源碼實現(xiàn)

    SpringBoot注解@ConditionalOnClass底層源碼實現(xiàn)

    這篇文章主要為大家介紹了SpringBoot注解@ConditionalOnClass底層源碼實現(xiàn),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-02-02
  • 解決Java & Idea啟動tomcat的中文亂碼問題

    解決Java & Idea啟動tomcat的中文亂碼問題

    這篇文章主要介紹了Java & Idea啟動tomcat的中文亂碼問題,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-07-07
  • Java數(shù)組優(yōu)點和缺點_動力節(jié)點Java學(xué)院整理

    Java數(shù)組優(yōu)點和缺點_動力節(jié)點Java學(xué)院整理

    本文給大家簡單介紹下java數(shù)組的優(yōu)點和缺點知識,需要的的朋友參考下吧
    2017-04-04
  • Java的RocketMq水平擴展及負載均衡詳解

    Java的RocketMq水平擴展及負載均衡詳解

    這篇文章主要介紹了Java的RocketMq水平擴展及負載均衡詳解,RocketMQ是一個分布式具有高度可擴展性的消息中間件,本文旨在探索在broker端,生產(chǎn)端,以及消費端是如何做到橫向擴展以及負載均衡的,需要的朋友可以參考下
    2024-01-01
  • Java實現(xiàn)矩陣順時針旋轉(zhuǎn)90度的示例

    Java實現(xiàn)矩陣順時針旋轉(zhuǎn)90度的示例

    今天小編就為大家分享一篇Java實現(xiàn)矩陣順時針旋轉(zhuǎn)90度的示例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-01-01
  • maven多profile 打包下 -P參和-D參數(shù)的實現(xiàn)

    maven多profile 打包下 -P參和-D參數(shù)的實現(xiàn)

    這篇文章主要介紹了maven多profile 打包下 -P參和-D參數(shù)的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-11-11
  • Java 駝峰命名法詳解(必看篇)

    Java 駝峰命名法詳解(必看篇)

    下面小編就為大家?guī)硪黄狫ava 駝峰命名法詳解(必看篇)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-05-05
  • IDEA2020.2.3中創(chuàng)建JavaWeb工程的完整步驟記錄

    IDEA2020.2.3中創(chuàng)建JavaWeb工程的完整步驟記錄

    這篇文章主要給大家介紹了關(guān)于IDEA2020.2.3中創(chuàng)建JavaWeb工程的完整步驟,文中通過圖文介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-12-12

最新評論