实际开发过程中,每个项目的端口号都是设定好的,我们可以通过server.prot指定端口。
方案一
在SpringBoot中,可以通过${random}直接生成随机数字
server.prot=${random.int[2000,8000]}
通过随机数生成一个在2000到8000的一个随机端口,但是也会存在一些问题,如果这个端口已经在使用了,那么启动必然会报错
方案二
public 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.prot")){
isServerPort=true;
serverPort=arg;
break;
}
}
}
//没有指定端口,则随机生成一个可用端口
if(!isServerPort){
int prot = ServerProtUtils.getAvailablePort();
System.out.println("server.prot"+String.valueOf(prot));
System.setProperty("server.prot",String.valueOf(prot));
}else{
System.out.println("server.prot:"+serverPort.split("=")[1]);
System.setProperty("server.prot",serverPort.split("=")[1]);
}
}
}
通过对启动参数遍历判断,如果有指定端口后续就不生成了,如果没有指定就通过ServerProtUtils获取一个可以使用的端口,并设置到环境变量中,在application.properties中获取端口:
server.prot=${server.prot}
获取可用端口代码
public class ServerProtUtils {
private static final int MAX = 65535;
private static final int MIN = 2000;
public static int getAvailablePort() {
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;
}
}
}
最后通过NetUtils来检查端口是否可用,如果获取到可用的端口就直接返回,没有就继续获取
public class NetUtils {
public static boolean isLocalPortUsing(int port){
boolean flag = true;
try {
flag = isPortUsing("127.0.0.1", port);
} catch (Exception e) {
}
return flag;
}
public static boolean isPortUsing(String host,int port) {
boolean flag = false;
try {
InetAddress theAddress = InetAddress.getByName(host);
Socket socket = new Socket(theAddress,port);
flag = true;
} catch (Exception e) {
}
return flag;
}
}
最后在启动类中调用端口即可
@SpringBootApplication
public class RibbonApplication {
public static void main(String[] args) {
//启动参数设置,比如自动生成端口
new StartCommand(args);
SpringApplication.run(RibbonApplication.class, args);
}
}