实际开发过程中,每个项目的端口号都是设定好的,我们可以通过server.prot指定端口。
方案一
在SpringBoot中,可以通过${random}直接生成随机数字
server.prot=${random.int[2000,8000]}
通过随机数生成一个在2000到8000的一个随机端口,但是也会存在一些问题,如果这个端口已经在使用了,那么启动必然会报错
方案二
publicclassStartCommand{publicStartCommand(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}
获取可用端口代码
publicclassServerProtUtils{privatestaticfinalint MAX=65535;privatestaticfinalint MIN=2000;publicstaticintgetAvailablePort(){
Random random=newRandom();int port= random.nextInt(MAX)%(MAX- MIN+1)+ MIN;boolean using= NetUtils.isLocalPortUsing(port);if(using){returngetAvailablePort();}else{return port;}}}
最后通过NetUtils来检查端口是否可用,如果获取到可用的端口就直接返回,没有就继续获取
publicclassNetUtils{publicstaticbooleanisLocalPortUsing(int port){boolean flag=true;try{
flag=isPortUsing("127.0.0.1", port);}catch(Exception e){}return flag;}publicstaticbooleanisPortUsing(String host,int port){boolean flag=false;try{
InetAddress theAddress= InetAddress.getByName(host);
Socket socket=newSocket(theAddress,port);
flag=true;}catch(Exception e){}return flag;}}
最后在启动类中调用端口即可
@SpringBootApplicationpublicclassRibbonApplication{publicstaticvoidmain(String[] args){//启动参数设置,比如自动生成端口newStartCommand(args);
SpringApplication.run(RibbonApplication.class, args);}}