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随机端口启动内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 简单了解springboot加载配置文件顺序

    简单了解springboot加载配置文件顺序

    这篇文章主要介绍了简单了解springboot加载配置文件顺序,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-06-06
  • JAVA swing布局管理器实例解析

    JAVA swing布局管理器实例解析

    这篇文章主要介绍了JAVA swing布局管理器实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-03-03
  • 使用Log4j2代码方式配置实现线程级动态控制

    使用Log4j2代码方式配置实现线程级动态控制

    这篇文章主要介绍了使用Log4j2代码方式配置实现线程级动态控制,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-12-12
  • Spring Cloud Alibaba Nacos服务治理平台服务注册、RestTemplate实现微服务之间访问负载均衡访问的问题

    Spring Cloud Alibaba Nacos服务治理平台服务注册、RestTemplate实现微服务之间访

    这篇文章主要介绍了Spring Cloud Alibaba:Nacos服务治理平台,服务注册、RestTemplate实现微服务之间访问,负载均衡访问,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-06-06
  • Java数据结构之平衡二叉树的原理与实现

    Java数据结构之平衡二叉树的原理与实现

    平衡树(Balance Tree,BT) 指的是,任意节点的子树的高度差都小于等于1。常见的符合平衡树的有,B树(多路平衡搜索树)、AVL树(二叉平衡搜索树)等。本文将详细介绍平衡二叉树的概念和实现原理以及它的实现
    2022-01-01
  • java 异常捕获及处理案例详解

    java 异常捕获及处理案例详解

    这篇文章主要介绍了java 异常捕获及处理案例详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-09-09
  • java上乘武功入门--反射

    java上乘武功入门--反射

    反射是Java的一种机制,一般也叫做反射机制,本文会讲反射机制是什么和怎么使用,喜欢的朋友可以观看一下,希望能给你带来帮助
    2021-07-07
  • Java超详细介绍抽象类与接口的使用

    Java超详细介绍抽象类与接口的使用

    在类中没有包含足够的信息来描绘一个具体的对象,这样的类称为抽象类,接口是Java中最重要的概念之一,它可以被理解为一种特殊的类,不同的是接口的成员没有执行体,是由全局常量和公共的抽象方法所组成,本文给大家介绍Java抽象类和接口,感兴趣的朋友一起看看吧
    2022-05-05
  • java中TestNG使用教程详解

    java中TestNG使用教程详解

    TestNG是Java中的一个测试框架, 类似于JUnit 和NUnit, 本文主要介绍了java中TestNG使用教程详解,具有一定的参考价值,感兴趣的可以了解一下
    2021-12-12
  • springboot使用@Validated或@Valid注解校验参数方式

    springboot使用@Validated或@Valid注解校验参数方式

    这篇文章主要介绍了springboot使用@Validated或@Valid注解校验参数方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-07-07

最新评论