SpringBoot随机端口

实际开发过程中,每个项目的端口号都是设定好的,我们可以通过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);
    }

}

你可能感兴趣的:(java,spring,boot)