日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術(shù)文章
文章詳情頁

Spring boot隨機(jī)端口你都不會還怎么動態(tài)擴(kuò)容

瀏覽:130日期:2023-05-16 17:32:08

一般情況下每個spring boot工程啟動都有固定的端口,但是固定端口不利用服務(wù)的動態(tài)擴(kuò)容,如果在一臺服務(wù)器上需要對同一個服務(wù)進(jìn)行多實(shí)例部署,很容易出現(xiàn)端口沖突,那么怎么解決這個問題呢?

random隨機(jī)端口

在spring boot中,可以通過${random}來生成隨機(jī)數(shù)字,我們可以在配置文件中,這么設(shè)置端口:

server.port=${random.int(2000,8000)}

通過random.int方法,指定生成2000~8000的隨機(jī)端口。這樣每次啟動的端口都不一樣。

多次啟動,發(fā)現(xiàn)每次的端口都不一致說明配置成功。

Spring boot隨機(jī)端口你都不會還怎么動態(tài)擴(kuò)容

Spring boot隨機(jī)端口你都不會還怎么動態(tài)擴(kuò)容

注意事項(xiàng):這里需要注意spring boot項(xiàng)目啟動屬性文件的加載順序,spring boot的屬性是由里向外加載,所以最外層的最后被加載,會覆蓋里層的屬性。所以如果主動在啟動命令中使用?server.port配置了項(xiàng)目的端口號,那么屬性文件中配置的隨機(jī)端口屬性就不會生效。

通過System.setProperty設(shè)置有效隨機(jī)端口

上面的方法雖然暫時達(dá)到了想要的效果,但是有個問題:如果生成的這個隨機(jī)端口已經(jīng)被使用了,那么項(xiàng)目啟動就會出現(xiàn)端口沖突。

那么,我們能否通過一個檢測機(jī)制,讓生成的隨機(jī)端口一定是一個沒有被占用的有效的隨機(jī)端口呢?

有效端口檢測原理:

通過建立socket連接,Socket socket = new Socket(Address,port);#address代表主機(jī)的IP地址,port代表端口號如果對該主機(jī)的特定端口號能建立一個socket,則說明該主機(jī)的該端口在使用。Socket socket = new Socket(Address,port);#address代表主機(jī)的IP地址,port代表端口號如果對該主機(jī)的特定端口號能建立一個socket,則說明該主機(jī)的該端口在使用。

實(shí)現(xiàn)思路:

通過在項(xiàng)目啟動前,獲取有效的隨機(jī)端口并通過System.setProperty將變量設(shè)置到系統(tǒng)的全局變量中,這樣項(xiàng)目啟動時就可以從全局變量中獲取到server.port變量的值。這里的system,系統(tǒng)指的是 JRE (runtime)system,即設(shè)置jvm運(yùn)行時的全局變量。

工具類:

@Slf4jpublic class NetUtils { /** * 測試本機(jī)端口是否被使用 * @param port * @return */ public static boolean isLocalPortUsing(int port){ boolean flag = true; try { //如果該端口還在使用則返回true,否則返回false,127.0.0.1代表本機(jī) flag = isPortUsing('127.0.0.1', port); } catch (Exception e) { } return flag; } /*** * 測試主機(jī)Host的port端口是否被使用 * @param host * @param port * @throws UnknownHostException */ public static boolean isPortUsing(String host,int port) { boolean flag = false; try { InetAddress Address = InetAddress.getByName(host); Socket socket = new Socket(Address,port); //建立一個Socket連接 flag = true; } catch (IOException e) { //log.info(e.getMessage(),e); } return flag; } //start--end是所要檢測的端口范圍 static int start=0; static int end=1024; /** * 由于本機(jī)上安裝了mysql,采用3306端口去驗(yàn)證 * @param args */ public static void main(String args[]){ int testPost =3306; if(isLocalPortUsing(testPost)){System.out.println('端口 '+testPost+' 已被使用'); }else{System.out.println('端口 '+testPost+'未使用'); } }}

public class ServerPortUtils { /** * 獲取可用端口 * @return */ public static int getAvailablePort(){ int max = 65535; int min = 2000; Random random = new Random(); int port = random.nextInt(max)%(max-min +1) + min; boolean using = NetUtils.isLocalPortUsing(port); if(using){ return getAvailablePort(); }else{ return port; } }}

項(xiàng)目啟動前設(shè)置server.port環(huán)境變量

/** * 開始命令 */@Slf4jpublic class StartCommand { 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; } } } //沒有指定端口,則隨機(jī)生成一個可用的端口 if(!isServerPort){ int port = ServerPortUtils.getAvailablePort(); log.info('current server.port=' + port); System.setProperty('server.port',String.valueOf(port)); }else{//指定了端口,則以指定的端口為準(zhǔn) log.info('current server.port=' + serverPort.split('=')[1]); System.setProperty('server.port',serverPort.split('=')[1]); } }}

啟動類調(diào)用方法:

@SpringBootApplication@EnableUserClient@RestControllerpublic class DemoApplication { @Autowired Environment environment; public static void main(String[] args) { new StartCommand(args); SpringApplication.run(DemoApplication.class, args); }}

通過自定義PropertiesPropertySource屬性源實(shí)現(xiàn)

public class MyEnvironmentPostProcessor implements EnvironmentPostProcessor { @Override public void postProcessEnvironment(ConfigurableEnvironment environment, SpringApplication application) { //MapPropertySource Properties properties = new Properties(); properties.put('server.port', ServerPortUtils.getAvailablePort()); System.out.println(properties.get('server.port')); PropertiesPropertySource source = new PropertiesPropertySource('myCustom', properties); environment.getPropertySources().addLast(source); //environment.getPropertySources().addAfter(); }}

通過配置在resources/META-INF/spring.factories文件中使用全名注冊

org.springframework.boot.env.EnvironmentPostProcessor=com.laowan.demo.command.MyEnvironmentPostProcessor

這樣在項(xiàng)目啟動后,就會將該屬性源加載到Environment中。

Spring boot隨機(jī)端口你都不會還怎么動態(tài)擴(kuò)容

總結(jié)

1、為什么要設(shè)置隨機(jī)端?主要是為了解決動態(tài)擴(kuò)容時出現(xiàn)端口沖突的問題。2、怎么獲取一個有效的隨機(jī)端口號3、spring boot下實(shí)現(xiàn)隨機(jī)端口的三種方式。關(guān)于方式三的自定義屬性源的實(shí)現(xiàn)方式可以多多品味,實(shí)踐一下,更好的體會屬性文件的加載順序。

到此這篇關(guān)于Spring boot隨機(jī)端口你都不會還怎么動態(tài)擴(kuò)容的文章就介紹到這了,更多相關(guān)Spring boot隨機(jī)端口內(nèi)容請搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!

標(biāo)簽: Spring
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
石原莉奈一区二区三区在线观看| 国产传媒在线观看| 亚洲一区欧美二区| 亚洲国产综合在线看不卡| 久久久久美女| 亚洲午夜久久久久久尤物| 欧美一区二区三区激情视频| 欧洲毛片在线视频免费观看| 香蕉久久国产| 在线视频精品| 亚洲人成精品久久久| 日韩精品国产欧美| 国产精品天堂蜜av在线播放| 精品三级久久久| 一本大道色婷婷在线| 免费国产自久久久久三四区久久| 亚洲深夜福利| 日本视频一区二区| 国产一区福利| 香蕉国产精品| 亚洲精品美女91| 国产激情精品一区二区三区| 92国产精品| 丝袜亚洲另类欧美| 视频国产精品| 久久爱www成人| 欧美日韩尤物久久| 蜜臀av性久久久久蜜臀aⅴ流畅 | 亚洲激情国产| 亚洲区欧美区| 粉嫩av一区二区三区四区五区 | 性感美女一区二区在线观看| 99久久亚洲精品蜜臀| 美女国产精品| 欧美国产日本| 91精品啪在线观看国产18 | 麻豆成人在线| 狂野欧美性猛交xxxx| 欧美日韩水蜜桃| 日本不卡的三区四区五区| 久久久久久夜| 中文不卡在线| 成人影视亚洲图片在线| 亚洲欧洲另类| 国产精品jk白丝蜜臀av小说| 欧美中文一区二区| 日韩一区二区三免费高清在线观看 | 日韩高清不卡一区二区| 91日韩免费| 中文欧美日韩| 国产劲爆久久| 亚洲一区二区成人| 国产欧美日韩精品一区二区三区| 久久裸体视频| 国产欧美日韩一区二区三区在线| 久久视频精品| 国产精品极品国产中出| 99成人在线| 国产成人精品一区二区三区免费| 国产精品毛片在线看| 精品一区二区三区的国产在线观看| 亚洲欧美一区在线| 久久成人高清| 久热re这里精品视频在线6| 欧美国产亚洲精品| 中日韩男男gay无套| 国内一区二区三区| 日韩中文字幕91| 波多视频一区| 欧美天堂一区| 亚洲欧美日韩专区| 日韩国产欧美| 国产精品亚洲产品| 免费黄网站欧美| 久久视频国产| 高清日韩欧美| 久久精品99国产精品| 国产手机视频一区二区 | 日韩成人亚洲| 免费一级欧美片在线观看网站 | 激情视频网站在线播放色| 欧美亚洲专区| 蜜臀av一区二区三区| 欧美日韩精品在线一区| 国产伊人久久| 国产日产一区| 亚洲日本欧美| 国产模特精品视频久久久久| 久久久久国产一区二区| 麻豆精品视频在线观看免费| 日韩精品免费一区二区夜夜嗨| 黄色成人91| 一区二区三区四区日本视频| 免费看一区二区三区| 91精品国产自产观看在线| 乱人伦精品视频在线观看| 欧美在线观看视频一区| 成人三级高清视频在线看| 国产精久久久| 国产乱码精品一区二区亚洲| 日本一区福利在线| 一区二区三区国产盗摄| 视频一区中文字幕| 亚洲在线一区| 最新国产拍偷乱拍精品| 精品一区在线| 亚洲一级特黄| 久久久成人网| 蜜桃av在线播放| 欧美日韩在线观看首页| av中文字幕在线观看第一页 | 国产资源在线观看入口av| 国产精品99久久久久久董美香| 欧美日韩一区二区三区四区在线观看| 亚洲一二av| 婷婷精品在线| 日本在线一区二区三区| 日韩三级精品| 亚洲aa在线| 91精品啪在线观看国产爱臀| 国产亚洲欧美日韩在线观看一区二区 | 亚洲精品99| 亚洲一区二区成人| 男女精品网站| 蜜桃久久精品一区二区| 蜜乳av另类精品一区二区| 亚洲视频www| 亚洲网址在线观看| 日韩国产高清在线| 国产精品亚洲欧美一级在线| 国产精品白丝av嫩草影院| 欧美日韩视频免费看| 国产精品久久久久9999高清| 免费精品一区| 欧美丰满日韩| 欧美亚洲在线日韩| 噜噜噜躁狠狠躁狠狠精品视频| 亚洲三级精品| 国产日韩欧美三区| 国产不卡人人| 2023国产精品久久久精品双| 中文亚洲免费| 欧美在线黄色| 久久精品国产成人一区二区三区| 成人av三级| 99成人在线| 色8久久久久| 欧美国产日韩电影| 中文另类视频| 日韩中文字幕麻豆| 国产欧美日韩精品一区二区免费 | 偷拍欧美精品| 亚洲啊v在线免费视频| 国产精品久久乐| a日韩av网址| 国产亚洲综合精品| 久久国内精品视频| 桃色av一区二区| 日韩影院在线观看| 91精品国产自产在线丝袜啪| 精品国产三区在线| 国户精品久久久久久久久久久不卡| 午夜在线视频一区二区区别| 国产亚洲欧美日韩在线观看一区二区 | 妖精视频成人观看www| 日本精品一区二区三区在线观看视频| 国产精品v日韩精品v欧美精品网站| 国产不卡人人| av不卡在线看| 久久中文字幕一区二区三区| 蜜桃视频欧美| 国产精品片aa在线观看| 久久影院一区| 国产无遮挡裸体免费久久| 在线观看精品| 日韩区欧美区| 久久久国产精品一区二区中文| 亚洲18在线| 电影亚洲精品噜噜在线观看 | 亚洲精品福利| 日韩中文在线电影| 一区二区精品| 成人在线视频区| 欧美专区在线| 精品久久影院| 在线看片日韩| 电影天堂国产精品| 欧美久久精品| 91久久久精品国产| 久久久久伊人| 亚洲资源在线| 日韩视频网站在线观看| 97精品久久| 日韩一级网站| 色婷婷亚洲mv天堂mv在影片| 亚洲精品在线国产| 久久精品国产www456c0m| 欧美中文一区| 99国产精品视频免费观看一公开| 久久尤物视频|