Перейти к основному содержимому

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

· 6 мин. чтения

Задача: Медиана двух отсортированных массивов

Даны два отсортированных массива размерами n и m. Найдите медиану слияния этих двух массивов.
Временная сложность решения должна быть O(log(m + n)) ...

ANDROMEDA

1. Обзор

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

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

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

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

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

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

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

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

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

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

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

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

Далее нам нужно настроить клиент так, чтобы он знал базовый 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 :

<dependency>
<groupId>de.codecentric</groupId>
<artifactId>spring-boot-admin-server-ui-login</artifactId>
<version>1.5.7</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
<version>2.4.0</version>
</dependency>

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

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

@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 с использованием Jolokia , а также об управлении Loglevel .

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

<dependency>
<groupId>com.hazelcast</groupId>
<artifactId>hazelcast</artifactId>
<version>4.0.3</version>
</dependency>

Если нам нужен постоянный экземпляр 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. Уведомления

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

  • Эл. адрес
  • ПейджерДьюти
  • OpsGenie
  • Хипчат
  • Слабый
  • Давай общаться

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

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

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

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

spring.mail.host=smtp.example.com
spring.mail.username=smtp_user
spring.mail.password=smtp_password
spring.boot.admin.notify.mail.to=admin@example.com

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

6.2. Уведомления хипчата

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

spring.boot.admin.notify.hipchat.auth-token=<generated_token>
spring.boot.admin.notify.hipchat.room-id=<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<List<Notifier>> otherNotifiers;

public NotifierConfiguration(InstanceRepository repository,
ObjectProvider<List<Notifier>> 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 .