# 重新审视配置信息
在本系列文章的前面部分,我们已经完成了在 Kubernetes 上部署 Spring Cloud OCP 的主要组件:eureka-server、auth-server、user-cetner、api-gateway、back-center。
# 提取相同的参数
# 各模块中的环境变量
部署过程中,主要使用环境变量向容器内注入具体环境相关的信息,以便容器内应用程序可以使用特定于环境的配置。具体来说,主要有如下信息通过环境变量替换:
eureka-server
- 使用环境变量覆盖
eureka.client.service-url.defaultZone
取值,将其设置为:http://cloud-eureka-0.cloud-eureka.ocp.svc.cluster.local:1111/eureka,http://cloud-eureka-1.cloud-eureka.ocp.svc.cluster.local:1111/eureka,http://cloud-eureka-2.cloud-eureka.ocp.svc.cluster.local:1111/eureka
1
- 使用环境变量覆盖
使用环境变量覆盖
eureka.instance.prefer-ip-address
取值,将其设置为:false
auth-server
部署auth-server时,通过环境变量覆盖了如下参数:
eureka.client.serviceUrl.defaultZone 覆盖为
http://cloud-eureka-0.cloud-eureka.ocp.svc.cluster.local:1111/eureka,http://cloud-eureka-1.cloud-eureka.ocp.svc.cluster.local:1111/eureka,http://cloud-eureka-2.cloud-eureka.ocp.svc.cluster.local:1111/eureka
1spring.datasource.druid.core.url 覆盖为
jdbc:mysql://db-auth-center:3306/oauth-center?useUnicode=true&characterEncoding=utf-8&allowMultiQueries=true&useSSL=false
1spring.datasource.druid.log.url 覆盖为
jdbc:mysql://db-log-center:3306/log-center?useUnicode=true&characterEncoding=utf-8&allowMultiQueries=true&useSSL=false
1spring.redis.host 覆盖为
cloud-redis
user-center
部署user-center时,通过环境变量覆盖了如下参数:
eureka.client.serviceUrl.defaultZone 覆盖为
http://cloud-eureka-0.cloud-eureka.ocp.svc.cluster.local:1111/eureka,http://cloud-eureka-1.cloud-eureka.ocp.svc.cluster.local:1111/eureka,http://cloud-eureka-2.cloud-eureka.ocp.svc.cluster.local:1111/eureka
1spring.datasource.druid.core.url 覆盖为
jdbc:mysql://db-user-center:3306/user-center?useUnicode=true&characterEncoding=utf-8&allowMultiQueries=true&useSSL=false
1spring.datasource.druid.log.url 覆盖为
jdbc:mysql://db-log-center:3306/log-center?useUnicode=true&characterEncoding=utf-8&allowMultiQueries=true&useSSL=false
1spring.redis.host 覆盖为
cloud-redis
api-gateway
部署api-gateway时,通过环境变量覆盖了如下参数:
eureka.client.serviceUrl.defaultZone 覆盖为
http://cloud-eureka-0.cloud-eureka.ocp.svc.cluster.local:1111/eureka,http://cloud-eureka-1.cloud-eureka.ocp.svc.cluster.local:1111/eureka,http://cloud-eureka-2.cloud-eureka.ocp.svc.cluster.local:1111/eureka
1spring.datasource.druid.core.url 覆盖为
jdbc:mysql://db-auth-center:3306/oauth-center?useUnicode=true&characterEncoding=utf-8&allowMultiQueries=true&useSSL=false
1spring.datasource.druid.log.url 覆盖为
jdbc:mysql://db-log-center:3306/log-center?useUnicode=true&characterEncoding=utf-8&allowMultiQueries=true&useSSL=false
1spring.redis.host 覆盖为
cloud-redis
back-center
部署back-center时,通过环境变量覆盖了如下参数:
- GATEWAY_API_URL
- CLOUD_EUREKA_URL
# 相同的参数
回顾一下,可以发现如下相同的参数:
eureka.client.service-url.defaultZone
使用到此参数,且取值相同的模块有:
- eureka-server
- auth-server
- user-center
- api-gateway
spring.datasource.druid.core.url
使用到此参数的模块有,(但是他们的参数值不同)
- auth-server
- user-center
spring.datasource.druid.log.url
使用到此参数,且取值相同的模块有:
- auth-server
- user-center
- api-gateway
spring.redis.host
使用到此参数,且取值相同的模块有:
- auth-server
- user-center
- api-gateway
# 提取参数到ConfigMap
可参考文档 使用ConfigMap配置您的应用程序
在 Kuboard 界面中进入
ocp
名称空间创建ConfigMap,并填入五个名值对:
- eureka.client.serviceUrl.defaultZone =
http://cloud-eureka-0.cloud-eureka.ocp.svc.cluster.local:1111/eureka,http://cloud-eureka-1.cloud-eureka.ocp.svc.cluster.local:1111/eureka,http://cloud-eureka-2.cloud-eureka.ocp.svc.cluster.local:1111/eureka
- spring.datasource.druid.log.url =
jdbc:mysql://db-log-center:3306/log-center?useUnicode=true&characterEncoding=utf-8&allowMultiQueries=true&useSSL=false
- spring.redis.host =
cloud-redis
- GATEWAY_API_URL =
http://api-gateway.ocp.demo.kuboard.cn/
- CLOUD_EUREKA_URL =
http://cloud-eureka.ocp.demo.kuboard.cn/
- eureka.client.serviceUrl.defaultZone =
修改 eureka-server、auth-server、user-center、api-gateway 的部署信息,将上面创建的 ConfigMap 中所有名值对注入到容器的环境变量,并去除已经在 ConfigMap 中包含的环境变量。
以 eureka-server 为例,编辑该工作负载的界面截图如下所示:
TIP
将相同的参数提炼到 ConfigMap 可以使配置更简洁。
# 为谁定义变量
在本教程中,为了避免对 OCP 已有代码的修改,因此以直接注入 spring.datasource.druid.log.url
类似的环境变量的方式,使docker镜像适应不同的环境(开发环境、测试环境、生产环境等)。这种做法就会碰到一个比较尴尬的情况,例如,对于参数 spring.datasource.druid.core.url
键值相同,而不同模块中(auth-server、user-center、api-gateway)取值却不同。这是从参数使用者视角来看不可避免的现象。
一个建议的方式是,从参数提供者的视角来定义环境变量参数,并由参数使用者引用。例如,我们定义如下几个ConfigMap属性:
- EUREKA_URLS =
http://cloud-eureka-0.cloud-eureka.ocp.svc.cluster.local:1111/eureka,http://cloud-eureka-1.cloud-eureka.ocp.svc.cluster.local:1111/eureka,http://cloud-eureka-2.cloud-eureka.ocp.svc.cluster.local:1111/eureka
- DB_AUTH_CENTER_URL =
jdbc:mysql://db-auth-center:3306/auth-center?useUnicode=true&characterEncoding=utf-8&allowMultiQueries</font>=true&useSSL=false
- DB_USER_CENTER_URL=
jdbc:mysql://db-user-center:3306/user-center?useUnicode=true&characterEncoding=utf-8&allowMultiQueries=true&useSSL=false
- DB_LOG_CENTER_URL =
jdbc:mysql://db-log-center:3306/log-center?useUnicode=true&characterEncoding=utf-8&allowMultiQueries=true&useSSL=false
- REDIS_HOST =
cloud-redis
- GATEWAY_API_URL =
http://api-gateway.ocp.demo.kuboard.cn/
- CLOUD_EUREKA_URL =
http://cloud-eureka.ocp.demo.kuboard.cn/
然后在参数使用者的 application.xml
中引用这些环境变量参数,以 auth-center 的 application.xml
为例:
spring:
session:
store-type: redis
datasource:
dynamic:
enable: true
druid:
# JDBC 配置(驱动类自动从url的mysql识别,数据源类型自动识别)
core:
url: ${DB_AUTH_CENTER_URL}
username: root
password: root
driver-class-name: com.mysql.jdbc.Driver
log:
url: ${DB_LOG_CENTER_URL}
username: root
password: root
redis:
host: ${REDIS_HOST}
port: 6379
timeout: 6000
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22