在Spring boot中指定随机可用的端口

​ 正常情况下每个spring boot启动都有固定的端口,也就是8080,如果启动多个项目,很容易出现端口冲突,那么怎么解决这个问题呢?

解决方案1: random 随机端口

​ 在spring boot中,可以通过${random}来生成随机数字,b那么我们就可以在配置文件中,这样设置端口:

server:port: ${random.int(2000, 65535}

​ 通过random.int()方法,指定生成2000~65535的随机端口。这样每次启动的端口都不一样。但是这样就可以了吗?不是的,我们随机生辰的端口也会有可能被其他的进程所占用。

​ 那么,我们能否通过一个检测机制,让生成的随机端口一定是一个没有被占用的有效的随机端口呢?

​ 我们可以使用socket 建立一个和随机端口号的连接,如果能建立一个socket则说明该主机的该端口在使用。

解决方案2: 有效端口检测

实现思路:

​ 通过在项目启动前,获取有效的随机端口并通过System.setProperty将变量设置到系统的全局变量中,这样项目启动时就可以从全局变量中获取到server.port变量的值。

​ 这里的system,系统指的是 JRE (runtime)system,即设置jvm运行时的全局变量。

工具类:

​ NetUtils.java

@Slf4j
public class NetUtils {private static final Random random = new Random();/*** 获取可用端口** @return 可以使用端口*/public static int getAvailablePort() {int max = 65535;int min = 2000;int port = random.nextInt(max) % (max - min + 1) + min;boolean using = isPortUsing(port);log.info("正在测试端口:{} 是否可用", port);if (using) {log.info("端口:{} 可用", port);} else {log.info("端口:{} 不可用,重新获取端口", port);}return using ? port : getAvailablePort();}/*** 检查端口是否可用** @param port 端口号* @return true 可用  false 不可用*/public static boolean isPortUsing(int port) {boolean flag = true;try {InetAddress address = InetAddress.getByName("127.0.0.1");// 建立一个 socket连接new Socket(address, port).close();  //建立一个Socket连接flag = false;} catch (Exception ignored) {}return flag;}}

项目启动前设置server.port环境变量

​ StartCommand.java

/*** 该类为 springboot 启动时候配置端口的命令类*/
@Slf4j
public class StartCommand {public StartCommand() {int port = NetUtils.getAvailablePort();System.setProperty("server.port", String.valueOf(port));log.info("\n-----------最终的端口为{}----------------------最终的端口为{}-----------", port, port);}}

在 Springboot 启动类调用该方法

@SpringBootApplication
public class InterfacesApplication {public static void main(String[] args) {new StartCommand();SpringApplication.run(InterfacesApplication.class, args);System.out.println("\n-----------接口启动成功----------------------接口启动成功-----------");}}

最后在启动后每次都说不同的端口了

在这里插入图片描述

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/2397.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

linux的一些实用操作

快捷键 强制停止 ctrlc强制停止或退出命令的输入 退出登出 ctrld强制退出用户登录或退出某些程序的专属页面(如py) ps:不能退出vi/vim 历史命令搜索 history可以查看历史命令,用来复制粘贴 在使用history之后,…

fnm:Rust开发的高效Node版本管理工具

简介 fnm 是一个基于 Rust 开发的 Node 版本管理工具,它的目标是提供一个快速、简单且可靠的方式来管理 Node.js 的不同版本。同时,它是跨平台的,支持 macOS、Linux、Windows。🚀 Fast and simple Node.js version manager, buil…

pycharm-git 配置(1)

1.安装git2.pycharm 中配置git 插件 弹出Git版本号,即配置成功。3.创建本地仓库 VCS->VCS operations->create repository->设置本地目录 左下角可以看到git本地仓库git可以看到push,commit。 4.配置远方仓库,此时确保git上是有这个项目…

【linux】chmod权限开放(整个文件夹)

文章目录 起因权限查看权限修改 失败权限修改成功 起因 想要共享conda环境给同事,发现同事没权限。 权限查看 ls #查看当前目录 ls -l # 查看当前目录的东西和权限正常情况下是显示 三个rwx分别属于user,group,others 前面第一个rwx 是针…

美容预约小程序:简单三步,开启高效预约模式

在当今的数字化时代,一个小程序可以极大地提高美容院的效率和客户满意度。下面我们将详细说明如何通过以下步骤来搭建一个美容院预约小程序。 首先,你需要注册并登录到乔拓云网,这是 一个在线平台,可以帮助你快速创建并管理你的小…

腾讯云服务器,部署mysql数据库后无法远程访问?

一,首先确定自己部署的数据库,是否可以正常登录,验证部署是否是否成功 mysql -u root -p二、放开mysql远程访问权限,依次输入这些命令 create user root% identified with mysql_native_password by xxxxx; grant all privilege…

k8s学习(三十六)centos下离线部署kubernetes1.30(单主节点)

文章目录 服务器准备工作一、升级操作系统内核1 查看操作系统和内核版本2 下载内核离线升级包3 升级内核4 确认内核版本 二、修改主机名/hosts文件1 修改主机名2 修改hosts文件 三、关闭防火墙四、关闭SELINUX配置五、时间同步1 下载NTP2 卸载3 安装4 配置4.1 主节点配置4.2 从…

Mysql8 创建表,按年/月分区存储

一.创建订单表orders : CREATE TABLE orders ( order_id INT NOT NULL, order_date DATE NOT NULL, amount DECIMAL(10, 2) NOT NULL ) PARTITION BY RANGE (YEAR(order_date)) ( PARTITION p0 VALUES LESS THAN (1991), PARTITION p1 VALUES …

LeetCode热题Hot100 - 最长有效括号

一刷~ 给你一个只包含 ( 和 ) 的字符串,找出最长有效(格式正确且连续)括号子串的长度。 思路: 用栈保存最近的一个非有效括号子串的位置,当遇到(时,把当前下标入栈。遇到)时,出栈,出…

DPDK helloworld 解析

1. 学习目的 计划通过学习 DPDK 官方提供的 demo, 对 DPDK API 的使用有一些了解,helloworld 程序是其中最简单的程序,还是实际上手学习能更快一些。 2. 编译 helloworld 源码 环境变量设置: export RTE_SDK/home//dpdk/dpdk-stab…

nn.DataParallel

nn.DataParallel 是 PyTorch 中的一个模块,用于在多个 GPU 上并行运行模型。当有多个 GPU 并且想要利用它们来加速训练或推理时,这个模块会非常有用。nn.DataParallel 通过对模型中的每个子模块进行复制,并将输入数据分割成多个部分&#xff…

C++ iovec结构体

iovec是一个结构体,用于描述一个数据缓冲区。它通常与readv和writev系统调用一起使用,用于在一次系统调用中读取或写入多个缓冲区。 struct iovec {void *iov_base; // 缓冲区起始地址size_t iov_len; // 缓冲区长度 };ssize_t readv(int fd, const str…

Linux sudo suid提权练习

题目比较简单,可以利用sudo和多种suid程序提权,做个记录 进入靶场题目环境 获得节点信息 远程连接上 执行命令id,发现只是admin普通账户 sudo提权 发现存在 /usr/bin/vim, /usr/bin/bash, /usr/bin/more, /usr/bin/less, /usr/bin/nano, /…

计算机java项目|springboot校园一卡通

作者主页:编程指南针 作者简介:Java领域优质创作者、CSDN博客专家 、CSDN内容合伙人、掘金特邀作者、阿里云博客专家、51CTO特邀作者、多年架构师设计经验、腾讯课堂常驻讲师 主要内容:Java项目、Python项目、前端项目、人工智能与大数据、简…

数据驱动决策的13种思维

第一、信度与效度思维 信度与效度的概念最早来源于调查分析,但现在我觉得可以引申到数据分析工作的各方面。 所谓信度,是指一个数据或指标自身的可靠程度,包括准确性和稳定性取数逻辑是否正确?有没有计算错误?这属于准…

网络爬虫快速入门及爬取百度搜索结果(附源码)

前言 爬虫的基本结构及工作流程 1. 确定目标 首先,确定你想要爬取的目标,包括目标网站或网页、需要提取的数据类型(如文本、图片、视频等)以及爬取的深度(单页、整个网站等)。 2. 获取网页内容 使用HT…

AJAX——事件循环(EventLoop)

1.事件循环(EventLoop) 概念:JavaScript有一个基于事件循环的并发模型,事件循环负责执行代码、收集和处理事件以及执行队列中的子任务。这个模型与其它语言中的模型截然不同,比如C和Java。 原因:JavaScri…

【S32DS RTD实战】-1.5-S32DS使用Post-Build调用第三方插件-自动对生成的s19,Hex,Bin文件二次编辑

<--返回「Autosar_MCAL高阶配置」专栏主页--> 案例背景&#xff1a; 在《【S32DS RTD实战】-1.3-S32K3工程生成S19&#xff0c;BIN&#xff0c;Hex文件&#xff0c;以及Post-build steps的妙用_s32ds如何生成s19或hex文件-CSDN博客https://blog.csdn.net/qfmzhu/articl…

突破编程_C++_网络编程(一种高性能处理 TCP 粘包问题的方法)

1 前言 在“突破编程_C_网络编程&#xff08;Windows 套接字&#xff08;处理 TCP 粘包问题&#xff09;&#xff09;”一文中&#xff0c;已经讲解了 TCP 粘包问题&#xff0c;并且给出了样例代码。但是该样例代码的核心是使用队列&#xff08;std::queue&#xff09;做报文的…

【LeetCode热题100】【多维动态规划】编辑距离

题目链接&#xff1a;72. 编辑距离 - 力扣&#xff08;LeetCode&#xff09; 给你两个单词 word1 和 word2&#xff0c; 请返回将 word1 转换成 word2 所使用的最少操作数 你可以插入、删除、替换字符 定义dp[i][j]是将word1[0:i-1]转换成word2[0:j-1]所使用的最少操作数 如…