抢先一步
VMware 提供培训和认证,帮助您快速提升技能。
了解更多Spring Cloud Connectors 库自 2011 年 Cloud Foundry 发布以来就一直陪伴着我们。连接器库和 Cloud Foundry 的 Java 构建包的主要目标之一是“在您开始使用 Cloud Foundry 时减少初始投资”。连接器库创建了连接到后端服务(如数据库)所需的 Spring bean 定义,这些信息包含在 VCAP_SERVICES 环境变量中。然后,构建包通过名为“自动重新配置”的功能将应用程序中您拥有的这些 bean 定义替换为连接器库创建的 bean 定义。当您将应用程序推送到 Cloud Foundry 时,您可能在日志中看到过它……
-----> Downloading Spring Auto Reconfiguration 2.5.0_RELEASE from https://java-buildpack.cloudfoundry.org/auto-reconfiguration/auto-reconfiguration-2.5.0_RELEASE.jar
自动重新配置非常适合入门。但是,当您需要更多控制权时,它就不那么好了,例如更改与DataSource
关联的连接池的大小。这需要编写特定于连接器的代码,并且它不像 Spring Boot 那样公开那么多的连接池选项。相同的限制适用于其他后端服务。
这就提出了一个问题,为什么我们有两个竞争机制来创建服务基础设施 bean?难道我们不能让 Spring Boot 为我们处理所有这些事情吗?这就是我们创建新的java-cfenv
库的动机。
该java-cfenv库的灵感来自node-cfenv和py-cfenvCloud Foundry 生态系统中其他地方使用的库。这些库提供了一个简单的 API,用于从VCAP_SERVICES
环境变量中包含的 JSON 字符串中检索凭据。我们将首先浏览 Java API(我们预计不会经常使用),然后展示它如何与 Spring 和 Spring Boot 的自动配置功能集成。
核心 API 由五个类组成
CfEnv
负责解析VCAP_SERVICES
和VCAP_APPLICATION
环境变量的内容。CfApplication
提供对VCAP_APPLICATION
环境变量内容的访问器。CfEnv
上的查找方法返回CfService
类的实例。CfService
提供对服务的名称、标签、选项卡和计划以及CfCredentials
对象的访问器。CfCredentials
提供获取用户名、密码、主机、端口和 URI 的访问器。URI 使用UriInfo
类表示。例如,如果您在 Cloud Foundry 中将 MySql 服务绑定到您的应用程序,则VCAP_SERVICES
环境变量将包含以下条目
{
"p-mysql": [
{
"credentials": {
"hostname": "10.0.4.35",
"port": 3306,
"name": "cf_2e23d10a_8738_8c3c_66cf_13e44422698c",
"username": "8McHri7aKbuTEGCR",
"password": "J2BNJYkeXAH9idkG",
"uri": "mysql://8McHri7aKbuTEGCR:[email protected]:3306/cf_2e23d10a_8738_8c3c_66cf_13e44422698c?reconnect=true",
"jdbcUrl": "jdbc:mysql://10.0.4.35:3306/cf_2e23d10a_8738_8c3c_66cf_13e44422698c?user=8McHri7aKbuTEGCR&password=J2BNJYkeXAH9idkG"
},
"syslog_drain_url": null,
"volume_mounts": [],
"label": "p-mysql",
"provider": null,
"plan": "100mb",
"name": "mysql",
"tags": [
"mysql",
"relational"
]
}
]
}
使用 java-cfenv API 时,我们可以使用一些简单的函数调用获取凭据信息,然后以编程方式创建到数据库的连接。
CfEnv cfEnv = new CfEnv();
CfService cfService = cfEnv.findServiceByName(“mysql”);
String plan = cfService.getPlan(); // 100mb
CfCredentials cfCredentials = cfService.getCredentials();
String password = cfCredentials.getPassword(); // J2BNJYkeXAH9idkG
UriInfo uriInfo = cfCredentials.getUriInfo();
String username = uriInfo.getUsername(); // 8McHri7aKbuTEGCR
findServiceByName
方法采用正则表达式来帮助提供跨不同 Cloud Foundry 环境的可移植性,这些环境可能会以略微不同的方式命名服务。还有其他查找方法,可以帮助您从标签等中进行选择。
在前面的示例中,您可能只想获取 JSON 字段 jdbcUrl,以便将其传递到DataSource
中。您可以使用 API 执行此操作
String jdbcUrl = cfCredentials.getString(“jdbcUrl”);
但是,并非 Cloud Foundry 上的所有数据库服务都提供此便捷字段。事实上,Cloud Foundry 上各种数据库服务提供的字段可能相当随意。现有的连接器库已经开发出启发式方法来处理这种差异,并且此功能已移植到新的 java-cfenv 库中。它在CfEnvJdbc
类中可用
CfEnvJdbc cfEnvJdbc = new CfEnvJdbc();
CfJdbcService cfJdbcService = cfEnvJdbc.findJdbcService();
String jdbcUrl = cfJdbcService.getUrl();
如果有多个数据库服务绑定到应用程序,则findJdbcService
方法将抛出异常。在这种情况下,您可以使用findJdbcServiceByName
方法在多个数据库服务之间进行选择。
String jdbcUrl1 = cfEnvJdbc.findJdbcServiceByName('mysqlA').getUrl();
String jdbcUrl2 = cfEnvJdbc.findJdbcServiceByName('mysqlB').getUrl();
如果您使用的是 Spring 而不是 Spring Boot,则可以将CfJdbcEnv
实例注册为 bean,然后使用 Spring 表达式语言调用其方法来设置应用程序属性。
@Bean
public CfJdbcEnv cfJdbcEnv() {
return new CfJdbcEnv();
}
然后在属性文件中,访问CfJdbcEnv
实例
myDatasourceUrl=#{ cfJdbcEnv.findJdbcService().getUrl() }
大多数 Spring Boot 用户不必直接使用 java-cfenv API。java-cfenv 库包含 Spring BootEnvironmentPostProcessor
实现,这些实现会自动设置众所周知的 Spring Boot 属性。这允许 Spring Boot 的自动配置启动,同时仍然保留通过环境变量或其他优先级更高的环境属性源覆盖值的可能性。
从start.spring.io生成项目后,要使其正常工作,您只需手动将 java-cfenv-boot 依赖项添加到您的项目中,并在将应用程序推送到 Cloud Foundry 时禁用自动重新配置即可。对于 maven,依赖项为
<dependency>
<groupId>io.pivotal.cfenv</groupId>
<artifactId>java-cfenv-boot</artifactId>
<version>1.0.0.M1</version>
</dependency>
因为这目前是里程碑版本,所以您需要添加一个里程碑<repository>
配置,例如
<repository>
<id>spring-milestones</id>
<name>Spring Milestones</name>
<url>http://repo.spring.io/libs-milestone-local</url>
</repository>
要禁用自动重新配置,请使用以下命令或其在清单文件中的等效命令。
cf set-env <APP> JBP_CONFIG_SPRING_AUTO_RECONFIGURATION '{enabled: false}'
由于自动重新配置还会设置cloud
配置文件,许多应用程序都依赖于此配置文件,因此您可能还需要显式设置此配置文件。
cf set-env <APP> SPRING_PROFILES_ACTIVE cloud
如果您使用的是清单文件,则条目将为
env:
SPRING_PROFILES_ACTIVE: cloud
JBP_CONFIG_SPRING_AUTO_RECONFIGURATION: '{enabled: false}'
值得注意的是,在生产环境中,您可能也应该这样做。
要设置连接池属性,您现在只需使用标准的 Spring Boot 属性,例如spring.datasource.maxActive=10
和其他更具体的连接池属性。
有关如何使用 java-cfenv 库的更多信息,请访问GitHub。当前版本为 1.0.0.M1,并且将很快发布 GA 版本,因为它将在本月晚些时候并入 Data Flow 2.0 GA 版本中。与往常一样,我们欢迎您的反馈和贡献,即使它们会导致需要在 1.0 版本发布后不久并入 java-cfenv 2.0 版本的破坏性 API 更改。
java-cfenv 的 1.0 GA 版本将支持 Spring Cloud Connectors 项目中包含的所有服务,因为它们得到了 Spring Boot 自动配置的良好支持。**届时,现有的 Connectors 库将进入维护模式。**当然,会解决关键错误和安全问题,但不会添加新功能。java-cfenv 的 1.0 GA 版本将提供一个将应用程序从 Spring Cloud Connectors 迁移到 java-cfenv 的指南。
还有其他库建立在核心 Connectors 项目的基础上,这些库在项目页面上列出。这些扩展项目可以继续使用 Connectors,但鼓励维护人员迁移到以 Boot 为中心的方案。