属性配置文件在任何应用程序中都非常重要。它们不仅可以让应用程序具备灵活性,还能够根据文件中配置的值产生不同的功能。实际上,在staging、开发、测试、UAT或生产环境中,我们都使用属性配置文件来驱动不同的行为。

通常情况下,属性配置文件会与代码一起打包,并且整个程序包都部署在执行环境中。这一方法中,如果你想更改任何配置(即便配置文件中也发生了更改),你需要重新发布代码。尽管这种方法行之有效,但是对于现在而言,效率还是太低了。因此我们需要一种外部化的配置。

在本文中,我将阐述Kubernetes如何为容器提供外部化、灵活的配置以及可移植性。ConfigMap主要是为了让应用程序的配置和部署解耦,这一功能可以让容器化应用程序具备可移植性。

如果你对Spring Cloud的生态很熟悉,那么接下来你会发现ConfigMap与Spring Cloud server十分类似。这里有两种使用ConfigMap的方法:

  1. 将ConfigMap作为一种环境变量

  2. 将ConfigMap挂载为文件

让我们开始进行实践!我们将使用一个简单的应用程序,基于Spring Boot、Docker和Kubernetes进行演示。

将ConfigMap作为一种环境变量

在本例中,我们将在Kubernetes中创建一个新的环境变量,并将其用于代码中。在Java中,可以通过System.getenv(String) API在代码中使用环境变量。在常规Java应用程序中,可以在J2EE应用程序容器(如Oracle WLS或IBM WAS)中设置环境变量,也可以在OS中设置环境变量。然而,在Kubernetes中情况并不相同。要使用环境变量,我们必须根据literal创建配置映射。

通过kubectl create configmap命令,我们创建了两个环境变量:app.name 和 app.desc。

我们来了解一下这背后发生了什么。

现在注意数据部分,在数据部分下,你会找到键值对。从技术上来说,ConfigMap仅仅是键值存储。属性的名称是键,属性的值是值。应用程序的代码会要求你查找这些键值对。

为了在Java代码中使用此环境变量,我们需要编写以下代码:

下面的代码段定义了两个K8s环境变量,分别为“ SPRING_BOOT_HELLO_WORLD_APP_NAME”和“ SPRING_BOOT_HELLO_WORLD_DESC”。这些变量将从ConfigMap app-env-config获取值。需要重点关注的是键。

属性配置文件可以在单个文件中保存很多个属性,以在不同环境中运行应用程序。在Spring Boot应用程序中,属性保存在classpath下的application.properties文件中。我们来看一下打包在应用程序jar包中的application.properties文件。

我们正在使用命令kubectl create configmap从单个文件或从多个文件创建ConfigMap。

现在让我们查看完整的代码。

将ConfigMap挂载为文件

在本节中,我将说明如何使用ConfigMap挂载文件以外部化配置。在此示例中,我将使用ConfigMap来外部化application.properties文件。即使默认文件打包在jar中,也位于src / main / resources下。简单来说,我们将通过ConfigMap所提供的文件来覆盖默认文件。

第一步是从application.properties创建ConfigMap。让我们了解如何在K8s中存储此ConfigMap。

通过ConfigMap,我们将挂载application.properties文件到K8s集群中,并且可以在应用程序中使用它。请注意,数据部分包含了application.properties的内容,键是文件名。

现在,为了覆盖默认配置文件,我们需要(通过ConfigMap)将application.properties挂载到应用程序的classpath中。Spring Boot通过提供不同的选项来提供这一功能。SpringApplication在以下位置从application.properties文件加载属性,并将它们添加到Spring Environment:

  • 当前目录的/config 子目录

  • 当前目录

  • classpath / config包

  • The classpath root

如果你想了解更多信息,可以查阅官方文档:

https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-external-config.html#boot-features-external-config-application-property-files

最简单,最好的方法是将application.properties挂载在“ / config”目录中。

仔细检查挂载路径,请注意ConfigMap的名称应与我们在上面创建的app-file-configmap完全相同,键为文件名。另外,请确保将volume mount配置的名称更改为volume配置的名称。

这段代码说明了如何在application.properties文件中定义属性。如果使用Spring推荐的标准方法的话,这十分简单。具体而言,就是使用@Value 注释将属性值注入到变量中。

现在,我们可以继续进行ConfigMap示例应用程序了。我们来看一下完整的代码段。

让我们创建一个Docker镜像并将其上传到Dockerhub。在本例中,镜像名称是k8s-springboot-helloworld-configmap—app。

以下是K8S pod配置文件:

现在我们使用NodePort服务类型创建服务,以便可以从K8S集群外部使用Welcome服务。

现在,让我们把这些更改应用于K8S。

导航到浏览器并访问http://:/welcome。在本例,应该是http:// 192.168.99.100:30880/welcome。

认真观察输出,返回的字符串是:

同时,检查代码中硬编码的环境变量的默认值,以及打包在jar中的application.properties的property默认值。你发现从ConfigMap中获取了环境变量和application.properties的值。

这个项目可以从我的Github中获取:

https://github.com/nikhilbhide/MicroServicesTutorial/tree/master/k8s_spring_boot_hello_world_config_map

两种方法,轻松上手ConfigMap!的更多相关文章

  1. 两种方法轻松搞定-- Eclipse 安装FindBugs插件

    1安装:首先到官方网站下载最新版本FindBugs    http://findbugs.sourceforge.net/downloads.html              将 edu.umd.c ...

  2. 【转】两种方法教你在Ubuntu下轻松关闭触摸板(TinkPad)

    Ubuntu是一个以桌面应用为主的Linux操作系统,所以在使用时我经常的触碰到触摸板,这样会造成我们一些的麻烦,所以要如何的关闭触摸板呢?我们一起来看看吧!   Ubuntu下如何关闭触摸板(Tin ...

  3. Python 使用 xlwings 往 excel中写入一列数据的两种方法

    1.准备一个二维列表,然后再range后面不指定任何选项,可以输出该二维列表中数据在一列中显示,如下代码: # -*- coding:utf-8 -*- import xlwings as xw li ...

  4. Hadoop基础-HDFS递归列出文件系统-FileStatus与listFiles两种方法

    Hadoop基础-HDFS递归列出文件系统-FileStatus与listFiles两种方法 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. fs.listFiles方法,返回Loc ...

  5. 在ArcEngine下实现图层属性过滤的两种方法

    转自chanyinhelv原文 在ArcEngine下实现图层属性过滤的两种方法 Normal 0 7.8 磅 0 2 false false false EN-US ZH-CN X-NONE /* ...

  6. PHP生成带logo图像二维码的两种方法

    本文主要和大家分享PHP生成带logo图像二维码的两种方法,主要以文字和代码的形式和大家分享,希望能帮助到大家. 一.利用Google API生成二维码Google提供了较为完善的二维码生成接口,调用 ...

  7. windows下获取IP地址的两种方法

    windows下获取IP地址的两种方法: 一种可以获取IPv4和IPv6,但是需要WSAStartup: 一种只能取到IPv4,但是不需要WSAStartup: 如下: 方法一:(可以获取IPv4和I ...

  8. android 之 启动画面的两种方法

    现在,当我们打开任意的一个app时,其中的大部分都会显示一个启动界面,展示本公司的logo和当前的版本,有的则直接把广告放到了上面.启动画面的可以分为两种设置方式:一种是两个Activity实现,和一 ...

  9. [转载]C#读写txt文件的两种方法介绍

    C#读写txt文件的两种方法介绍 by 大龙哥 1.添加命名空间 System.IO; System.Text; 2.文件的读取 (1).使用FileStream类进行文件的读取,并将它转换成char ...

  10. php如何防止图片盗用/盗链的两种方法(转)

    图片防盗链有什么用? 防止其它网站盗用你的图片,浪费你宝贵的流量.本文章向大家介绍php防止图片盗用/盗链的两种方法 Apache图片重定向方法 设置images目录不充许http访问 Apache服 ...

随机推荐

  1. 阿里云MaxCompute 2019-6月刊

    您好,MaxCompute 2019.6月刊为您带来6月产品.技术最新动态,欢迎阅读. 导读 [功能发布]6月产品重要发布 [文档更新]6月重要文档更新推荐 [干货精选]6月精选技术文章推荐 [活动回 ...

  2. MongoDB负载信息一目了然 阿里云HDM重磅发布MongoDB监控和诊断功能

    混合云数据库管理(HDM)的统一监控.告警.诊断功能新增了对MongoDB的支持. 通过直观的方式将MongoDB多个维度的负载信息统一整合,不仅可以清晰的查看实时负载信息,也可以方便的确认历史负载情 ...

  3. 运行docker容器镜像2(指定容器启动时启动的脚本)

    docker中启动容器有以下两种情况. 第一种是通过 # docker run containerid 启动一个容器. 第二种是重新启动已经关闭的容器. # docker start containe ...

  4. poj 2184 01背包变形【背包dp】

    POJ 2184 Cow Exhibition Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 14657   Accepte ...

  5. 学习Vue.js

    Vue.js官网 Vue.js官方教程 Vue.js教程 哔哩哔哩Vue.js教程 Vue.js百度百科

  6. @codeforces - 455E@ Function

    目录 @description@ @solution@ @accepted code@ @details@ @description@ 已知 a 序列,并给定以下关系: \[\begin{cases} ...

  7. 在SAE上使用Flask插件

    因为我之前学习的时候使用的是虚拟环境,下载的所有需要用到的插件都在flask这个文件夹里面,SAE上Flask的版本和我本地用的版本对不上,导致有时候import都不对,于是我就把本地的环境直接放到S ...

  8. oracle函数 last_day(d1)

    [功能]:返回日期d1所在月份最后一天的日期. [参数]:d1,日期型 [返回]:日期 [示例]select sysdate,last_day(sysdate)  hz from dual; 返回:2 ...

  9. TensorFlow 中的卷积网络

    TensorFlow 中的卷积网络 是时候看一下 TensorFlow 中的卷积神经网络的例子了. 网络的结构跟经典的 CNNs 结构一样,是卷积层,最大池化层和全链接层的混合. 这里你看到的代码与你 ...

  10. 使用HSV色彩空间遮罩绿色区域

    HSV 颜色空间 导入资源 In []: import matplotlib.pyplot as plt import matplotlib.image as mpimg ​ import numpy ...