Автор оригинала: 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 .