【问题标题】:How does Spring JPA on Pivotal Cloud Foundry know how to connect to a bound MySQL instance?Pivotal Cloud Foundry 上的 Spring JPA 如何知道如何连接到绑定的 MySQL 实例?
【发布时间】:2016-08-08 22:50:42
【问题描述】:

我有一个使用 Spring JPA 在 PCF 上运行的小型 API。当然,在代码中,我可以使用运行准备好的语句的 JDBC 连接来访问绑定的 MySQL 实例。按照通过 Java 连接到数据库时的正常标准,这样做需要用户名和密码。

但是,使用 Spring JPA,我不必执行任何这些操作。我只需绑定 MySQL 实例并可以使用 JPA API 执行我的查询。

由于没有更好的问题,这是什么魔法?

【问题讨论】:

  • 我会假设在后台仍然在执行相同的 JDBC 过程,但 Spring 已经为您抽象了它们。
  • 我也这么认为。我的问题更多的是这个 JDBC 连接如何知道数据库的用户名/密码。我猜这与实例“绑定”到 PCF 中的应用程序这一事实有关,但对于 PCF 来说,我不知道它是如何工作的。

标签: java mysql jdbc spring-data-jpa cloud-foundry


【解决方案1】:

CloudfoundrySpring 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 检测到时

  1. cloud profile 处于活动状态(由spring.profiles.active 环境属性或spring cloud 中的spring.profile 属性设置)
  2. Auto Configuration 已启用(由@SpringBootApplication 启用)
  3. 类路径上不存在内存中的数据源依赖项(尽管我认为它会提供云数据源配置首选项,即使存在内存中的依赖项)
  4. 没有明确配置数据源

如果数据源服务(如 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-nameManifest.yml 文件的env: block 中定义

根据我的经验,如果应用程序中只添加了一项数据库服务,则无需在环境变量部分定义数据库服务名称。

注意:

默认情况下,spring 会尝试使用 servlet 容器的可池连接支持,但是大多数时候我们自己必须配置一些仅由 Apache DBCP 等连接池提供程序支持的属性。在这些情况下,我们必须使用环境属性(使用 System.getProperty() 或 spring Environment.getProperty())手动创建 Datasource bean。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-10-07
    • 2016-10-05
    • 1970-01-01
    • 2019-04-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多