Как стать автором
Обновить

Учебник по Spring Boot Admin

Время на прочтение8 мин
Количество просмотров33K
Автор оригинала: Vojtech Ruzicka


Контролируйте и управляйте своими приложениями Spring Boot с помощью приятного пользовательского интерфейса поверх конечных точек Spring Boot Actuator.

Spring Boot Actuator


Actuator — это модуль Spring Boot, который добавляет конечные точки (endpoint) REST / JMX в ваше приложение, чтобы вы могли легко отслеживать и управлять им в производственной среде. Конечные точки предлагают проверку работоспособности, мониторинг метрик, доступ к журналам, дампам потоков, дампам кучи, информации об окружающей среде и многое другое. Автор подробно рассказал об Actuator в следующей статье:
Actuator: Spring Boot Production Monitoring and Management
Мониторинг и управление вашим работающим приложением с помощью Spring Boot Actuator 2.x. Соберите метрики или проверьте здоровье приложения.

Примечание переводчика. На Хабре есть аналогичная статья:
Введение в Spring Boot Actuator

Spring Boot Admin


Actuator является отличным и мощным инструментом, кроме того, его конечные точки легко и удобно использовать с помощью другого приложения — вы просто используете вызов REST-сервиса. Однако человеку использовать Actuator не очень удобно. Для пользователя гораздо проще иметь хороший пользовательский интерфейс, который можно использовать для просмотра всех данных мониторинга и управления вашим приложением. Это именно то, для чего служит Spring Boot Admin. Он предоставляет вам удобную прослойку пользовательского интерфейса поверх конечных точек Actuator с несколькими дополнительными функциями сверх того.

Spring Boot Admin не является модулем, предоставленным командой Spring, он был создан компанией под названием Codecentric. Тем не менее, его код общедоступен на Github и является бесплатным.

Клиент и сервер


В отличие от Actuator, Spring Boot Admin фактически состоит из двух частей — клиентской и серверной.

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

Таким образом, даже если наше приложение не работает или не работает должным образом, сервер мониторинга все еще работает. Теперь представьте, что у вас есть несколько приложений (таких как микросервисы Spring Boot), и каждое из них может работать в нескольких экземплярах. С традиционным мониторингом Actuator это сложно, так как вам нужно получить доступ к каждому из них по отдельности, и вам нужно отслеживать, сколько экземпляров и где запущено.

При использовании Spring Boot Admin каждый экземпляр отслеживаемого приложения (клиента) регистрируется на сервере после его запуска. Тогда у вас есть единственная точка (Admin Server), где вы можете проверить их все.



Исходный код


Исходный код готового приложения можно найти в этом репозитории Github.

Настройка сервера


Давайте сначала рассмотрим, как настроить Spring Boot Admin Server. Начнем со нового Spring Boot приложения. Вы можете легко создать его, используя Spring Initializr. Обязательно включите web модуль.

После создания проекта, первое, что нам нужно, это добавить зависимость Spring Boot Admin Server:

<dependency>
    <groupId>de.codecentric</groupId>
    <artifactId>spring-boot-admin-starter-server</artifactId>
    <version>2.1.0</version>
</dependency>

Обратите внимание, что хотя этот проект не создан Pivotal, вы можете найти клиентский и серверный модули для Spring Boot Admin в Spring Initializr. Далее нам нужно включить Admin Server, аннотируя наш основной класс приложения с помощью аннотации @EnableAdminServer:



Вот и все. Теперь вы можете запустить свое приложение и после открытия страницы вы должны увидеть такой экран:



Сервер работает, но клиенты еще не зарегистрированы. Давайте исправим это.

Настройка клиента


Как и при настройке сервера, первый шаг — необходимо добавить правильную зависимость к существующему приложению:

<dependency>
    <groupId>de.codecentric</groupId>
    <artifactId>spring-boot-admin-starter-client</artifactId>
    <version>2.1.0</version>
</dependency>

Затем вам нужно определить URL, где работает ваш Admin Server. Добавьте эту строку в ваш файл application.properties:

spring.boot.admin.client.url=http://localhost:8080

Добавление Actuator


Теперь у вас должна быть возможность запустить и клиент, и сервер. Просто убедитесь, что нет конфликта портов, поскольку оба приложения по умолчанию используют 8080. В целях тестирования вы можете установить server.port = 0 в ваших application.properties, чтобы ваш клиент использовал случайный порт при запуске. Таким образом, вы можете протестировать запуск нескольких экземпляров, работающих на разных портах.

При открытии пользовательского интерфейса Admin Server вы должны увидеть свое приложение. Когда вы нажимаете на название приложения, должна появиться страница с информацией о приложении.



Если вы видите экран, подобный приведенному выше, с минимальным количеством информации, это означает, что в вашем проекте нет Actuator. Помните, что Spring Boot Admin использует конечные точки Actuator под капотом. К счастью, вам нужно просто добавить простую зависимость, а автоконфигурация позаботится обо всем остальном.

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

Однако большинство конечных точек по умолчанию не отображаются в Actuator. Вам нужно изменить свою конфигурацию в application.properties, чтобы выставить их:

management.endpoints.web.exposure.include=*

После предоставления конечных точек Actuator вы должны увидеть гораздо больше информации в интерфейсе администратора:



Подробное руководство по настройке Spring Boot Actuator можно найти в этой статье.
Примечание переводчика. И в статье на Хабре.

Безопасность


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

Безопасность клиентов


Если вы уже используете Spring Security, вышеперечисленное не будет работать для вас, так как конечные точки привода по умолчанию защищены и ваш сервер администратора не сможет получить к ним доступ. Если вы еще не используете Spring Security, сначала нужно добавить зависимость:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-security</artifactId>
</dependency>

В целях тестирования вы можете временно отключить безопасность конечных точек Actuator с помощью management.security.enabled = false. Однако мы хотим, чтобы безопасность была включена. Если вы используете обычную аутентификацию, вы можете просто указать имя пользователя и пароль в файле свойств. Эти учетные данные будут использоваться Admin Server для аутентификации на конечных точках привода клиента:

spring.boot.admin.client.instance.metadata.user.name=joe
spring.boot.admin.client.instance.metadata.user.password=my-secret-password

По умолчанию, если не настроено иначе, Spring Boot по умолчанию использует пользователя user и автоматически сгенерированный пароль при каждом запуске приложения. Вы можете проверить пароль в консоли во время запуска. Если вы хотите явно указать имя пользователя и пароль, необходимые для вашего приложения, вы можете указать их в своих свойствах:

spring.security.user.name=joe
spring.security.user.password=my-secret-password

Безопасность сервера


Как и в случае с клиентом, нам нужно добавить зависимость Spring Security:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-security</artifactId>
</dependency>

Теперь давайте настроим имя пользователя и пароль, необходимые для входа на Admin Server в вашем application.properties:

spring.security.user.name=admin
spring.security.user.password=admin-password

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

spring.boot.admin.client.username=admin
spring.boot.admin.client.password=admin-password

Теперь вернемся к серверной части. Последнее, что нам нужно, это добавить конфигурацию Spring Security для защиты пользовательского интерфейса администратора:

@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        SavedRequestAwareAuthenticationSuccessHandler successHandler 
            = new SavedRequestAwareAuthenticationSuccessHandler();
        successHandler.setTargetUrlParameter("redirectTo");
        successHandler.setDefaultTargetUrl("/");

        http.authorizeRequests()
            .antMatchers("/assets/**").permitAll()
            .antMatchers("/login").permitAll()
            .anyRequest().authenticated().and()
            .formLogin().loginPage("/login")
            .successHandler(successHandler).and()
            .logout().logoutUrl("/logout").and()
            .httpBasic().and()
            .csrf()
            .csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse())
            .ignoringAntMatchers(
                "/instances",
                "/actuator/**"
             );
    }
}

Это позволит обеспечить доступ к интерфейсу администратора только для аутентифицированных пользователей, использующих базовую аутентификацию HTTP для входа в систему. Сама страница входа и статические ресурсы пользовательского интерфейса, включая javascript, HTML и CSS, являются открытыми. В противном случае вы не сможете войти в систему. Тогда существует защита от подделки межсайтовых запросов (CSRF, Cross-Site Request Forgery) на основе файлов cookie. Вы можете видеть, что некоторые пути игнорируются в защите CSRF — это потому, что Admin Server в настоящее время не имеет надлежащей поддержки.

Теперь после перезагрузки вы должны увидеть красивый экран входа, защищающий ваш Admin Server:



Cloud Discovery


Клиент Spring Boot Admin — не единственный способ зарегистрировать ваши приложения на сервере. Admin Server также поддерживает Spring Cloud Service Discovery. Вы можете прочитать больше в официальной документации или в статье «Spring Cloud Discovery with Spring Boot Admin».

Уведомления


Как только у вас запущен мониторинг, вы хотите получать уведомления, когда что-то идет не так. Хорошая новость заключается в том, что Spring Admin предоставляет широкий спектр вариантов уведомлений.

Если вы посещаете страницу Admin Server в первый раз, она запрашивает разрешение на отображение push-уведомлений на вашем компьютере. Всякий раз, когда возникает проблема, вы получите всплывающее сообщение.



Другие уведомления нуждаются в простой настройке. Обычно это означает просто предоставить несколько записей в вашем application.properties. В настоящее время поддерживаются следующие сервисы:


Настройка почтовых уведомлений


Если вы хотите включить почтовые уведомления, вам нужно добавить Spring email зависимость в вашу серверную часть:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-mail</artifactId>
</dependency>

Затем вам нужно определить ваш SMTP-сервер, который будет использоваться для отправки уведомлений и учетных данных по электронной почте. Обновите свои application.properties вашего Admin Server.

spring.mail.host=smtp.foo.com
spring.mail.username=smtp-server-user
spring.mail.password=smtp-server-password

Затем вам нужно определить получателей и отправителей.

# Sender email address
spring.boot.admin.notify.mail.from="Spring Boot Admin <noreply@foo.com>"
# Comma-delimited list of recipient email addresses
spring.boot.admin.notify.mail.to=alice@foo.com,bob@bar.com
# Comma-delimited list of carbon copy recipient email addresses
spring.boot.admin.notify.mail.cc=joe@foo.com

Заключение


Spring Boot Admin предлагает удобную и полезную прослойку пользовательского интерфейса поверх конечных точек Actuator. Более того, он позволяет централизованно контролировать несколько приложений с несколькими экземплярами, что неоценимо при работе в облаке и с микросервисами. Тем не менее, убедитесь, что вы достаточно защищаете как своего клиента, так и сервера. Для получения дополнительной информации см. официальную документацию.
Теги:
Хабы:
Всего голосов 15: ↑14 и ↓1+13
Комментарии1

Публикации