Рубрики
Без рубрики

Контроль с помощью привода пружинного ботинка

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

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