SpringBoot随机端口启动的实现

 更新时间:2021年07月21日 17:13:44   作者:TianXinCoord  
本文主要介绍了SpringBoot随机端口启动的实现,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起学习学习吧

一、SpringBoot随机端口

1.基础介绍

  • 随机端口可以自动找指定范围内可使用的端口,不需要在配置文件中指定固定的启动端口
  • 例如在SpringBoot中假如需要运行多个实例,则需要单独修改配置文件比较麻烦
  • 随机端口的原理就是与对应socket端口建立连接,能连接则已被使用,反之未被使用
  • 随机获取的端口校验可使用之后通过System.setProperty("属性名称", port);写入内存,然后就可以在配置文件中获取到
  • 如果写入的名称为server.port则不用在配置文件中指定端口,否则需要配置server.port=${属性名称}
  • 本实践基于SpringBoot普通工程,直接创建项目脚手架即可
  • 【tip】例如在SpringCloud项目中服务提供者,可以使用随机端口快速启动多个服务,而不需要单独修改配置文件再启动

2.实现步骤

创建ServerPortUtil .java端口工具类,使用socket连接指定端口,例如有以下条件

a. 指定端口范围为8000-65535
b. 识别端口是否使用,已被使用则继续随机产生
c. 如果全部端口不可使用则直接抛出错误,中断运行

import java.net.InetAddress;
import java.net.Socket;
import java.util.Random;

public class ServerPortUtil {
    private static final int MAX_PORT = 65535;
    private static final int MIN_PORT = 8000;

    public static String getAvailablePort() {
        Random random = new Random();
		// 最大尝试次数为端口范围
        int maxRetryCount = MAX_PORT - MIN_PORT;
        while (maxRetryCount > 0) {
        	// 指定范围内随机端口,随便写的算法,根据自己需要调整
            int port = random.nextInt(MAX_PORT - MIN_PORT) + MIN_PORT;
            boolean isUsed = isLocalePortUsing(port);
            if (!isUsed) {
                return String.valueOf(port);
            }
            --maxRetryCount;
        }
        System.out.println("系统暂无端口可用,运行结束");
        System.exit(1);
        return null;
    }

    /**
     * 检查给定端口是否可用
     *
     * @author tianxincode@163.com
     * @since 2020/10/14
     */
    public static boolean isLocalePortUsing(int port) {
        try {
            // 建立一个Socket连接, 如果该端口还在使用则返回true, 否则返回false, 127.0.0.1代表本机
            new Socket(InetAddress.getByName("127.0.0.1"), port);
            return true;
        } catch (Exception e) {
            // 异常说明端口连接不上,端口能使用
        }
        return false;
    }
}

创建StartCommand.java命令类,调用随机端口功能获取端口信息,然后将端口信息写入运行环境中
a. 如果传入的参数包含了端口则使用指定的,否则使用自动生成

import com.codecoord.randomport.util.ServerPortUtil;
import org.springframework.util.StringUtils;

public class StartCommand {
    /**
     * 端口属性名称,如果名称为server.port则在配置文件中不用指定,否则需要指定为此处配置的名称,如${auto.port}
     */
    private static final String SERVER_PORT = "auto.port";

    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;
                }
            }
        }

        String port;
        if (isServerPort) {
           port = serverPort.split("=")[1];
        } else {
            port = ServerPortUtil.getAvailablePort();
        }
        System.out.println("Current project port is " + port);
        System.setProperty(SERVER_PORT, port);
    }
}

在启动类启动前向环境写入端口信息

import com.codecoord.randomport.config.StartCommand;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplicatio
public class SpringbootRandomPortApplication {
    public static void main(String[] args) {
        // 写入端口信息 
        new StartCommand(args);
        SpringApplication.run(SpringbootRandomPortApplication.class, args);
    }
}

在配置文件中指定端口为随机生成的端口信息

server:
  # 随机端口配置
  port: ${auto.port}

项目测试 正常启动项目,可以在控制台看到启动的端口信息

在这里插入图片描述

在这里插入图片描述

二、SpringBoot多实例运行

SpringBoot的多实例运行在IDEA中配置如下

在这里插入图片描述

在这里插入图片描述

然后在启动上run/debug启动即可

到此这篇关于SpringBoot随机端口启动的实现的文章就介绍到这了,更多相关SpringBoot随机端口启动内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 客户端设置超时时间真的很重要

    客户端设置超时时间真的很重要

    今天小编就为大家分享一篇关于客户端设置超时时间真的很重要,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2018-12-12
  • Java中的HashSet集合存储数据的结构详解

    Java中的HashSet集合存储数据的结构详解

    这篇文章主要介绍了Java中的HashSet集合存储数据的结构详解,数组结构他把元素进行分组,相同哈希值的元素是一组,链表/红黑树结构把相同哈希值的元素链接到一起,存储数据到集合中,先计算元素的哈希值,需要的朋友可以参考下
    2023-09-09
  • SpringBoot注解@ConditionalOnClass底层源码实现

    SpringBoot注解@ConditionalOnClass底层源码实现

    这篇文章主要为大家介绍了SpringBoot注解@ConditionalOnClass底层源码实现,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-02-02
  • 解决Java & Idea启动tomcat的中文乱码问题

    解决Java & Idea启动tomcat的中文乱码问题

    这篇文章主要介绍了Java & Idea启动tomcat的中文乱码问题,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-07-07
  • Java数组优点和缺点_动力节点Java学院整理

    Java数组优点和缺点_动力节点Java学院整理

    本文给大家简单介绍下java数组的优点和缺点知识,需要的的朋友参考下吧
    2017-04-04
  • Java的RocketMq水平扩展及负载均衡详解

    Java的RocketMq水平扩展及负载均衡详解

    这篇文章主要介绍了Java的RocketMq水平扩展及负载均衡详解,RocketMQ是一个分布式具有高度可扩展性的消息中间件,本文旨在探索在broker端,生产端,以及消费端是如何做到横向扩展以及负载均衡的,需要的朋友可以参考下
    2024-01-01
  • Java实现矩阵顺时针旋转90度的示例

    Java实现矩阵顺时针旋转90度的示例

    今天小编就为大家分享一篇Java实现矩阵顺时针旋转90度的示例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-01-01
  • maven多profile 打包下 -P参和-D参数的实现

    maven多profile 打包下 -P参和-D参数的实现

    这篇文章主要介绍了maven多profile 打包下 -P参和-D参数的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-11-11
  • Java 驼峰命名法详解(必看篇)

    Java 驼峰命名法详解(必看篇)

    下面小编就为大家带来一篇Java 驼峰命名法详解(必看篇)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-05-05
  • IDEA2020.2.3中创建JavaWeb工程的完整步骤记录

    IDEA2020.2.3中创建JavaWeb工程的完整步骤记录

    这篇文章主要给大家介绍了关于IDEA2020.2.3中创建JavaWeb工程的完整步骤,文中通过图文介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-12-12

最新评论