Ръководство за пролетен администратор на зареждане

1. Общ преглед

Spring Boot Admin е уеб приложение, използвано за управление и наблюдение на приложения Spring Boot. Всяко приложение се счита за клиент и се регистрира в администраторския сървър. Зад кулисите магията се дава от крайните точки на Spring Boot Actuator.

В тази статия ще опишем стъпки за конфигуриране на Spring Boot Admin сървър и как приложението става клиент.

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

На първо място, трябва да създадем просто уеб приложение Spring Boot и също да добавим следната зависимост на Maven:

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

След това ще бъде наличен @EnableAdminServer , така че ще го добавим към основния клас, както е показано в примера по-долу:

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

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

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

Сега, след като сме настроили нашия администраторски сървър, можем да регистрираме първото си приложение Spring Boot като клиент. Трябва да добавим следната зависимост на Maven:

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

След това трябва да конфигурираме клиента да знае за основния URL адрес на администраторския сървър. За да се случи това, ние просто добавяме следното свойство:

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

Започвайки с Spring Boot 2, крайните точки, различни от здравето и информацията , не са изложени по подразбиране.

Нека изложим всички крайни точки:

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

4. Конфигурация на защитата

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

Отначало ще се съсредоточим върху конфигурирането на защитата на администраторския сървър. Трябва да добавим следните зависимости на Maven:

 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 с помощта на Jolokia, а също и управление на Loglevel .

Spring Boot Admin също поддържа репликация на клъстери с помощта на Hazelcast. Просто трябва да добавим следната зависимост на Maven и да оставим автоматичното конфигуриране да свърши останалото:

 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
  • Хипчат
  • Отпуснат
  • Хайде да си чатим

6.1. Известия по имейл

Първо ще се съсредоточим върху конфигурирането на известия по пощата за нашия администраторски сървър. За да се случи това, трябва да добавим зависимостта от стартер на поща, както е показано по-долу:

 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]

Now, whenever our registered client changes his status from UP to OFFLINE or otherwise, an email is sent to the address configured above. For the other notifiers, the configuration is similar.

6.2. Hipchat Notifications

As we'll see, the integration with Hipchat is quite straightforward; there are only a few mandatory properties to set:

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

Having these defined, we'll notice in the Hipchat room that we receive notifications whenever the status of the client changes.

6.3. Customized Notifications Configuration

We can configure a custom notification system having at our disposal some powerful tools for this. We can use a reminding notifier to send a scheduled notification until the status of client changes.

Или може би искаме да изпращаме известия до филтриран набор от клиенти. За това можем да използваме известие за филтриране:

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