Автор оригинала: Dhananjay Singh.
Обзор
В этой статье мы рассмотрим Привод пружинной загрузки , который предоставляет встроенные готовые к работе конечные точки , которые можно использовать для мониторинга и управления вашим приложением.
Приложения для мониторинга могут включать в себя такие простые вещи, как знание Состояния здоровья и Информации для некоторых сложных данных, таких как понимание Трафика и Показателей для нашего приложения. Например, сколько ресурсов (процессор, оперативная память и т.д.) Используется приложением.
Вы можете выбрать взаимодействие с исполнительными механизмами либо с конечными точками HTTP, либо с компонентами JMX. В этом руководстве мы будем использовать конечные точки HTTP.
В Spring Boot 1 привод можно было использовать только с Spring MVC . Но с Spring Boot 2 и внедрением WebFlux его поддержка была расширена и также может использоваться с платформой Jersey без необходимости использования Spring MVC в пути к классам.
Привод Пружинного Ботинка
Чтобы продемонстрировать привод в работе, мы будем использовать простую службу на основе Spring REST, работающую на порту по умолчанию ( 8080 ) с единственной конечной точкой /привет , которая возвращает строковое сообщение.
Чтобы добавить привод, мы просто добавляем зависимость в ваш pom.xml файл:
org.springframework.boot spring-boot-starter-actuator ${VERSION}
Все конечные точки подпадают под общий префикс /привод . Чтобы проверить, давайте перейдем в вашем браузере по адресу http://localhost:8080/actuator :
Примечание: В Spring Boot 1 все конечные точки привода находились в корневом базовом пути, т. е. / , но в Spring Boot 2 все они по умолчанию сгруппированы в /привод .
Вы можете изменить базовый путь конечных точек привода, добавив следующие свойства в application.properties :
management.endpoints.web.base-path=/admin management.server.port=8090
Теперь все конечные точки привода будут находиться под префиксом /admin , что имеет смысл, поскольку только администратор должен иметь доступ к таким показателям, как эти. Для этого урока мы оставим его по умолчанию /привод .
По умолчанию конечные точки управления доступны на том же порту, что и у вашего приложения, но вы можете предоставить их на другом HTTP-порту, установив management.server.port на выбранный вами HTTP-порт.
Мы не будем его изменять, так как поведение по умолчанию предпочтительнее, особенно если вы работаете в облаке.
Конечные точки Привода
Полный список доступных конечных точек можно посмотреть в официальной документации . Возможно, вы заметили, что, хотя доступно много конечных точек, результат http://localhost:8080/actuator показывает только /здоровье и /информацию .
Поскольку конечные точки привода содержат конфиденциальную информацию, нам пришлось явно раскрыть каждую из них, иначе мы сможем увидеть только элементарную информацию, которая уже очевидна.
Перейдите в свой браузер, чтобы http://localhost:8080/actuator/health :
Теперь давайте проверим /info аналогичным образом, и вы заметите, что он возвращает пустой ответ.
Это связано с тем, что мы не предоставили никакой информации об этом Spring. Это можно сделать, добавив свойства к префиксу info в application.properties :
info.name= Test Spring Service info.more.detail= This is a demo for Spring Actuator
Вы можете структурировать ключ JSON в соответствии с вашими потребностями.
Раскрытие Конечных точек
Чтобы предоставить конечные точки, Spring предоставляет 2 свойства, которые мы можем использовать по отдельности или в комбинации:
management.endpoints.web.exposure.exclude: Используется для исключения списка конечных точек, которые мы не хотим раскрывать. Значение по умолчанию для него пустое.management.endpoints.web.exposure.include: Используется для включения списка конечных точек, которые мы хотим предоставить. Значение по умолчанию для него –информация, здоровье. Вот почему обе эти конечные точки были доступны по умолчанию.
Примечание: исключить имеет приоритет над включить
Итак, давайте настроим конфигурацию так, чтобы мы хотели предоставить доступ ко всем конечным точкам, за исключением информация и здоровье :
management.endpoints.web.exposure.include=* management.endpoints.web.exposure.exclude=info,health
Примечание: Если вы используете файл свойств на основе YAML, * имеет особое значение и может использоваться только с кавычками :
management:
endpoints:
web:
exposure:
exclude: "*"
В этом уроке мы расскажем обо всех конечных точках наших приводов. Итак, давайте добавим следующую конечную точку в наш application.properties :
management.endpoints.web.exposure.include= *
Теперь давайте еще раз проверим конечную точку привода, открыв http://localhost:8080/actuator :
Включение Конечных точек
Помимо раскрытия конечных точек, мы также можем включить и отключить их. В то время как раскрытие регулирует только то, можем ли мы их видеть или нет, включение регулирует, существуют ли они как боб в контексте Spring.
Git Essentials
Ознакомьтесь с этим практическим руководством по изучению Git, содержащим лучшие практики и принятые в отрасли стандарты. Прекратите гуглить команды Git и на самом деле изучите это!
По умолчанию все конечные точки включены, за исключением одной, конечной точки завершение работы . Вы можете включить/отключить каждую конечную точку, установив свойство management.endpoint..enabled :
management.endpoint.shutdown.enabled=true management.endpoint.beans.enabled=false
Вы также можете отключить все конечные точки, установив management.endpoints.enabled-по умолчанию в false , а затем индивидуально включить нужные свойства. Для этого урока мы будем использовать настройки по умолчанию.
Примечание: Отключение конечных точек полностью удалит их как компоненты из контекста, и не будет иметь значения, раскрыли ли вы их.
Поддержка Кэширования
Все конечные точки (которые работают ЧТЕНИЕ и не принимают никаких параметров) также имеют базовую поддержку кэширования.
Каждая конечная точка имеет свойство cache.time-to-live , которое автоматически генерируется для вас и может использоваться для указания времени кэширования:
management.endpoint.beans.cache.time-to-live=10s
Крепление Конечных Точек Привода
К настоящему времени было бы ясно, что эти конечные точки хранят конфиденциальную информацию о нашем приложении, и было бы неплохо защитить их.
Для этого мы можем просто добавить безопасность spring в ваше приложение, добавив зависимость spring-boot-starter-security в нашу pom.xml :
org.springframework.boot spring-boot-starter-security ${VERSION}
По умолчанию, просто импортировав его, все конечные точки в нашем приложении будут защищены.
Но давайте предположим, что мы хотим, чтобы наша конечная точка /health была доступна для всех, но остальные из них были безопасными. Это гарантирует наличие специального фильтра для пропуска определенных пользователей и сдерживания других.
Для этого мы должны добавить класс @Configuration , который расширяет WebSecurityConfigurerAdapter , как и в любом другом приложении Spring Boot, которое мы хотим защитить с помощью Spring Security.
Затем нам нужно переопределить метод .configure () , в котором мы определяем конфигурацию безопасности для нашего приложения:
@Configuration
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.csrf().disable()
.authorizeRequests()
.requestMatchers(EndpointRequest.to(HealthEndpoint.class)).permitAll()
.requestMatchers(EndpointRequest.toAnyEndpoint()).authenticated()
.and()
.httpBasic();
}
}
Приведенный выше код не требует пояснений, где мы разрешили любой конечной точке работоспособности быть общедоступной, в то время как другие требуют некоторой базовой аутентификации. Также обратите внимание, что EndpointRequest.to () -это удобный метод, который автоматически обрабатывает конечный URL-адрес конечных точек вашего привода, поскольку вы, возможно, изменили его базовый путь в своем приложении.
Давайте снова перезагрузимся и проверим журналы:
Поскольку Spring Security находится в пути к классу, он автоматически создает имя пользователя user и пароль, которые генерируются случайным образом при запуске приложения, как показано в журналах.
Давайте проверим /работоспособность конечную точку, и вы увидите вывод без какого-либо поля аутентификации. Теперь давайте попробуем любую другую конечную точку, скажем /env , и вам будет предложено пройти аутентификацию:
Введите имя пользователя и пароль, и вы увидите соответствующий ответ:
Если вы хотите определить свое собственное имя пользователя и пароль, вы можете легко сделать это с помощью application.properties :
spring.security.user.name=user spring.security.user.password=password
Создание Пользовательских Конечных Точек
Это может быть достигнуто путем добавления @конечной точки и @Компонента аннотации к вашему классу. После этого вы можете создавать методы и аннотировать их с помощью @ReadOperation , @WriteOperation или |/@DeleteOperation соответственно. Конечно, у вас может быть несколько методов с различными операциями.
Идея наличия нескольких операций заключается в сопоставлении с различными методами HTTP-запроса:
@ReadOperationсопоставляется с HTTP GET@WriteOperationсопоставляется с HTTP-СООБЩЕНИЕМ@DeleteOperationсопоставляется с HTTP УДАЛИТЬ
Давайте создадим простую пользовательскую конечную точку:
@Component
@Endpoint(id = "details")
public class DetailsEndpoint {
@ReadOperation
public String details() {
return "My App Details";
}
}
Перезапустите приложение и перейдите в свой браузер, чтобы http://localhost:8080/actuator/details :
Вывод
Приложения для мониторинга могут включать в себя такие простые вещи, как знание Состояния здоровья и Информации для некоторых сложных данных, таких как понимание Трафика и Показателей для нашего приложения. Например, сколько ресурсов (процессор, оперативная память и т.д.) Используется приложением.
Привод пружинной загрузки обеспечивает встроенные готовые к работе конечные точки, которые можно использовать для мониторинга и управления вашим приложением, таким как /информация , /здоровье , /Запланированные задачи и т.д.
Мы также можем определить ваши собственные конечные точки для удовлетворения определенных требований путем простого аннотирования классов с помощью аннотации @Endpoint .
Как всегда, код для примеров, используемых в этой статье, можно найти на GitHub .