1. Обзор
Развертывание приложения Spring Boot в Cloud Foundry — простое упражнение. В этом уроке мы покажем вам, как это сделать.
2. Зависимости Spring Cloud
Поскольку для этого проекта потребуются новые зависимости для проекта Spring Cloud, мы добавим спецификацию зависимостей Spring Cloud:
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Greenwhich.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
Мы можем найти последнюю версию библиотеки spring-cloud-dependencies на
Maven Central .
Теперь мы хотим поддерживать отдельную сборку для Cloud Foundry, поэтому мы создадим профиль с именем cloudfoundry
в файле Maven pom.xml.
Мы также добавим исключения компилятора и плагин Spring Boot для настройки имени пакета:
<build>
<resources>
<resource>
<directory>src/main/resources</directory>
<excludes>
<exclude>**/logback.xml</exclude>
</excludes>
</resource>
</resources>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<finalName>${project.name}-cf</finalName>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<excludes>
<exclude>**/cloud/config/*.java</exclude>
</excludes>
</configuration>
</plugin>
</plugins>
</build>
Мы также хотим исключить облачные файлы из обычной сборки, поэтому добавляем глобальное исключение профиля в подключаемый модуль компилятора Maven:
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<excludes>
<exclude>**/cloud/*.java</exclude>
</excludes>
</configuration>
</plugin>
</plugins>
</build>
Затем нам нужно добавить библиотеки Spring Cloud Starter и Spring Cloud Connectors, которые обеспечивают поддержку Cloud Foundry:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-cloud-connectors</artifactId>
</dependency>
3. Конфигурация Cloud Foundry
Чтобы пройти это руководство, нам нужно зарегистрироваться для получения пробной версии здесь или загрузить предварительно настроенную среду разработки для Native Linux или Virtual Box .
Кроме того, необходимо установить CLI Cloud Foundry. Инструкции здесь .
После регистрации у провайдера Cloud Foundry URL-адрес API станет доступным (вы можете вернуться к нему, выбрав опцию « Инструменты
» слева).
Контейнер приложений позволяет нам привязывать службы к приложениям. Далее войдем в среду Cloud Foundry:
cf login -a <url>
Cloud Foundry Marketplace — это каталог таких услуг , как базы данных, обмен сообщениями, электронная почта, мониторинг, ведение журналов и многое другое. Большинство сервисов предоставляют бесплатный или пробный план.
Давайте найдем в Marketplace «MySQL» и создадим сервис для нашего приложения:
cf marketplace | grep MySQL
>
cleardb spark, boost*, amp*, shock* Highly available MySQL for your Apps.
В выводе перечислены службы с «MySQL» в описании. В PCF служба MySQL называется cleardb,
а несвободные планы отмечены звездочкой.
Далее мы перечисляем детали службы, используя:
cf marketplace -s cleardb
>
service plan description free or paid
spark Great for getting started and developing your apps free
boost Best for light production or staging your applications paid
amp For apps with moderate data requirements paid
shock Designed for apps where you need real MySQL reliability, power and throughput paid
Теперь мы создаем бесплатный экземпляр службы MySQL с именем spring-bootstrap-db
:
cf create-service cleardb spark spring-bootstrap-db
4. Конфигурация приложения
Затем мы добавляем аннотированный класс @Configuration
, который расширяет AbstractCloudConfig
для создания источника данных
в пакете с именем org.foreach.cloud.config
: ``
@Configuration
@Profile("cloud")
public class CloudDataSourceConfig extends AbstractCloudConfig {
@Bean
public DataSource dataSource() {
return connectionFactory().dataSource();
}
}
Добавление @Profile("cloud")
гарантирует, что Cloud Connector не активен, когда мы проводим локальное тестирование. Мы также добавляем @ActiveProfiles(profiles = {“local”})
в интеграционные тесты.
Затем создайте приложение с помощью:
mvn clean install spring-boot:repackage -P cloudfoundry
Также нам нужно предоставить файл manifest.yml
, чтобы привязать сервис к приложению.
Обычно мы помещаем файл manifest.yml
в папку проекта, но в этом случае мы создадим папку cloudfoundry
, поскольку собираемся продемонстрировать развертывание для нескольких облачных провайдеров:
---
applications:
- name: spring-boot-bootstrap
memory: 768M
random-route: true
path: ../target/spring-boot-bootstrap-cf.jar
env:
SPRING_PROFILES_ACTIVE: cloud,mysql
services:
- spring-bootstrap-db
5. Развертывание
Развернуть приложение теперь так же просто, как:
cd cloudfoundry
cf push
Cloud Foundry будет использовать сборочный пакет Java для развертывания приложения и создания случайного маршрута к приложению.
Мы можем просмотреть несколько последних записей в файле журнала, используя:
cf logs spring-boot-bootstrap --recent
Или мы можем записать файл журнала:
cf logs spring-boot-bootstrap
Наконец, нам нужно имя маршрута для тестирования приложения:
cf app spring-boot-bootstrap
>
name: spring-boot-bootstrap
requested state: started
routes: spring-boot-bootstrap-delightful-chimpanzee.cfapps.io
last uploaded: Thu 23 Aug 08:57:20 SAST 2018
stack: cflinuxfs2
buildpacks: java-buildpack=v4.15-offline-...
type: web
instances: 1/1
memory usage: 768M
state since cpu memory disk
#0 running 2018-08-23T06:57:57Z 0.5% 290.9M of 768M 164.7M of 1G
Выполнение следующей команды добавит новую книгу:
curl -i --request POST \
--header "Content-Type: application/json" \
--data '{"title": "The Player of Games", "author": "Iain M. Banks"}' \
https://<app-route>/api/books
#OR
http POST https://<app-route>/api/books title="The Player of Games" author="Iain M. Banks"
И эта команда выведет список всех книг:
curl -i https://<app-route>/api/books
#OR
http https://<app-route>/api/books
>
HTTP/1.1 200 OK
[
{
"author": "Iain M. Banks",
"id": 1,
"title": "Player of Games"
},
{
"author": "J.R.R. Tolkien",
"id": 2,
"title": "The Hobbit"
}
]
6. Масштабирование приложения
Наконец, масштабирование приложения в Cloud Foundry так же просто, как использование команды масштабирования
:
cf scale spring-cloud-bootstrap-cloudfoundry <options>
Options:
-i <instances>
-m <memory-allocated> # Like 512M or 1G
-k <disk-space-allocated> # Like 1G or 2G
-f # Force restart without prompt
Не забудьте удалить приложение, когда оно нам больше не нужно:
cf delete spring-cloud-bootstrap-cloudfoundry
7. Заключение
В этой статье мы рассмотрели библиотеки Spring Cloud, которые упрощают разработку облачного приложения с использованием Spring Boot. Развертывание с помощью CLI Cloud Foundry хорошо задокументировано здесь .
Дополнительные плагины для CLI доступны в репозитории плагинов .
Полный исходный код наших примеров здесь, как всегда, находится на GitHub .