2016-04-17 2 views
1

У меня есть небольшой API, работающий на PCF с использованием Spring JPA. Конечно, в коде я мог бы использовать соединение JDBC с готовыми операторами для доступа к связанному экземпляру MySQL. Для этого требуется имя пользователя и пароль в соответствии с обычными стандартами при подключении к базе данных через Java.Как Spring JPA на Pivotal Cloud Foundry знает, как подключиться к связанному экземпляру MySQL?

Однако, с Spring JPA, мне не нужно ничего делать. Я просто связываю экземпляр MySQL и могу выполнять свои запросы с помощью JPA API.

Из-за отсутствия лучшего вопроса, что это за волшебство?

+0

Я бы предположил, что под капотом все те же процедуры JDBC все еще происходят, но эта Весна отвлекла их от вас. –

+0

Я бы принял то же самое. Мой вопрос больше связан с тем, как это соединение JDBC знает имя пользователя/пароль для базы данных. Я предполагаю, что это связано с тем, что экземпляр «привязан» к приложению в PCF, но, будучи новым для PCF, я не знаю, как это работает. –

ответ

2

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.

Когда весна обнаруживает, что

  1. cloud profile активен (устанавливается spring.profiles.active свойством среды, или spring.profile собственности в spring cloud)
  2. Auto Configuration включен (включен по @SpringBootApplication)
  3. Нет в памяти Datasource зависимость присутствовать на пути к классам (хотя я предполагаю, что он предоставит предпочтение конфигурации облачного источника данных, даже если присутствует зависимость от памяти)
  4. Нет источник данных не был явно настроен

Spring создает самое Datasource боб, используя переменные окружения, если услуга DataSource (как Postgres) была связана с приложением.

Ниже приведена ссылка на свойства среды, которые она использует для создания источника данных.

https://docs.cloudfoundry.org/buildpacks/java/spring-service-bindings.html

Вот список DataSource только свойства.

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

По моему опыту, если есть только одна служба базы данных добавляется к приложению, не было никакой необходимости, чтобы определить имя службы базы данных в разделе переменных окружения ,

Примечание:

К весне по умолчанию будет пытаться использовать однородна поддержку подключения контейнера сервлет, однако большую часть времени мы наш я должны настроить некоторые свойства, которые поддерживаются только поставщики пула соединений, такие как Apache ДБХП. В этих случаях нам нужно создать компонент Datasource вручную, используя свойства среды (используя System.getProperty() или Spring Environment.getProperty()).

+0

Просто информация, которую я искал. Благодаря! –

+0

Добро пожаловать! – 11thdimension

Смежные вопросы