Spring Boot Admin — это крутая панель мониторинга ваших приложений весенней загрузки. Однако его настройка не так тривиальна. В документации изложены два варианта :
- Включение клиентской библиотеки в ваше загрузочное приложение, которое подключается к приложению администратора — для этого необходимо, чтобы приложение администратора было развернуто где-то общедоступно или, по крайней мере, доступно из вашего приложения, а также информировало ваше приложение о том, что оно отслеживается.
- Использование облачного обнаружения, что означает, что ваше приложение является частью инфраструктуры обнаружения услуг, например, с использованием микросервисов.
Оба варианта не очень хороши для более простых сценариев, таких как монолитное приложение , запускаемое на некотором IaaS, и развертывание приложения администратора на локальном компьютере или в какой-либо локальной инфраструктуре компании. Обнаружение в облаке является излишним, если оно вам еще не нужно, и включение клиентской библиотеки усложняет доступ к административному серверу для вашего приложения, а не наоборот. И, кроме того, эта двусторонняя зависимость звучит неправильно.
К счастью, существует недокументированный, но реализованный SimpleDiscoveryClient который позволяет просто запустить Spring Boot Admin с некоторой конфигурацией на любой машине и подключить ее к приложению весенней загрузки.
Первым требованием является настройка привода с пружинной загрузкой в загрузочном приложении. Привод предоставляет все необходимые конечные точки для работы приложения администратора. Это звучит тривиально для установки — вы просто добавляете кучу зависимостей и, возможно, указываете некоторые параметры конфигурации и все. На самом деле, в реальном приложении это не так просто, особенно в отношении базовой аутентификации для конечных точек привода. Вам нужна отдельная защита пружины (в дополнение к существующей конфигурации защиты пружины), чтобы применить базовую аутентификацию только к конечным точкам привода. Например:
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
|
@Configuration@Order(99) // the default security configuration has order 100public class ActuatorSecurityConfiguration extends WebSecurityConfigurerAdapter { @Value("${security.user.name}") private String username; @Value("${security.user.password}") private String password; @Override protected void configure(HttpSecurity http) throws Exception { InMemoryUserDetailsManager manager = new InMemoryUserDetailsManager(); manager.createUser(User.withUsername(username).password(password).roles("ACTUATOR","ADMIN").build()); http.antMatcher("/manage/**").authorizeRequests().anyRequest().hasRole("ACTUATOR").and().httpBasic() .and().userDetailsService(manager); }} |
Это немного нелогично, но это работает. Не уверен, что это идиоматично — с пружинной защитой и пружинной загрузкой вы никогда не знаете, что идиоматично. Примечание: предположительно должно быть возможным автоматическое включение security.user.name (и пароля) в некоторый менеджер, но я не смог его найти, поэтому я просто создал экземпляр в памяти. Обратите внимание на путь /manage/** — для того, чтобы все конечные точки привода находились под этим путем, вам нужно указать файл management.context-path=/manage в файле свойств вашего приложения.
Теперь, когда конечные точки привода настроены, мы должны прикрепить наше приложение администратора для пружин. Это выглядит так:
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
|
@Configuration@EnableAutoConfiguration@PropertySource("classpath:/application.properties")@EnableAdminServerpublic class BootAdminApplication { public static void main(String[] args) { SpringApplication.run(BootAdminApplication.class, args); } @Autowired private ApplicationDiscoveryListener listener; @PostConstruct public void init() { // we have to fire this event in order to trigger the service registration InstanceRegisteredEvent<?> event = new InstanceRegisteredEvent<>("prod", null); // for some reason publising doesn't work, so we invoke directly listener.onInstanceRegistered(event); }} |
Обычно нужно внедрить ApplicationEventPublisher и отправить туда сообщение, а не напрямую вызывать слушателя, как показано выше. Мне не удалось заставить его работать легко, поэтому я обошел это.
Упомянутый файл application.properties должен находиться в src / main / resources и выглядит так:
|
1
2
3
4
5
|
spring.cloud.discovery.client.simple.instances.prod[0].uri=https://your-spring-boot-application-url.comspring.cloud.discovery.client.simple.instances.prod[0].metadata.user.name=<basic-auth-username>spring.cloud.discovery.client.simple.instances.prod[0].metadata.user.password=<basic-auth-password>spring.boot.admin.discovery.converter.management-context-path=/managespring.boot.admin.discovery.services=* |
Что это делает? Он использует SimpleDiscoveryClient который SimpleDiscoveryClient с помощью автоконфигурации. На самом деле, этот клиент не работал до последней версии — он генерировал исключение NullPointerException, потому что метаданные (которые обрабатывают имя пользователя и пароль) всегда были нулевыми. В 1.2.2 облачных сообществ они исправили это:
|
1
2
3
4
5
|
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-commons</artifactId> <version>1.2.2.RELEASE</version></dependency> |
Простой клиент обнаружения именно такой: вы указываете URL-адрес вашего загрузочного приложения, и он периодически извлекает данные из конечных точек привода. Почему это не задокументировано и почему это не сработало до недавнего времени — я понятия не имею. Кроме того, я не знаю, почему вы должны вручную отправить событие, которое вызывает обнаружение. Может быть, это не идиоматично, но это не происходит автоматически, и это заставило его работать.
Как обычно с вещами, которые «просто работают» и имеют «простые настройки» — это никогда не бывает так. Если у вас есть что-то немного более сложное, чем мир приветствия, вы должны выкопать несколько непонятных классов и отправиться в путь. К счастью, в этом случае это действительно работает, а не требует отвратительных обходных путей.
| Ссылка: | Простая настройка Spring Boot Admin от нашего партнера JCG Божидара Божанова в блоге на техническом блоге Божо . |