Статьи

Связывание со службами данных с помощью Spring Boot в Cloud Foundry


Автор Дэйв Сайер в весеннем блоге 

В этой статье мы рассмотрим, как связать приложение  Spring Boot  со службами данных (JDBC, NoSQL, обмен сообщениями и т. Д.), А также различные источники поведения по умолчанию и автоматического поведения в  Cloud Foundry , предоставив некоторые рекомендации о том, какие из них использовать и какие будут быть активным при каких условиях. Spring Boot предоставляет множество функций автоконфигурации и внешнего связывания, некоторые из которых относятся к Cloud Foundry, а многие — нет.  Spring Cloud Connectors  — это библиотека, которую вы можете использовать в своем приложении, если вы хотите создавать свои собственные компоненты программно, но она сама по себе не делает ничего «волшебного». И, наконец, есть пакет Java Foundry Cloud Foundry.  которая имеет функцию «автоматической реконфигурации», которая пытается облегчить бремя переноса простых приложений в облако. Ключ к правильной настройке сервисов промежуточного программного обеспечения, таких как JDBC, AMQP или Mongo, заключается в том, чтобы понять, что предоставляет каждый из этих инструментов, как они влияют друг на друга во время выполнения, а также и включать и выключать их части. Цель должна состоять в плавном переходе от локального выполнения приложения на рабочем столе разработчика к тестовой среде в Cloud Foundry и, в конечном итоге, к производству в Cloud Foundry (или иным образом) без изменений в исходном коде или упаковке, согласно  двенадцатикратному фактору.  руководство по применению .

Существует несколько  простых исходных кодов,  сопровождающих эту статью. Чтобы использовать его, вы можете клонировать репозиторий и импортировать его в вашу любимую IDE. Вам нужно будет удалить две зависимости из всего проекта, чтобы добраться до той же точки, где мы начнем обсуждать конкретные примеры кода, а именно  spring-boot-starter-cloud-connectors и  auto-reconfiguration.

Примечание: текущие координаты для всех библиотек обсуждаются являются  org.springframework.boot:spring-boot-*:1.2.3.RELEASE, org.springframework.boot:spring-cloud-*-connector:1.1.1.RELEASE, org.cloudfoundry:auto-reconfiguration:1.7.0.RELEASE.

СОВЕТ: Исходный код в github включает в себя  docker-compose.yml файл ( документы здесь ). Вы можете использовать это для создания локальной базы данных MySQL, если у вас ее еще нет. На самом деле он не нужен для выполнения большей части приведенного ниже кода, но может оказаться полезным проверить, действительно ли он работает.

Spring Cloud Connectors , но защищенных «облачным» профилем:

@Configuration
@Profile("cloud")
public class DataSourceConfiguration {

  @Bean
  public Cloud cloud() {
    return new CloudFactory().getCloud();
  }

  @Bean
  @ConfigurationProperties(DataSourceProperties.PREFIX)
  public DataSource dataSource() {
    return cloud().getSingletonServiceConnector(DataSourceclass, null);
  }

}

Вы можете использовать  spring.datasource.* свойства (например,  application.properties или его версию для конкретного профиля), чтобы установить дополнительные свойства во время выполнения. «Облачный» профиль автоматически активируется для вас пакетом buildpack.

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

СОВЕТ: используйте ленточные пускатели и приводы,  endpoints.health.sensitive=false чтобы DataSource быстро проверить  «/ здоровье». Вы также можете использовать конечные точки «/ beans», «/ env» и «/ autoconfig», чтобы увидеть, что происходит в автоконфигурации и почему.

ПРИМЕЧАНИЕ. Запуск в Cloud Foundry или включение JAR с автоматической реконфигурацией в classpath локально активируют профиль «cloud» (по той же причине). В  VCAP_* Env вары являются то , что делает Spring Cloud и / или автоматической реконфигурации JAR создать бобы.

ПРИМЕЧАНИЕ. URL в  VCAP_SERVICES действительности не является схемой «jdbc», которая должна быть обязательной для соединений JDBC. Это, однако, формат, в котором Cloud Foundry обычно представляет его, потому что он работает почти для всех языков, кроме Java. Spring Cloud Connectors или автоматическая реконфигурация buildpack, если они создают  DataSource, преобразуют его в  jdbc:* URL для вас.

ПРИМЕЧАНИЕ. URL-адрес MySQL также содержит учетные данные пользователя и имя базы данных, действительные для контейнера Docker, созданного  docker-compose.yml в примере исходного кода. Если у вас есть локальный сервер MySQL с другими учетными данными, вы можете заменить их.

СОВЕТ: Если вы используете локальный сервер MySQL и хотите убедиться, что он подключен, вы можете использовать конечную точку «/ health» из Spring Boot Actuator (уже включена в пример кода). Или вы можете создать  schema-mysql.sql файл в корне пути к классам и поместить в него простой запрос поддержки активности (например  SELECT 1). Spring Boot запустит это при запуске, так что если приложение запускается успешно, вы правильно настроили базу данных.

JAR с автоматической реконфигурацией всегда находится на пути к классам в Cloud Foundry (по умолчанию), но он отменяет создание любого,  DataSource если находит объект  org.springframework.cloud.CloudFactoryEJB (который предоставляется Spring Boot, если  CloudAutoConfiguration он активен). Таким образом, чистый эффект добавления его в classpath, если коннекторы также присутствуют в приложении Spring Boot, заключается только в том, чтобы включить «облачный» профиль. Вы можете видеть, что принимаете решение пропустить автоматическую реконфигурацию в журналах приложения при запуске:

015-04-14 15:11:11.765  INFO 12727 --- [           main] urceCloudServiceBeanFactoryPostProcessor : Skipping auto-reconfiguring beans of type javax.sql.DataSource
2015-04-14 15:11:57.650  INFO 12727 --- [           main] ongoCloudServiceBeanFactoryPostProcessor : Skipping auto-reconfiguring beans of type org.springframework.data.mongodb.MongoDbFactory
2015-04-14 15:11:57.650  INFO 12727 --- [           main] bbitCloudServiceBeanFactoryPostProcessor : Skipping auto-reconfiguring beans of type org.springframework.amqp.rabbit.connection.ConnectionFactory
2015-04-14 15:11:57.651  INFO 12727 --- [           main] edisCloudServiceBeanFactoryPostProcessor : Skipping auto-reconfiguring beans of type org.springframework.data.redis.connection.RedisConnectionFactory
...
etc.

Spring Boot User Guide .

Минусы: он не работает без  VCAP_* переменных среды (или какой-либо другой облачной платформы). Он также полагается на то, что пользователь не забывает указывать  Cloud как a  @Bean , чтобы отключить автоконфигурацию.

Резюме: мы все еще не в удобном месте (приложение, которое не запускается без сложной обработки переменных среды, практически не используется).

Scott Frederick, who spotted most of the mistakes in the drafts and always had time to look at a new revision.