Cloudfoundry 和 Spring Cloud 完全遵循 12-factor app 模式。
对于配置,它也使用config pattern suggested by 12-factor app 模式。
根据这种模式,我们应该将环境中代码之外的属性存储为environment variables。因此,一旦构建了应用程序包,就可以将其部署到任何环境,而无需进行任何修改。由于它从环境变量中获取配置,因此不同的环境必须使用不同的值定义相同的环境变量。
每当您使用cf bind-service向应用程序添加服务时,Cloudfoundry 都会在虚拟机(或容器或其他任何容器)中设置与该服务相关的预定义环境变量。
您可以使用cf env app-name.(Command Refeference) 来检查这些环境变量
cf env app-name 的示例输出
{
"VCAP_APPLICATION": {
"application_id": "fa05c1a9-0fc1-4fbd-bae1-139850dec7a3",
"application_name": "my-app",
"application_uris": [
"my-app.10.244.0.34.xip.io"
],
"application_version": "fb8fbcc6-8d58-479e-bcc7-3b4ce5a7f0ca",
"limits": {
"disk": 1024,
"fds": 16384,
"mem": 256
},
"name": "my-app",
"space_id": "06450c72-4669-4dc6-8096-45f9777db68a",
"space_name": "my-space",
"uris": [
"my-app.10.244.0.34.xip.io"
],
"users": null,
"version": "fb8fbcc6-8d58-479e-bcc7-3b4ce5a7f0ca"
}
使用spring actuator endpoints,您可以使用/env 端点检查所有环境变量。它列出了比cf env 更多的属性。
当 spring 检测到时
-
cloud profile 处于活动状态(由spring.profiles.active 环境属性或spring cloud 中的spring.profile 属性设置)
-
Auto Configuration 已启用(由@SpringBootApplication 启用)
- 类路径上不存在内存中的数据源依赖项(尽管我认为它会提供云数据源配置首选项,即使存在内存中的依赖项)
- 没有明确配置数据源
如果数据源服务(如 Postgres)已绑定到应用程序,则 Spring 使用环境变量创建数据源 bean。
下面是它用于创建数据源的环境属性的链接。
https://docs.cloudfoundry.org/buildpacks/java/spring-service-bindings.html
这里是仅数据源属性的列表。
cloud.services.<database-service-name>.connection.hostname
cloud.services.<database-service-name>.connection.name
cloud.services.<database-service-name>.connection.password
cloud.services.<database-service-name>.connection.port
cloud.services.<database-service-name>.connection.username
cloud.services.<database-service-name>.plan
cloud.services.<database-service-name>.type
database-service-name 在Manifest.yml 文件的env: block 中定义
根据我的经验,如果应用程序中只添加了一项数据库服务,则无需在环境变量部分定义数据库服务名称。
注意:
默认情况下,spring 会尝试使用 servlet 容器的可池连接支持,但是大多数时候我们自己必须配置一些仅由 Apache DBCP 等连接池提供程序支持的属性。在这些情况下,我们必须使用环境属性(使用 System.getProperty() 或 spring Environment.getProperty())手动创建 Datasource bean。