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 .