在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 从…

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项目、前端项目、人工智能与大数据、简…

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

前言 爬虫的基本结构及工作流程 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…

Json三方库介绍

目录 Json是干什么的Json序列化代码Json反序列化代码 Json是干什么的 Json是一种轻量级的数据交换格式&#xff0c;也叫做数据序列化方式。Json完全独立于编程语言的文本格式来存储和表述数据。易于人阅读和编写&#xff0c;同时也易于机器解析和生成&#xff0c;并有效地提升…

【前后端】django与vue的结合使用

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、前后端分离的简介二、django与vue的结合使用三、总结 前言 随着开发语言及人工智能工具的普及&#xff0c;使得越来越多的人会主动学习使用一些开发工具&a…

企业级DDoS防护与内网文件安全防护:全方位策略与技术实践

在数字化转型的浪潮中&#xff0c;企业面临着日益严峻的网络安全威胁&#xff0c;其中DDoS&#xff08;分布式拒绝服务&#xff09;攻击与内网文件防护是两个至关重要的议题。本文将深入探讨企业如何通过综合运用多种技术和策略&#xff0c;构建起强大的DDoS防护体系与内网文件…

YOLOv9训练结果分析->mAP、Precision、Recall、FPS、Confienc、混淆矩阵分析

简介 这篇博客&#xff0c;主要给大家讲解我们在训练yolov9时生成的结果文件中各个图片及其中指标的含义&#xff0c;帮助大家更深入的理解&#xff0c;以及我们在评估模型时和发表论文时主要关注的参数有那些。本文通过举例训练过程中的某一时间的结果来帮助大家理解&#xf…

vue项目启动npm install和npm run serve时出现错误Failed to resolve loader:node-sass

1.常见问题 问题1&#xff1a;当执行npm run serve时&#xff0c;出现Failed to resolve loader: node-sass&#xff0c;You may need to install it 解决方法&#xff1a; npm install node-sass4.14.1问题2&#xff1a;当执行npm run serve时&#xff0c;出现以下错误 Fa…

水牛社靠谱吗,水牛社可以当做副业来做吗?

水牛社这个平台是否靠谱&#xff0c;能否作为副业的选择&#xff0c;一直是网友们热议的话题。实际上&#xff0c;水牛社是一个集合了众多网上赚钱活动任务和提供资源项目教程的综合性平台&#xff0c;它并非只局限于某一特定的项目&#xff0c;而是展现出多样化的特点。随着网…

SpringCloud系列(11)--将微服务注册进Eureka集群

前言&#xff1a;在上一章节中我们介绍并成功搭建了Eureka集群&#xff0c;本章节则介绍如何把微服务注册进Eureka集群&#xff0c;使服务达到高可用的目的 Eureka架构原理图 1、分别修改consumer-order80模块和provider-payment8001模块的application.yml文件&#xff0c;使这…

[vite] ts写配置根目录别名

参考:配置 Vite | Vite 写对象的形式吧 import { defineConfig } from vite import vue from vitejs/plugin-vue import path from path// https://vitejs.dev/config/ export default defineConfig({plugins: [vue()],resolve: {alias: {"": path.resolve(__dirname…