Рубрики
Без рубрики

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

Узнайте, как отслеживать приложения Spring Boot и управлять ими с помощью администратора Spring Boot.

Автор оригинала: baeldung.

1. Обзор

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

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

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

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


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

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

@EnableAdminServer
@SpringBootApplication
public class SpringBootAdminServerApplication(exclude = AdminServerHazelcastAutoConfiguration.class) {

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

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

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

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


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

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

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

Начиная с Spring Boot 2, конечные точки, отличные от здоровье и информация по умолчанию они не выставляются.

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

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

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

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

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


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


    org.springframework.boot
    spring-boot-starter-security
    2.4.0

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

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

@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 может быть настроен на отображение только той информации, которую мы считаем полезной. Нам просто нужно изменить конфигурацию по умолчанию и добавить ваши собственные необходимые метрики:

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

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

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


    com.hazelcast
    hazelcast
    4.0.3

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

@Configuration
public class HazelcastConfig {

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

        MapConfig sentNotificationsMap = new MapConfig("spring-boot-admin-application-store")
          .setInMemoryFormat(InMemoryFormat.OBJECT)
          .setBackupCount(1)
          .setEvictionConfig(new EvictionConfig().setEvictionPolicy(EvictionPolicy.LRU))
          .setMergePolicyConfig(new MergePolicyConfig(PutIfAbsentMergePolicy.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 , как показано ниже:


    org.springframework.boot
    spring-boot-starter-mail
    2.4.0

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

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

Теперь всякий раз, когда наш зарегистрированный клиент меняет свой статус с ” ДО ” на “ОФФЛАЙН” или иным образом, на указанный выше адрес отправляется электронное письмо. Для других уведомителей конфигурация аналогична.

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. Настройка Настраиваемых уведомлений

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

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

@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.

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

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