原文地址html
大多数Spring Cloud项目都会使用Spring Cloud Config来管理应用启动时的配置文件,同时开发人员面临着多样化的程序启动方式:操做系统进程启动、docker启动、k8s启动。那么如何规划这些配置文件以适应多种启动方式呢?本文尝试给出一些建议java
bootstrap.properties
和application.properties
(或者它们的yaml变种)打到包里。bootstrap.properties
里,要针对可变配置项作环境变量化。application.properties
里,要针对可变配置项作环境变量化。bootstrap.properties
里,而且要作环境变量化。application-*.properties
里不得有环境变量。由于既然直接提供配置了,那么就不该该再使用环境变量。这句话对应The 12-factor App的Config章节。具体作法是在配置文件里使用placeholder。下面是两种方式:git
app.name=${APP_NAME} app.description=${APP_DESC:Default description}
第一种方式Spring Boot/Cloud应用在启动时,会根据这个顺序找APP_NAME
的值,若是找不到程序启动会报错。github
第二种方式和第一种方式的不一样在于若是找不到,则使用application.properties
里定义的默认值。spring
而程序在启动时应该经过环境变量的方式将这些值传递进去。docker
在真实应用中应该尽可能多的使用第二种方式,只有少数的配置才是程序启动时必须提供的,通常来讲都是一些数据库链接字符串、用户名密码等信息。数据库
bootstrap.properties
里,而且要作环境变量化。好比这样:bootstrap
spring.cloud.config.enabled=${CONFIG_ENABLED:true} spring.cloud.config.profile=${CONFIG_PROFILE:production} spring.cloud.config.label=${CONFIG_LABEL:master} spring.cloud.config.uri=${CONFIG_SERVER_URL:http://config-server:8080/}
上面这个配置能够控制是否链接config server,由于在开发环境下咱们可能并不须要config server。也提供了能够config server启动程序的可能。
同时也控制了若是链接config server,应该使用哪一个application.properties
。api
须要注意的是,若是咱们选择程序启动的时候链接config server,那么在程序启动时提供的环境变量就只能是和config server相关的环境变量(在这个例子里就是上面的CONFIG_*
),这些配置用来控制如何得到application.properties
。app
由于此时程序所使用的配置都来自于config server,若是config server提供一些,环境变量又提供一些则会形成运维上的混乱。
下面讲讲各类启动方式如何传递环境变量。
直接以操做系统进程启动的方法是相似于这样的:
APP_NAME=my-app APP_DESC="My App Desc" java -jar spring-cloud-app.jar
用docker启动则是这样的,参见Docker ENV (environment variables):
docker run --name my-app -e APP_NAME=my-app -e APP_DESC="My App Desc" spring-cloud-app:latest
定义ConfigMap或Secret(用在密码类配置上),而后在Deployment spec里使用configMapRef
或者secretRef
或者configMapKeyRef
或者secretKeyRef
,好比下面的例子:
apiVersion: apps/v1 kind: Deployment metadata: name: my-app namespace: <namespace> spec: ... template: ... spec: containers: - name: my-app image: <image repository> ... envFrom: - configMapRef: name: my-app-config - secretRef: name: my-app-secret env: - name: APP_NAME valueFrom: configMapKeyRef: name: my-app-config key: APP_NAME - name: APP_DESC valueFrom: secretKeyRef: name: my-app-secret key: APP_DESC
详见Configure a Pod to Use a ConfigMap、Secrets和Load env variables from ConfigMaps and Secrets upon Pod boot。