Руководство для Spring Boot Admin

Руководство по администрированию Spring Boot

1. обзор

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

В этой статье мы собираемся описать шаги по настройке сервера Spring Boot Admin и то, как приложение становится клиентом.

2. Настройка сервера администратора

Прежде всего, нам нужно создать простое веб-приложение Spring Boot, а также добавить следующиеMaven dependency:


    de.codecentric
    spring-boot-admin-starter-server
    2.1.6

После этого@EnableAdminServer будет доступен, поэтому мы добавим его в основной класс, как показано в примере ниже:

@EnableAdminServer
@SpringBootApplication
public class SpringBootAdminServerApplication {

    public static void main(String[] args) {
        SpringApplication.run(SpringBootAdminServerApplication.class, args);
    }
}

На этом этапе мы готовы запустить сервер и зарегистрировать клиентские приложения.

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

Теперь, после того как мы настроили наш административный сервер, мы можем зарегистрировать наше первое приложение Spring Boot в качестве клиента. Мы должны добавить следующиеMaven dependency:


    de.codecentric
    spring-boot-admin-starter-client
    2.1.6

Затем нам нужно настроить клиент, чтобы он знал о базовом URL-адресе административного сервера. Чтобы это произошло, мы просто добавляем следующее свойство:

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

Начиная с Spring Boot 2, конечные точки, отличные отhealth иinfo, по умолчанию не отображаются.

Давайте раскроем все конечные точки:

management.endpoints.web.exposure.include=*
management.endpoint.health.show-details=always

4. Конфигурация безопасности

Сервер Spring Boot Admin имеет доступ к чувствительным конечным точкам приложения, поэтомуit’s advised that we add some security configuration to both admin and client application.

Сначала мы сосредоточимся на настройке безопасности административного сервера. Мы должны добавить следующиеMaven dependencies:


    de.codecentric
    spring-boot-admin-server-ui-login
    1.5.7


    org.springframework.boot
    spring-boot-starter-security
    2.1.8.RELEASE

Это включит безопасность и добавит интерфейс входа в приложение администратора.

Затем мы добавим класс конфигурации безопасности, как показано ниже:

@Configuration
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
    private final AdminServerProperties adminServer;

    public WebSecurityConfig(AdminServerProperties adminServer) {
        this.adminServer = adminServer;
    }

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

        http
            .authorizeRequests()
                .antMatchers(this.adminServer.getContextPath() + "/assets/**").permitAll()
                .antMatchers(this.adminServer.getContextPath() + "/login").permitAll()
                .anyRequest().authenticated()
                .and()
            .formLogin()
                .loginPage(this.adminServer.getContextPath() + "/login")
                .successHandler(successHandler)
                .and()
            .logout()
                .logoutUrl(this.adminServer.getContextPath() + "/logout")
                .and()
            .httpBasic()
                .and()
            .csrf()
                .csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse())
                .ignoringRequestMatchers(
                  new AntPathRequestMatcher(this.adminServer.getContextPath() +
                    "/instances", HttpMethod.POST.toString()),
                  new AntPathRequestMatcher(this.adminServer.getContextPath() +
                    "/instances/*", HttpMethod.DELETE.toString()),
                  new AntPathRequestMatcher(this.adminServer.getContextPath() + "/actuator/**"))
                .and()
            .rememberMe()
                .key(UUID.randomUUID().toString())
                .tokenValiditySeconds(1209600);
    }
}

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

Чтобы зарегистрировать клиента на вновь защищенном сервере, мы должны добавить еще несколько настроек в файл свойств клиента:

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

Мы находимся на этапе защиты нашего административного сервера. В производственной системе, естественно, приложения, которые мы пытаемся отслеживать, будут защищены. Итак, мы также добавим безопасность клиенту - и мы заметим в интерфейсе пользовательского интерфейса сервера администратора, что информация о клиенте больше не доступна.

Нам нужно добавить некоторые метаданные, которые мы отправим на сервер администратора. Эта информация используется сервером для подключения к конечным точкам клиента:

spring.security.user.name=client
spring.security.user.password=client
spring.boot.admin.client.instance.metadata.user.name=${spring.security.user.name}
spring.boot.admin.client.instance.metadata.user.password=${spring.security.user.password}

Отправка учетных данных через HTTP, конечно, небезопасна - поэтому связь должна проходить через HTTPS.

5. Функции мониторинга и управления

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

spring.boot.admin.routes.endpoints=env, metrics, trace, jolokia, info, configprops

По мере продвижения мы увидим, что есть и другие функции, которые можно изучить. Мы говорим оJMX bean management с использованиемJolokia, а также о менеджментеLoglevel.

Spring Boot Admin также поддерживает кластерную репликацию с помощью Hazelcast. Нам просто нужно добавить следующиеMaven dependency, а остальное сделает автоконфигурация:


    com.hazelcast
    hazelcast
    3.12.2

Если нам нужен постоянный экземпляр Hazelcast, мы будем использовать настраиваемую конфигурацию:

@Configuration
public class HazelcastConfig {

    @Bean
    public Config hazelcast() {
        MapConfig eventStoreMap = new MapConfig("spring-boot-admin-event-store")
          .setInMemoryFormat(InMemoryFormat.OBJECT)
          .setBackupCount(1)
          .setEvictionPolicy(EvictionPolicy.NONE)
          .setMergePolicyConfig(new MergePolicyConfig(PutIfAbsentMapMergePolicy.class.getName(), 100));

        MapConfig sentNotificationsMap = new MapConfig("spring-boot-admin-application-store")
          .setInMemoryFormat(InMemoryFormat.OBJECT)
          .setBackupCount(1)
          .setEvictionPolicy(EvictionPolicy.LRU)
          .setMergePolicyConfig(new MergePolicyConfig(PutIfAbsentMapMergePolicy.class.getName(), 100));

        Config config = new Config();
        config.addMapConfig(eventStoreMap);
        config.addMapConfig(sentNotificationsMap);
        config.setProperty("hazelcast.jmx", "true");

        config.getNetworkConfig()
          .getJoin()
          .getMulticastConfig()
          .setEnabled(false);
        TcpIpConfig tcpIpConfig = config.getNetworkConfig()
          .getJoin()
          .getTcpIpConfig();
        tcpIpConfig.setEnabled(true);
        tcpIpConfig.setMembers(Collections.singletonList("127.0.0.1"));
        return config;
    }
}

6. Уведомления

Затем давайте обсудим возможность получать уведомления от административного сервера, если что-то случится с нашим зарегистрированным клиентом. Для настройки доступны следующие уведомители:

  • Эл. адрес

  • PagerDuty

  • OpsGenie

  • Hipchat

  • слабина

  • Давай поговорим

6.1. Уведомления по электронной почте

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


    org.springframework.boot
    spring-boot-starter-mail
    2.1.7.RELEASE

После этого мы должны добавить некоторые настройки почты:

spring.mail.host=smtp.example.com
spring.mail.username=smtp_user
spring.mail.password=smtp_password
[email protected]

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

6.2. Уведомления Hipchat

Как мы увидим, интеграция с Hipchat довольно проста; необходимо установить только несколько обязательных свойств:

spring.boot.admin.notify.hipchat.auth-token=
spring.boot.admin.notify.hipchat.room-id=
spring.boot.admin.notify.hipchat.url=https://yourcompany.hipchat.com/v2/

Определив их, мы заметим в комнате Hipchat, что получаем уведомления всякий раз, когда меняется статус клиента.

6.3. Индивидуальная конфигурация уведомлений

Мы можем настроить пользовательскую систему уведомлений, имея в своем распоряжении некоторые мощные инструменты для этого. Мы можем использоватьreminding notifier для отправки запланированного уведомления до изменения статуса клиента.

Или, может быть, мы хотим отправлять уведомления отфильтрованному набору клиентов. Для этого можно использоватьfiltering notifier:

@Configuration
public class NotifierConfiguration {
    private final InstanceRepository repository;
    private final ObjectProvider> otherNotifiers;

    public NotifierConfiguration(InstanceRepository repository,
      ObjectProvider> otherNotifiers) {
        this.repository = repository;
        this.otherNotifiers = otherNotifiers;
    }

    @Bean
    public FilteringNotifier filteringNotifier() {
        CompositeNotifier delegate =
          new CompositeNotifier(this.otherNotifiers.getIfAvailable(Collections::emptyList));
        return new FilteringNotifier(delegate, this.repository);
    }

    @Bean
    public LoggingNotifier notifier() {
        return new LoggingNotifier(repository);
    }

    @Primary
    @Bean(initMethod = "start", destroyMethod = "stop")
    public RemindingNotifier remindingNotifier() {
        RemindingNotifier remindingNotifier = new RemindingNotifier(filteringNotifier(), repository);
        remindingNotifier.setReminderPeriod(Duration.ofMinutes(5));
        remindingNotifier.setCheckReminderInverval(Duration.ofSeconds(60));
        return remindingNotifier;
    }
}

7. Заключение

В этом вводном руководстве рассматриваются простые шаги, которые необходимо выполнить, чтобы отслеживать и управлять своими приложениями Spring Boot с помощью Spring Boot Admin.

Автоконфигурация позволяет нам добавлять только некоторые незначительные конфигурации и, в конце концов, иметь полностью работающий сервер администратора.

И, как всегда, пример кода этого руководства можно найтиover on Github.