Привод пружинной загрузки

2 min


обзор

В этой статье мы рассмотрим Привод пружинной загрузки, который предоставляет встроенные готовые конечные точки, которые можно использовать для мониторинга и управления вашим приложением.

Мониторинг приложений может включать в себя что-то такое простое, как знание Здоровье а также Информация к некоторым сложным данным, таким как понимание Движение а также метрика для нашего приложения. Например, сколько ресурсов (ЦП, ОЗУ и т. Д.) Используется приложением.

Вы можете взаимодействовать с исполнительными механизмами либо с конечными точками HTTP, либо с компонентами JMX. В этом уроке мы будем использовать конечные точки HTTP.

В Spring Boot 1 привод может использоваться только с Spring MVC, Но с Spring Boot 2 и введением WebFlux, его поддержка была расширена и может также использоваться с Джерси фреймворк без необходимости Spring MVC в пути к классам.

Привод пружинной загрузки

Чтобы продемонстрировать привод в работе, мы будем использовать простой сервис на основе Spring REST, работающий через порт по умолчанию (8080) с одной конечной точкой /hello который возвращает строковое сообщение.

Чтобы добавить привод, мы просто добавляем зависимость к нашему pom.xml файл:


    org.springframework.boot
    spring-boot-starter-actuator
    ${VERSION}

Все конечные точки подпадают под общий префикс /actuator, Для проверки перейдем в наш браузер к http://localhost:8080/actuator:

spring_boot_actuator_default_endpoints

Примечание: В Spring Boot 1 все конечные точки привода находились в корневом пути, т.е. /, но в Spring Boot 2 все они по умолчанию сгруппированы в /actuator,

Вы можете изменить базовый путь конечных точек привода, добавив следующие свойства в application.properties:

management.endpoints.web.base-path=/admin
management.server.port=8090

Теперь все конечные точки привода будут находиться под /admin префикс, который имеет смысл, поскольку только администратор должен иметь доступ к таким метрикам. Для этого урока мы оставим его по умолчанию /actuator,

По умолчанию конечные точки управления доступны на том же порте, что и приложение, но вы можете выбрать их для другого порта HTTP, установив management.server.port на порт HTTP по вашему выбору.

Мы не будем его менять, так как поведение по умолчанию предпочтительнее, особенно если вы работаете в облаке.

Конечные точки привода

Полный список доступных конечных точек можно увидеть в официальная документация, Возможно, вы заметили, что хотя существует много доступных конечных точек, результат http://localhost:8080/actuator показывает только /health а также /info,

Поскольку конечные точки исполнительного механизма содержат конфиденциальную информацию, нам пришлось явно раскрывать каждую из них, в противном случае мы сможем видеть только элементарную информацию, которая уже очевидна.

Перейдите в наш браузер, чтобы http://localhost:8080/actuator/health:

spring_boot_actuator_health

Теперь давайте проверим /info аналогично, и вы заметите, что он возвращает пустой ответ.

Это потому, что мы не предоставили никакой информации об этом в Spring. Это можно сделать, добавив свойства к info префикс в application.properties:

info.name= Test Spring Service
info.more.detail= This is a demo for Spring Actuator

spring_boot_actuator_info

Вы можете структурировать ключ JSON в соответствии со своими потребностями.

Выставление конечных точек

Для предоставления конечных точек Spring предоставляет 2 свойства, которые мы можем использовать по отдельности или в комбинации:

  • management.endpoints.web.exposure.exclude: Используется для исключения списка конечных точек, которые мы не хотим раскрывать. Значение по умолчанию для него пустое.
  • management.endpoints.web.exposure.include: Используется для включения списка конечных точек, которые мы хотим выставить. Значением по умолчанию для него является info, health, Вот почему обе эти конечные точки были доступны по умолчанию.

Примечание: exclude имеет приоритет над include

Итак, давайте настроим конфигурацию так, чтобы мы хотели выставить все конечные точки, кроме info а также health:

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_boot_actuator_all

Включение конечных точек

Кроме того подвергая конечные точки, мы также можем включить а также отключить их. Хотя экспонирование регулирует только то, можем ли мы их видеть или нет, включение позволяет регулировать, существуют ли они как бин в контексте Spring.

По умолчанию все конечные точки включены, кроме одной, shutdown конечная точка. Вы можете включить / отключить каждую конечную точку, установив management.endpoint..enabled свойство:

management.endpoint.shutdown.enabled=true
management.endpoint.beans.enabled=false

Вы также можете отключить все конечные точки, установив management.endpoints.enabled-by-default в false а затем индивидуально включить свойства, которые вы хотите. Для этого урока мы будем использовать настройку по умолчанию.

Примечание: Отключение конечных точек полностью удалит их как компоненты из контекста, и не имеет значения, если вы их выставили.

Поддержка кеширования

Все конечные точки (которые ЧИТАТЬ операции и не принимать никаких параметров) также имеет базовую поддержку кэширования.

Каждая конечная точка имеет свойство cache.time-to-live это автоматически генерируется для вас, что может быть использовано для указания времени кэширования:

management.endpoint.beans.cache.time-to-live=10s

Защита конечных точек привода

К настоящему времени стало ясно, что эти конечные точки хранят конфиденциальную информацию о нашем приложении, и было бы неплохо защитить их.

Для этого мы можем просто добавить весеннюю защиту в наше приложение, добавив 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();
    }
}

Приведенный выше код не требует пояснений, где мы разрешили любой HealthEndpoint быть публично доступным, в то время как другие требуют некоторой базовой аутентификации. Также обратите внимание, что EndpointRequest.to() это удобный метод, который автоматически заботится об окончательном URL-адресе конечных точек вашего привода, поскольку вы могли изменить его базовый путь в своем приложении.

Давайте перезапустим снова и проверим логи:

spring_boot_actuator_security

Поскольку Spring Security находится в пути к классам, он автоматически создает имя пользователя user и пароль, который генерируется случайным образом в начале приложения, как показано в журналах.

Давайте проверим /health конечная точка, и вы увидите вывод без какого-либо окна аутентификации. Теперь давайте попробуем любую другую конечную точку, скажем, /env и вам будет предложено подтвердить подлинность:

spring_boot_actuator_security_authenticate

Введите имя пользователя и пароль, и вы увидите соответствующий ответ:

spring_boot_actuator_security_authenticate_env

Если вы хотите определить свое собственное имя пользователя и пароль, вы можете легко сделать это через application.properties:

spring.security.user.name=user
spring.security.user.password=password

Создание пользовательских конечных точек

Это может быть достигнуто путем добавления @Endpoint а также @Component аннотация к вашему классу. После этого вы можете создавать методы и комментировать их @ReadOperation, @WriteOperation, или же @DeleteOperation соответственно. Конечно, вы можете иметь несколько методов с разными операциями.

Идея наличия нескольких операций состоит в том, чтобы отобразить разные методы HTTP-запроса:

  • @ReadOperation карты для HTTP GET
  • @WriteOperation карты для HTTP POST
  • @DeleteOperation карты для HTTP DELETE

Давайте создадим простую пользовательскую конечную точку:

@Component
@Endpoint(id = "details")
public class DetailsEndpoint {

    @ReadOperation
    public String details() {
        return "My App Details";
    }
}

Перезапустите приложение и перейдите в браузер, чтобы http://localhost:8080/actuator/details:

spring_boot_actuator_custom

Заключение

Мониторинг приложений может включать в себя что-то такое простое, как знание Здоровье а также Информация к некоторым сложным данным, таким как понимание Движение а также метрика для нашего приложения. Например, сколько ресурсов (ЦП, ОЗУ и т. Д.) Используется приложением.

Spring Boot Actuator предоставляет встроенные готовые конечные точки, которые можно использовать для мониторинга и управления вашим приложением, например: /info, /health, /scheduledTasks, и т.д.

Мы также можем определить наши собственные конечные точки для удовлетворения определенных требований путем простого аннотирования классов с помощью @Endpoint аннотаций.

Как всегда, код для примеров, используемых в этой статье, можно найти на GitHub,


0 Comments

Ваш e-mail не будет опубликован. Обязательные поля помечены *