SpringBoot运维中的高级配置

🙈作者简介:练习时长两年半的Java up主
🙉个人主页:程序员老茶
🙊 ps:点赞👍是免费的,却可以让写博客的作者开心好久好久😎
📚系列专栏:Java全栈,计算机系列(火速更新中)
💭 格言:种一棵树最好的时间是十年前,其次是现在
🏡动动小手,点个关注不迷路,感谢宝子们一键三连

目录

  • 课程名:Java
    • 内容/作用:知识点/设计/实验/作业/练习
    • 学习:SpringBoot运维中的高级配置
    • SpringBoot运维中的高级配置
      • 1. 临时属性设置
        • 1.1 属性加载优先级
        • 1.2 开发环境中使用临时属性
      • 2. 配置文件分类
      • 3. 自定义配置文件

课程名:Java

内容/作用:知识点/设计/实验/作业/练习

学习:SpringBoot运维中的高级配置

SpringBoot运维中的高级配置

​ 关于配置在之前讲过一部分,之前的配置总体上来说就是让各位小伙伴掌握配置的格式。比如配置文件如何写啊,写好的数据如何读取啊,都是基础的语法级知识。在后面的学习中就要集中在配置的应用这个方面了,下面就开始配置高级相关内容的第一部分学习,为什么说第一部分,因为在实际开发实用中还有对应的配置高级知识要进行学习。

1. 临时属性设置

​ 目前我们的程序包打好了,可以发布了。但是程序包打好以后,里面的配置都已经是固定的了,比如配置了服务器的端口是8080。如果我要启动项目,发现当前我的服务器上已经有应用启动起来并且占用了8080端口,这个时候就尴尬了。难道要重新把打包好的程序修改一下吗?比如我要把打包好的程序启动端口改成80。
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

​ SpringBoot提供了灵活的配置方式,如果你发现你的项目中有个别属性需要重新配置,可以使用临时属性的方式快速修改某些配置。方法也特别简单,在启动的时候添加上对应参数就可以了。

java –jar springboot.jar –-server.port=80

​ 上面的命令是启动SpringBoot程序包的命令,在命令输入完毕后,空一格,然后输入两个-号。下面按照属性名=属性值的形式添加对应参数就可以了。记得,这里的格式不是yaml中的书写格式,当属性存在多级名称时,中间使用点分隔,和properties文件中的属性格式完全相同。

​ 如果你发现要修改的属性不止一个,可以按照上述格式继续写,属性与属性之间使用空格分隔。

java –jar springboot.jar –-server.port=80 --logging.level.root=debug
1.1 属性加载优先级

​ 现在我们的程序配置受两个地方控制了,第一配置文件,第二临时属性。并且我们发现临时属性的加载优先级要高于配置文件的。那是否还有其他的配置方式呢?其实是有的,而且还不少,打开官方文档中对应的内容,就可以查看配置读取的优先顺序。
地址:https://docs.spring.io/spring-boot/docs/current/reference/html/spring-boot-features.html#boot-features-external-config

在这里插入图片描述

​ 我们可以看到,居然有14种配置的位置,而我们现在使用的是这里面的2个。第3条Config data说的就是使用配置文件,第11条Command line arguments说的就是使用命令行临时参数。而这14种配置的顺序就是SpringBoot加载配置的顺序,言外之意,命令行临时属性比配置文件的加载优先级高,所以这个列表上面的优先级低,下面的优先级高。其实这个东西不用背的,你就记得一点,你最终要什么效果,你自己是知道的,不管这个顺序是怎么个高低排序,开发时一定要配置成你要的顺序为准。这个顺序只是在你想不明白问题的时候帮助你分析罢了。

​ 比如你现在加载了一个user.name属性。结果你发现出来的结果和你想的不一样,那肯定是别的优先级比你高的属性覆盖你的配置属性了,那你就可以看着这个顺序挨个排查。哪个位置有可能覆盖了你的属性。

​ 看到小伙伴学习之前内容的时候问这个问题了,就是这个原因造成的。在yaml中配置了user.name属性值,然后读取出来的时候居然不是自己的配置值,因为在系统属性中有一个属性叫做user.name,两个相互冲突了。而系统属性的加载优先顺序在上面这个列表中是5号,高于3号,所以SpringBoot最终会加载系统配置属性user.name。

总结

  1. 使用jar命令启动SpringBoot工程时可以使用临时属性替换配置文件中的属性
  2. 临时属性添加方式:java –jar 工程名.jar –-属性名=值
  3. 多个临时属性之间使用空格分隔
  4. 临时属性必须是当前boot工程支持的属性,否则设置无效
1.2 开发环境中使用临时属性

​ 临时使用目前是有了,但是上线的时候通过命令行输入的临时属性必须是正确的啊,那这些属性配置值我们必须在开发环境中测试好才行。下面说一下开发环境中如何使用临时属性,其实就是Idea界面下如何操作了。

​ 打开SpringBoot引导类的运行界面,在里面找到配置项。其中Program arguments对应的位置就是添加临时属性的,可以加几个试试效果。

​ 做到这里其实可以产生一个思考了,如果对java编程熟悉的小伙伴应该知道,我们运行main方法的时候,如果想使用main方法的参数,也就是下面的args参数,就是在上面这个位置添加的参数。

public static void main(String[] args) {
}

​ 原来是这样,通过这个args就可以获取到参数。再来看我们的引导类是如何书写的

public static void main(String[] args) {SpringApplication.run(SSMPApplication.class,args);
}

​ 这个args参数居然传递给了run方法,看来在Idea中配置的临时参数就是通过这个位置传递到我们的程序中的。言外之意,这里如果不用这个args是不是就断开了外部传递临时属性的入口呢?是这样的,我们可以使用下面的调用方式,这样外部临时属性就无法进入到SpringBoot程序中了。

public static void main(String[] args) {SpringApplication.run(SSMPApplication.class);
}

​ 或者还可以使用如下格式来玩这个操作,就是将配置不写在配置文件中,直接写成一个字符串数组,传递给程序入口。当然,这种做法并没有什么实际开发意义。

public static void main(String[] args) {String[] arg = new String[1];arg[0] = "--server.port=8082";SpringApplication.run(SSMPApplication.class, arg);
}

总结

  1. 启动SpringBoot程序时,可以选择是否使用命令行属性为SpringBoot程序传递启动属性

思考

​ 现在使用临时属性可以在启动项目前临时更改配置了,但是新的问题又出来了。临时属性好用是好用,就是写的多了会很麻烦。比如我现在有个需求,上线的时候使用临时属性配置20个值,这下可麻烦了,能不能搞得简单点,集中管理一下呢?比如说搞个文件,加载指定文件?还真可以。怎么做呢?咱们下一节再说。

2. 配置文件分类

​ SpringBoot提供了配置文件和临时属性的方式来对程序进行配置。前面一直说的是临时属性,这一节要说说配置文件了。其实这个配置文件我们一直在使用,只不过我们用的是SpringBoot提供的4级配置文件中的其中一个级别。4个级别分别是:

  • 类路径下配置文件(一直使用的是这个,也就是resources目录中的application.yml文件)
  • 类路径下config目录下配置文件
  • 程序包所在目录中配置文件
  • 程序包所在目录中config目录下配置文件

​ 好复杂,一个一个说。其实上述4种文件是提供给你了4种配置文件书写的位置,功能都是一样的,都是做配置的。那大家关心的就是差别了,没错,就是因为位置不同,产生了差异。总体上来说,4种配置文件如果都存在的话,有一个优先级的问题,说白了就是加入4个文件我都有,里面都有一样的配置,谁生效的问题。上面4个文件的加载优先顺序为

  1. file :config/application.yml 【最高】
  2. file :application.yml
  3. classpath:config/application.yml
  4. classpath:application.yml 【最低】

​ 那为什么设计这种多种呢?说一个最典型的应用吧。

  • 场景A:你作为一个开发者,你做程序的时候为了方便自己写代码,配置的数据库肯定是连接你自己本机的,咱们使用4这个级别,也就是之前一直用的application.yml。
  • 场景B:现在项目开发到了一个阶段,要联调测试了,连接的数据库是测试服务器的数据库,肯定要换一组配置吧。你可以选择把你之前的文件中的内容都改了,目前还不麻烦。
  • 场景C:测试完了,一切OK。你继续写你的代码,你发现你原来写的配置文件被改成测试服务器的内容了,你要再改回来。现在明白了不?场景B中把你的内容都改掉了,你现在要重新改回来,以后呢?改来改去吗?

​ 解决方案很简单,用上面的3这个级别的配置文件就可以快速解决这个问题,再写一个配置就行了。两个配置文件共存,因为config目录中的配置加载优先级比你的高,所以配置项如果和级别4里面的内容相同就覆盖了,这样是不是很简单?

​ 级别1和2什么时候使用呢?程序打包以后就要用这个级别了,管你程序里面配置写的是什么?我的级别高,可以轻松覆盖你,就不用考虑这些配置冲突的问题了。

总结

  1. 配置文件分为4种

    • 项目类路径配置文件:服务于开发人员本机开发与测试
    • 项目类路径config目录中配置文件:服务于项目经理整体调控
    • 工程路径配置文件:服务于运维人员配置涉密线上环境
    • 工程路径config目录中配置文件:服务于运维经理整体调控
  2. 多层级配置文件间的属性采用叠加并覆盖的形式作用于程序

3. 自定义配置文件

​ 之前咱们做配置使用的配置文件都是application.yml,其实这个文件也是可以改名字的,这样方便维护。比如我2023年12月1日搞活动,走了一组配置,2023年12月10日活动取消,恢复原始配置,这个时候只需要重新更换一下配置文件就可以了。但是你总不能在原始配置文件上修改吧,不然搞完活动以后,活动的配置就留不下来了,不利于维护。

​ 自定义配置文件方式有如下两种:

方式一:使用临时属性设置配置文件名,注意仅仅是名称,不要带扩展名


方式二:使用临时属性设置配置文件路径,这个是全路径名


​ 也可以设置加载多个配置文件


​ 使用的属性一个是spring.config.name,另一个是spring.config.location,这个一定要区别清楚。

温馨提示

​ 我们现在研究的都是SpringBoot单体项目,就是单服务器版本。其实企业开发现在更多的是使用基于SpringCloud技术的多服务器项目。这种配置方式和我们现在学习的完全不一样,所有的服务器将不再设置自己的配置文件,而是通过配置中心获取配置,动态加载配置信息。为什么这样做?集中管理。

总结

  1. 配置文件可以修改名称,通过启动参数设定
  2. 配置文件可以修改路径,通过启动参数设定
  3. 微服务开发中配置文件通过配置中心进行设置
往期专栏
Java全栈开发
数据结构与算法
计算机组成原理
操作系统
数据库系统
物联网控制原理与技术

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

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

相关文章

k8s1.24+prometheus+grafana容器监控与告警

快速部署k8s-1.24 基础配置[三台centos] 1.关闭防火墙与selinux systemctl stop firewalld systemctl disable firewalld sed -i ‘s/enforcing/disabled/’ /etc/selinux/config setenforce 0 2.添加host记录 cat >>/etc/hosts <<EOF 192.168.180.210 k8s-master…

2023年【烟花爆竹经营单位主要负责人】免费试题及烟花爆竹经营单位主要负责人模拟考试

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 烟花爆竹经营单位主要负责人免费试题参考答案及烟花爆竹经营单位主要负责人考试试题解析是安全生产模拟考试一点通题库老师及烟花爆竹经营单位主要负责人操作证已考过的学员汇总&#xff0c;相对有效帮助烟花爆竹经营…

前端复制文本、下载图片

复制文本 // 复制 copy(data) {var oInput document.createElement("input");oInput.value data;document.body.appendChild(oInput);oInput.select();document.execCommand("Copy");oInput.style.display "none"; }input不能识别\n&#xf…

vscode报错:建立连接:XHR failed

文章目录 问题解决方案 问题 Windows端ssh远程连接Linux端&#xff0c;Windows端vscode报错&#xff1a;“…XHR failed.” 解决方案 参考&#xff1a;解决 Windows 端 VS Code “无法与 “…“ 建立连接&#xff1a;XHR failed.” 问题 亲测有效。 总结&#xff1a; linux…

TreeSelect 树型选择控件 编辑回显时所选的值与展开后的数据不对应 解决方案

一、业务场景&#xff1a; 最近在使用Vue框架和antd-vue组件库的时候&#xff0c;发现在做编辑回显时** TreeSelect 树型选择控件** 组件的选中的值能拿到&#xff0c;但是在下拉列表的回显位置有偏差。为了大家后面遇到和我一样的问题&#xff0c;给大家分享一下 二、bug信息…

基于ssm毕业生就业管理平台论文

摘 要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本毕业生就业管理平台就是在这样的大环境下诞生&#xff0c;其可以帮助管理者在短时间内处理完毕庞大的数据信…

Mesh里面的MFB是什么文件,工程重置了能否还原?

答&#xff1a;模方工程重置了以后&#xff0c;如果有备份可以还原。 模方是一款针对实景三维模型的冗余碎片、水面残缺、道路不平、标牌破损、纹理拉伸模糊等共性问题研发的实景三维模型修复编辑软件。模方4.1新增自动单体化建模功能&#xff0c;支持一键自动提取房屋结构&am…

JVM垃圾回收算法

自动化的管理内存资源&#xff0c;垃圾回收机制必须要有一套算法来进行计算&#xff0c;哪些是有效的对象&#xff0c;哪些是无效的对象&#xff0c;对于无效的对象就要进行回收处理。 常见的垃圾回收算法有&#xff1a;引用计数法、标记清除法、标记压缩法、复制算法、分代算…

如何消除视频中的背景噪音

如果你在繁忙的街道上、刮风的日子、或在其他有嘈杂声音的周围拍摄视频&#xff0c;则会产生令人烦恼的噪音。幸运的是&#xff0c;从视频中消除背景噪音并不是一件困难的事情&#xff0c;因为有许多可靠的降噪软件可以提供帮助。本文就收集了3种最佳方法&#xff0c;可帮助你轻…

基于AnolisOS国产操作系统打造Python3.11.0容器基础开发环境

一 背景 随着国内操作系统市场的不断发展&#xff0c;AnolisOS作为一款优秀的国产操作系统&#xff0c;逐渐受到了广大开发者的关注。为了满足Python开发者的需求&#xff0c;本文将介绍如何基于AnolisOS打造Python3.11.0容器基础开发环境&#xff0c;为开发者提供更高效、更稳…

C语言——从终端输入 3 个数 a、b、c,按从大到小的顺序输出。

方式一 #include <stdio.h> int main() {int a, b, c, temp;printf("请输入三个数&#xff1a;\n");scanf("%d %d %d", &a, &b, &c);if (a < b) {temp a;a b;b temp;}if (a < c) {temp a;a c;c temp;}if (b < c) {temp…

[RoarCTF 2019]Easy Calc1 wp

[RoarCTF 2019]Easy Calc1 wp 预测试 手工测试 这个页面实现了一个简单的计算器功能&#xff0c;当输入 11 时能正确返回执行结果 2&#xff0c; 但当输入 11&&ifconfig 之类的表达式时&#xff0c;会出现弹窗&#xff1a; 查看源码 前端页面调用了一个函数&#xf…

掌握 RPC 接口测试:一篇详尽的接口测试手册

RPC 是什么&#xff1f; 远程过程调用协议&#xff08;RPC&#xff09;是一种技术&#xff0c;它允许在不同的机器上执行函数&#xff0c;就好像这些函数是本地调用一样。简单地说&#xff0c;客户端系统透明地从网络上的远程服务器软件请求服务&#xff0c;而无需理解复杂的网…

借助文档控件Aspose.Words,在Java中比较 Word、PDF 和 PPT 文档

文档比较是各个领域的一项关键任务&#xff0c;包括法律、出版和内容管理。它确保准确跟踪和审查对合同、报告或法律协议等文档的更改。Java 开发人员经常寻求高效可靠的方法来执行文档比较&#xff0c;而Aspose提供了强大的解决方案。在这篇博文中&#xff0c;我们将探讨如何高…

浏览器的事件循环机制(Event loop)

事件循环 浏览器的进程模型 何为进程&#xff1f; 程序运行需要有它自己专属的内存空间&#xff0c;可以把这块内存空间简单的理解为进程 每个应用至少有一个进程&#xff0c;进程之间相互独立&#xff0c;即使要通信&#xff0c;也需要双方同意。 何为线程&#xff1f; …

C语言——字符函数和字符串函数(二)

&#x1f4dd;前言&#xff1a; 上一篇文章C语言——字符函数和字符串函数&#xff08;一&#xff09;对字符函数和字符串函数strlen&#xff0c;strcpy和strncpy&#xff0c;strcat和strncat进行了初步的讲解 这篇文章主要再讲解几个我们常用到的其他字符串函数&#xff08;附…

什么是加密和解密?如何进行数据加密和解密操作?

引言 数据加密和解密是信息安全领域中至关重要的概念。在现代通信和数据传输中&#xff0c;加密技术被广泛应用以确保数据的机密性和完整性。本文将介绍什么是加密和解密&#xff0c;以及如何在C语言中进行数据加密和解密的基本操作。 什么是加密和解密&#xff1f; 加密&am…

teamCity使用

1.server部署 2.地址 http://10.172.48.7:32204/favorite/projects?modebuilds 3.新增项目 拉取git项目 编辑配置 复制其他项目配置 步骤1.Maven 步骤2 build image 步骤3 push image 步骤4 deploy to k8s

mfc140u.dll丢失的解决方法的详细介绍,六种解决mfc140u.dll丢失的方法

今天的这篇文章将向各位分享一个有关电脑出现关于丢失mfc140u.dll错误的弹窗问题&#xff0c;这是一个很常见的问题。无论你是一名大学生还是其他身份&#xff0c;都可能会遇到这个问题。下面我会对mfc140u.dll丢失的解决方法进行详细的介绍。 一.六种解决mfc140u.dll丢失的方法…

Android笔记(十八):面向Compose组件结合Retrofit2和Rxjava3实现网络访问

一、Retrofit2 Square公司推出的Retrofit2库&#xff08;https://square.github.io/retrofit/&#xff09;&#xff0c;改变了网络访问的方式。它实现了网络请求的封装。Retrofit库采用回调处理方式&#xff0c;使得通过接口提交请求和相应的参数的配置&#xff0c;就可以获得…