K8s 上Spring boot环境变量配置无法生效问题

这篇具有很好参考价值的文章主要介绍了K8s 上Spring boot环境变量配置无法生效问题。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

问题场景:

首先介绍一下,问题发现的场景,存在一个项目,在本地开发环境上,spring项目的数据库、redis等中间件的配置参数都是配置在application.yml 文件里的,所以修改配置直接改改文件就可以了,但是当项目部署在k8s的集群上,想要通过修改application.yml文件里的配置项,发现修改无效。

尝试解决

如图,在多次修改application.yml 文件里的连接配置之后,然后发现连接的仍然是修改的之前的配置。

application.yml的配置
K8s 上Spring boot环境变量配置无法生效问题
运行时的连接
K8s 上Spring boot环境变量配置无法生效问题
既然,配置无法加载,然后直接写死在Config配置类中,暴力解决
K8s 上Spring boot环境变量配置无法生效问题

原因分析:

提示:这里填写问题的分析:

例如:Handler 发送消息有两种方式,分别是 Handler.obtainMessage()Handler.sendMessage(),其中 obtainMessage 方式当数据量过大时,由于 MessageQuene 大小也有限,所以当 message 处理不及时时,会造成先传的数据被覆盖,进而导致数据丢失。
虽然暴力解决了当时的问题,但是毕竟不够优雅。事后,有时间,我考虑了发现这种情况的原因,既然修改不生效,那生效的配置是从何而来,在我一顿操作之后发现,该一直生效的配置是通过K8s的deployment配置的。问题到了这里,就出现了一个新的问题,那就是为什么k8s的配置生效了,application的配置没有生效。理由很简单,就是配置优先级问题。


Spring boot 配置优先级

Spring Boot使用一个非常特殊的PropertySource顺序,该顺序旨在允许对值进行合理的重写。后来的属性源可以覆盖早期属性源中定义的值。默认顺序如下:

参考:Spring官方文档:

  1. 默认属性(通过设置SpringApplication.setDefaultProperties指定)。
  2. @PropertySource在您的@Configuration类上的注释。请注意,在刷新应用程序上下文之前,不会将此类属性源添加到环境中。现在配 置某些属性(如logging.和spring.main.)已经太晚了,这些属性在刷新开始之前被读取。
  3. 配置数据(如application.properties文件)。
  4. 仅具有随机属性的RandomValuePropertySource。*。
  5. OS环境变量。
  6. Java系统属性(System.getProperties())。
  7. 来自java:comp/env的JNDI属性。
  8. ServletContext init参数。
  9. ServletConfig init参数。
  10. SPRING_APPLICATION_JSON的属性(嵌入环境变量或系统属性中的内联JSON)。
  11. 命令行参数。
  12. 测试中的属性属性。在@SpringBootTest和测试注释上可用,用于测试应用程序的特定片段。
  13. @TestPropertySource 测试上的注释。
  14. 当devtools处于活动状态时,Devtools在$HOME/.config/spring-boot目录中的全局设置属性。

解决方案:

现在问题就迎刃而解了,application.yml 等同于application.properties 文件,顺序在3,K8s配置的环境变量是OS环境变量,顺序在7,重写了application的配置。但问题没有这么简单,数据连接配置是通过@Value 读取的,@Value 中的变量名并不跟k8s中配置的并不一致。

注入的变量名:

K8s 上Spring boot环境变量配置无法生效问题

k8s上的变量名:

K8s 上Spring boot环境变量配置无法生效问题
通过上面的对比,两者之间存在一定的相似性,怀疑是spring对环境变量做了解析映射,本着刨根问底的心态,最后发现在SystemEnvironmentPropertySource 类发现了Spring 对系统环境变量的解析处理,源码如下:

protected final String resolvePropertyName(String name) {
   Assert.notNull(name, "Property name must not be null");
   String resolvedName = checkPropertyName(name);
   if (resolvedName != null) {
      return resolvedName;
   }
   String uppercasedName = name.toUpperCase();
   if (!name.equals(uppercasedName)) {
      resolvedName = checkPropertyName(uppercasedName);
      if (resolvedName != null) {
         return resolvedName;
      }
   }
   return name;
}

@Nullable
private String checkPropertyName(String name) {
   // Check name as-is
   if (containsKey(name)) {
      return name;
   }
   // Check name with just dots replaced
   String noDotName = name.replace('.', '_');
   if (!name.equals(noDotName) && containsKey(noDotName)) {
      return noDotName;
   }
   // Check name with just hyphens replaced
   String noHyphenName = name.replace('-', '_');
   if (!name.equals(noHyphenName) && containsKey(noHyphenName)) {
      return noHyphenName;
   }
   // Check name with dots and hyphens replaced
   String noDotNoHyphenName = noDotName.replace('-', '_');
   if (!noDotName.equals(noDotNoHyphenName) && containsKey(noDotNoHyphenName)) {
      return noDotNoHyphenName;
   }
   // Give up
   return null;
}

问题到了现在,总算是水落石出了,jdbc.postgres.url 会被解析成JDBC_POSTGRES_URL,所以可以读取到该系统变量。文章来源地址https://www.toymoban.com/news/detail-402931.html

到了这里,关于K8s 上Spring boot环境变量配置无法生效问题的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 记一次配置文件spring.profiles.active环境变量不生效的问题

    三个环境的配置文件 分别是grayTg, proTg, testTg application.properties设置环境变量由IDEA统一管理  Maven中配置profile能让你为不同的环境定义不同的构建;包括本地测试环境,灰度环境, 生产环境这三个环境。可以用如下的标签配置在pom.xml文件中 本地Docker打包时, 无法解析环境配置

    2024年01月17日
    浏览(44)
  • 03-k8s的pod资源01-数据持久化、env环境变量、网络暴露

    1,pod资源是k8s集群当中,最小的管理单位; 2,其他所有资源都是围绕着为pod资源提供服务的;给pod提供服务的; 3,pod就是“一组”容器,一个pod中可以有1个或者多个容器;         emptyDir存储卷,本质上是一个临时的目录,其生命周期与pod相同,pod被删除,则数据也会被

    2024年02月21日
    浏览(40)
  • k8s环境部署配置

    目录 一.虚拟机准备 二.基础环境配置(各个节点都做) 1.IP和hosts解析 2.防火墙和selinux 3.安装基本软件 4.配置时间同步 5.禁用swap分区 6.修改内核参数并重载 7.配置ipvs 三.docker环境(各个节点都做) 1.配置软件源并安装docker-ce 2.配置docker加速 四.cri环境配置(各个节点都做)

    2024年02月10日
    浏览(42)
  • k8s源码阅读环境配置

      k8s代码的阅读可以让我们更加深刻的理解k8s各组件的工作原理,同时提升我们Go编程能力。   IDE使用Goland,代码阅读环境需要进行如下配置: 从github上下载代码:https://github.com/kubernetes/kubernetes 在GOPATH目录下新建文件夹:$GOPATH/src/k8s.io/kubernetes 将下载的zip包解压后,将kub

    2024年01月21日
    浏览(44)
  • Spring Cloud 使用 k8s 作为注册中心 开发环境 和 生产环境

    因为 k8s 本身就有拥有注册中心,和配置中心的功能。如果还是用 Nacos、Eureka、Consul 之类的注册中心组件,就有点冗余了。当然这些组件还是可以继续用的。 所以,本教程,教授 Spring Cloud 使用 k8s 的注册中心。在开发环境和生产环境 的教程! 下面以一个最简单的 服务消费

    2024年02月15日
    浏览(56)
  • 【K8S专题】一、集群环境规划配置

      Kubernetes(k8s)是一个开源的容器编排平台,它可以协调和管理容器化应用程序的生命周期。 Kubernetes集群具有以下优势: 高可用性:Kubernetes提供了多种机制来保证应用程序的高可用性,包括自动化的容器重启和故障转移机制。 可扩展性:Kubernetes可以自动扩展应用程序的

    2023年04月24日
    浏览(38)
  • K8s环境下监控告警平台搭建及配置

    Promethues是可以单机搭建的,参考 prometheus入门 [1] 本文是就Promethues+Grafana在K8s环境下的搭建及配置 启动minikube minikube start 安装helm 使用Helm Chart 安装 Prometheus Operator: helm install prometheus-operator stable/prometheus-operator -n monitoring 报错: 根据 Kubernetes和微服务监控体系 [2] (搜索\\\"降低我们

    2024年02月13日
    浏览(55)
  • k8s搭建(一、环境配置与docker安装)

    天行健,君子以自强不息;地势坤,君子以厚德载物。 每个人都有惰性,但不断学习是好好生活的根本,共勉! 文章均为学习整理笔记,分享记录为主,如有错误请指正,共同学习进步。 k8s搭建文章: k8s搭建(一、k8s环境配置与docker安装) k8s搭建(二、k8s组件安装) k8s搭

    2024年02月21日
    浏览(46)
  • 解决Spring Boot项目中pom.xml环境配置 打包后生效 但idea版本运行无效的问题

    上文 Spring Boot中通过maven进行多环境配置 中我们通过pom.xml配置了环境选择 但这个只有在打包出来的jar中生效 我们直接通过 idea启动 这个东西确实是有点问题 其实 我们执行一下 compile 手工编译一下 然后重新启动 很明显 我们这里配置就已经生效了 这个就是 我们每次改pom.x

    2024年02月10日
    浏览(49)
  • 超详细的kubeedge与kubernetes(k8s)环境配置教程

    注意: 对于kubeedge和k8s的监控可以参考这一篇——通过prometheus和grafana来监管数据; 对于虚拟机环境的搭建可以参考这一篇。 对于搭建所需文件:阿里云盘 本文最后由错误归纳。 文章每周更新,如果喜欢的话可以三联!!! 云端只部署一个master节点,边缘端部署一个edgen

    2024年02月04日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包