package com.lzl.cloud.eureka.port;
import lombok.extern.slf4j.Slf4j;
import org.springframework.util.StringUtils;
import java.net.ServerSocket;
import java.util.Properties;
import java.util.Random;
/**
* 判断启动时是否指定端口
* 没有指定端口 随机获取端口 进行服务启动
* @author lzl
* @date: 2020-08-03 13:53
*/
@Slf4j
public class RandomServerPort {
public RandomServerPort(String[] args) {
resolvingStringPort(args);
}
/**
* 解析服务的启动参数
* @param args
*/
private void resolvingStringPort(String[] args){
String serverPortStr = "server.port";
String port = "";
if(null != args || args.length > 0){
for(String arg : args){
if(arg.contains(serverPortStr)){
// 获取参数中的端口号
port = arg.split("=")[1];
}
}
}
if(!StringUtils.isEmpty(port)){
Properties properties = System.getProperties();
// 设置 端口号
properties.setProperty(serverPortStr,port);
}else {
//产生随机的端口号 端口启动的范围 9000 10000
int maxPort = 10000;
int minPort = 9000;
Random random = new Random();
port = String.valueOf(random.nextInt(maxPort - minPort + 1) + minPort);
boolean flag = checkPortUsed(port);
if(flag){
Properties properties = System.getProperties();
// 设置 端口号
properties.setProperty(serverPortStr,port);
}else {
new RuntimeException("启动服务器 指定端口异常");
}
}
}
/**
* 校验 端口是否被占用
* @param port
*/
private boolean checkPortUsed(String port){
int countNum = 1;
while (true){
try {
ServerSocket serverSocket = new ServerSocket(Integer.valueOf(port));
serverSocket.close();
return true;
}catch (Exception e){
log.error("随机产生port异常。port->{},e->{}",port,e);
}
countNum++;
if(countNum > 3){
// 循环超过三次 则提示产生端口异常 退出
return false;
}
}
}
}