使用环境变量,让Spring Boot应用部署更加灵活

Spring Boot可以说是目前最火的开发框架了,几乎所有新的企业应用都会优先考虑使用Spring Boot,甚至一些之前老的应用系统也会改造为Spring Boot构建。其约定优于配置的特性使开发工作变得简单,大大节省了开发工作量和成本。Java也是因为拥有和Spring Boot一样优秀的众多开源框架,才能一直在编程语言排行榜前几名。

一个应用程序,不可避免的要使用各种配置文件,比如配置应用名称,应用版本,应用服务端口等。Spring Boot本身提供了多种配置方式,你可以把配置写在application.yml中,通常我们会使用spring.profiles.active来进行配置分离,实现应用在不同环境下使用不同的配置参数。但是这样有一个问题,就是这些配置必须都提前配置好,比如dev环境使用什么参数、prod环境使用什么参数,这些配置都被打包进了我们的应用。而当我们需要改变某个配置是则需要重新打包发布,这是非常麻烦的,尤其是当我们使用云平台、自动化部署、容器等服务时,重新打包会造成不必要的浪费,毕竟我们只是修改了一个配置而已,并且大多数企业对于这种重新打包发布很敏感,你很难在生产环境实现重新部署(各种审核流程)。

Spring Boot可以读取环境变量(宿主机,运行容器等),在云平台越来越流行的今天,我们的服务通常不是运行在一个真实的物理机上面的。使用这些容器平台很容配置我们想要的环境变量,把我们的配置暴露给环境变量,可以方便我们的应用部署和参数调整。

比如,我需要配置应用连接数据库的配置,通常我们在application.yml或者使用指定环境的application-prod.yml配置文件,写入以下配置:

spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://127.0.0.1/demo?serverTimezone=Asia/Shanghai
    username: demo
    password: demo
    hikari:
      maximum-pool-size: 30
      max-lifetime: 60000
      minimum-idle: 5

像上面那样,如果这时如果我们的数据库的用户密码变了或者我们想调整一个连接池的相关配置,一般来讲我们需要修改以上配置文件,然后重新打包发布(或者你说可以在压缩包内修改配置文件??),这种方式真是太糟糕了。

现在看看如果我们使用环境变量的方式来配置我们的参数,如下:

spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: ${DEMO_APP_JDBC_URL:jdbc:mysql://127.0.0.1/demo?serverTimezone=Asia/Shanghai}
    username: ${DEMO_APP_JDBC_USERNAME:demo}
    password: ${DEMO_APP_JDBC_PASSWORD:demo}
    hikari:
      maximum-pool-size: ${DEMO_APP_JDBC_POOL_MAX_SIZE:30}
      max-lifetime: ${DEMO_APP_JDBC_POOL_MAX_LIFE_TIME:60000}
      minimum-idle: ${DEMO_APP_JDBC_POOL_MIN_SIZE:5}

以上使用${ENV:defauleValue}的形式配置了我们应用的相关参数,如果我们的运行环境配置了上面用到的环境变量,则使用环境变量中的配置,如果没有配置则使用默认的,比如我配置了环境变量DEMO_APP_JDBC_POOL_MAX_SIZE = 100,则应用程序中的连接池最大连接数就变成100了。使用这种方式我们甚至没必要使用spring.profiles.active来指定不同的配置文件了,简直一举两得。

注意:以上方式通常适用于云、容器等应用环境的部署,因为运行环境是被我们的应用独享的。我想你不愿意在一个运行着多个应用服务的环境上面配置这么多个性化的环境变量。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,372评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,368评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,415评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,157评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,171评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,125评论 1 297
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,028评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,887评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,310评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,533评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,690评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,411评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,004评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,659评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,812评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,693评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,577评论 2 353

推荐阅读更多精彩内容