Статьи

Openshift: сборка приложения Spring Boot на Wildfly 8.2.0 с Java 8

OpenShift DIY картридж — отличный способ протестировать неподдерживаемые языки в OpenShift. Но он не масштабируется (вы можете проголосовать за самодельный картридж Scalable здесь ), что затрудняет его использование в приложениях Spring Boot промышленного уровня. Но что, если мы развернули приложение Spring Boot на сервере приложений WildFly? Spring Boot может работать со встроенным контейнером сервлетов, таким как Tomcat или намного быстрее Undertow, но также может быть развернут на автономном сервере приложений. Это будет означать, что он также может быть развернут на сервере приложений WildFly, который поддерживается OpenShift. Давайте посмотрим, как легко начать создавать приложение Spring Boot с нуля и развернуть его в WildFly 8.2 в OpenShift.

Примечание : при просмотре документации OpenShift можно подумать, что в WildFly 8.1 и Java 7 поддерживается (на момент написания этого поста в блоге). Но, к счастью, это больше не так: WildFly 8.2 и Java 8 будут работать нормально, и это по умолчанию! Это был первый раз, когда я был рад, что документация устарела.

Обновление : если вы ищете быстрый старт, без пошагового пошагового руководства посмотрите здесь: Быстрый старт: Spring Boot и WildfFly 8.2 в OpenShift

необходимое условие

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

Создать приложение WildFly

Чтобы создать приложение WildFly с помощью клиентских инструментов, введите следующую команду:

1
rhc create-app boot jboss-wildfly-8 --scaling

jboss-wildfly-8 описывается как сервер приложений WildFly 8.2.0.Final. Используется опция масштабирования, так как позже установить ее будет невозможно (проголосуйте здесь )

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

Исходный код шаблона приложения

OpenShift создает шаблон проекта. Проект является стандартным проектом Maven. Вы можете просмотреть pom.xml и увидеть, что Java 8 используется по умолчанию для этого проекта. Кроме того, создаются две нестандартные папки: deployments , которые используются для помещения результирующего архива, и .openshift с конкретными файлами OpenShift. Пожалуйста, обратите внимание .opensift/config . Это место, где хранится конфигурация WildFly.

Spring Boot зависимости

В качестве управления зависимостями будет использоваться Spring IO Platform. Основное преимущество использования Spring IO Platform заключается в том, что она упрощает управление зависимостями, предоставляя версии проектов Spring вместе с их зависимостями, которые проверены и известны для совместной работы. Измените pom.xml , добавив:

01
02
03
04
05
06
07
08
09
10
11
<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>io.spring.platform</groupId>
            <artifactId>platform-bom</artifactId>
            <version>1.1.1.RELEASE</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

Теперь можно добавить зависимости Spring Boot. Обратите внимание, что поскольку приложение будет развернуто в WildFly, нам нужно явно удалить зависимость от Tomcat.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
    <exclusions>
        <exclusion>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-tomcat</artifactId>
        </exclusion>
    </exclusions>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>

Настройте приложение

Инициализировать приложение Spring Boot

Имея все зависимости, мы можем добавить код приложения. Создайте Application.java в demo пакете. Работа класса Application заключается в инициализации приложения Spring Boot, поэтому он должен расширяться из SpringBootServletInitializer и иметь аннотацию @SpringBootApplication

1
2
3
4
5
6
7
8
9
package demo;
 
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.context.web.SpringBootServletInitializer;
 
@SpringBootApplication
public class Application extends SpringBootServletInitializer {
 
}

@Entity, @Repository, @Controller

Spring Data JPA, являющаяся частью более широкого семейства Spring Data, позволяет легко внедрять репозитории на основе JPA. Для тех, кто не знаком с проектом, пожалуйста, посетите: http://projects.spring.io/spring-data-jpa/ .

Модель домена для этого примера проекта — это просто Person с некоторыми основными полями:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
@Entity
@Table(name = "people")
public class Person {
 
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    protected Integer id;
 
    @Column(name = "first_name")
    @NotEmpty
    protected String firstName;
 
    @Column(name = "last_name")
    @NotEmpty
    protected String lastName;
 
    @Column(name = "address")
    @NotEmpty
    private String address;
 
    @Column(name = "city")
    @NotEmpty
    private String city;
 
    @Column(name = "telephone")
    @NotEmpty
    @Digits(fraction = 0, integer = 10)
    private String telephone;
 
}

Person нужен @Repository , поэтому мы можем создать базовый с помощью репозитория данных Spring. Репозитории Spring Data сокращают большую часть стандартного кода благодаря простому определению интерфейса:

1
2
3
4
@Repository
public interface PeopleRepository extends PagingAndSortingRepository<Person, Integer> {
    List<Person> findByLastName(@Param("lastName") String lastName);
}

При наличии модели предметной области некоторые тестовые данные могут оказаться полезными. Самый простой способ — предоставить файл data.sql с SQL-скриптом, который будет выполняться при запуске приложения.

Создайте src/main/resources/data.sql содержащий исходные данные для таблицы сотрудников (см. Ниже). Spring Boot выберет этот файл и запустится с настроенным источником данных. Поскольку используемый источник данных подключается к базе данных H2, необходимо использовать правильный синтаксис SQL:

1
INSERT INTO people VALUES (1, 'George', 'Franklin', '110 W. Liberty St.', 'Madison', '6085551023');

Имея репозиторий Spring Data JPA, мы можем создать простой контроллер, который предоставляет данные через REST:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
@RestController
@RequestMapping("people")
public class PeopleController {
 
    private final PeopleRepository peopleRepository;
 
    @Inject
    public PeopleController(PeopleRepository peopleRepository) {
        this.peopleRepository = peopleRepository;
    }
 
    @RequestMapping
    public Iterable<Person> findAll(@RequestParam Optional<String> lastName) {
        if (lastName.isPresent()) {
            return peopleRepository.findByLastName(lastName.get());
        }
        return peopleRepository.findAll();
    }
}

Метод findAll принимает необязательный параметр lastName который связан с Java 8 java.util.Optional .

Стартовая страница

Проект, сгенерированный OpenShift во время настройки проекта, содержит папку webapp с некоторыми статическими файлами. Эти файлы могут быть удалены и index.html может быть изменен:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8">
    <title>OpenShift</title>
</head>
<body>
<form role="form" action="people">
    <fieldset>
        <legend>People search</legend>
        <label for="lastName">Last name:</label>
        <input id="lastName" type="text" name="lastName" value="McFarland"/>
        <input type="submit" value="Search"/>
    </fieldset>
</form>
<p>
    ... or: <a href="people">Find all ...</a>
</p>
</body>
</html>

Это просто статическая страница, но я заметил, что приложение не запустится, если нет сопоставления по умолчанию ( / ) или если код возврата отличается от 200 . Обычно всегда будет отображение по умолчанию.

конфигурация

Создайте src/main/resources/application.properties и введите следующие значения:

  • management.context-path=/manage : путь к контексту management.context-path=/manage исполнительного механизма по умолчанию — / . Это изменилось на /manage , потому что OpenShift предоставляет конечную точку /health , которая покрывает конечную точку /health привода.
  • spring.datasource.jndi-name=java:jboss/datasources/ExampleDS : поскольку приложение использует Spring Data JPA, мы хотим привязаться к источнику данных сервера через JNDI. Пожалуйста, посмотрите .openshift/config/standalone.xml для других источников данных. Это важно, если вы хотите настроить MySql или PostgreSQL для использования с вашим приложением. Подробнее о подключении к источнику данных JNDI в Spring Boot читайте здесь: http://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#boot-features-connecting-to-a-jndi-datasource
  • spring.jpa.hibernate.ddl-auto=create-drop : создать структуру базы данных на основе предоставленных объектов.

Развертывание в OpenShift

Приложение готово для отправки в хранилище. Примите ваши локальные изменения и затем отправьте их на удаленный

1
git push

Первоначальное развертывание (сборка и запуск приложения) займет некоторое время (до нескольких минут). Последующее развертывание происходит немного быстрее. Теперь вы можете перейти по адресу : http://appname-yournamespace.rhcloud.com/, и вы должны увидеть форму:

Нажав на поиск со значением по умолчанию, вы получите запись с id = 3:

01
02
03
04
05
06
07
08
09
10
[
    {
        "id": 3,
        "firstName": "2693 Commerce St.",
        "lastName": "McFarland",
        "address": "Eduardo",
        "city": "Rodriquez",
        "telephone": "6085558763"
    }
]

Переход к http://appname-yournamespace.rhcloud.com/people вернет все записи из базы данных.

Going Java 7

Если вы хотите использовать Java 7 в своем проекте, вместо Java 8 по умолчанию, переименуйте .openshift/markers/java8 в .openshift/markers/java7 и измените pom.xml соответственно:

1
2
3
4
5
6
<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <maven.compiler.source>1.7</maven.compiler.source>
    <maven.compiler.target>1.7</maven.compiler.target>
    <maven.compiler.fork>true</maven.compiler.fork>
</properties>

Обратите внимание, что maven.compiler.executable был удален. Не забудьте изменить код @Controller и сделать его совместимым с Java 7.

Резюме

В этой записи блога вы узнали, как настроить базовое приложение Spring Boot и запустить его в OpenShift с WildfFly 8.2 и Java 8. OpenShift масштабирует приложение с помощью веб-прокси HAProxy. OpenShift заботится об автоматическом добавлении или удалении копий приложения для обслуживания запросов по мере необходимости.

Ресурсы