Мониторинг производства является важной частью поставщика услуг программного обеспечения. Многие компании предоставляют системы мониторинга для поддержания производственной среды. Spring Boot поставляется с различными удивительными модулями, с помощью которых разработчики могут легко настраивать и поддерживать среды разработки и производства. Модуль привода обеспечивает готовые к использованию функции, с помощью которых мы можем легко поддерживать производственную среду. Привод предоставляет конечные точки JMX и HTTP.
Характеристики
- Конечные точки: Spring Boot Actuator предоставляет некоторые конечные точки по умолчанию, с помощью которых мы можем получить доступ к информации о приложении. Мы также можем отслеживать производственную среду с этими конечными точками. К конечным точкам также могут обращаться сторонние инструменты мониторинга.
- Метрики: мы можем получить доступ к информации об ОС и JVM, используя конечные точки привода с пружинной загрузкой. Это очень полезно для среды выполнения. Пружинный исполнительный механизм обеспечивает эту функцию за счет интеграции с мониторингом приложения микрометра .
- Аудит: Spring Boot Actuator публикует события для
AuditEventRepository
. Spring Security по умолчанию публикует исключения «успешное завершение», «сбой» и «отказано в доступе». Это очень полезная функция для отчетов и ошибок аутентификации. Аудит может быть включен AuditEventRepository. По умолчанию spring-boot предоставляет InMemoryAuditEventRepository для аудита, который имеет ограниченные возможности. - Трассировка HTTP: исполнительный механизм Spring boot также предоставляет возможность трассировки HTTP. Если вы хотите использовать его, вы должны включить веб-конечную точку. Трассировка Http предоставляет информацию об обмене запросом-ответом.
Важные конечные точки
Spring Boot Actuator предоставляет перечисленные конечные точки HTTP и JMX. Мы обсудим подробно позже часть этой статьи.
Строительный проект
Поскольку мы знаем, что Spring Boot обеспечивает некоторую начальную зависимость для различных пружинных модулей, мы можем создавать приложения из Spring Initializr с веб-модулями и исполнительными модулями. Вы можете следовать инструкциям изображения. Мы будем использовать Gradle в качестве инструмента для сборки.
Нажмите на кнопку «Создать», чтобы создать первоначальный проект. После этого скопируйте этот проект в папку на вашем компьютере и разархивируйте его. Перейдите в корневую папку проекта и откройте терминал. Ваш начальный файл сборки выглядит как приведенный ниже код.
Groovy
x
1
plugins {
2
id 'org.springframework.boot' version '2.2.4.RELEASE'
3
id 'io.spring.dependency-management' version '1.0.9.RELEASE'
4
id 'java'
5
}
6
group = 'com.sanju'
8
version = '0.0.1-SNAPSHOT'
9
sourceCompatibility = '1.8'
10
repositories {
12
mavenCentral()
13
}
14
dependencies {
16
implementation 'org.springframework.boot:spring-boot-starter-actuator'
17
implementation 'org.springframework.boot:spring-boot-starter-web'
18
testImplementation('org.springframework.boot:spring-boot-starter-test') {
19
exclude group: 'org.junit.vintage', module: 'junit-vintage-engine'
20
}
21
}
22
test {
24
useJUnitPlatform()
25
}
26
Так что теперь мы развернем проект. Беги gradle bootrun
от терминала. При конфигурации по умолчанию приложение будет работать на порте 8080 с путем управления / приводом. После завершения развертывания мы просмотрим URL-адрес http: // localhost: 8080 / activator / из браузера. При конфигурации по умолчанию модуль исполнительного механизма предоставляет четыре конечные точки, которые мы можем видеть в качестве ответа.
xxxxxxxxxx
1
// 20200222142835
2
// http://localhost:8080/actuator/
3
{
5
"_links": {
6
"self": {
7
"href": "http://localhost:8080/actuator",
8
"templated": false
9
},
10
"health-path": {
11
"href": "http://localhost:8080/actuator/health/{*path}",
12
"templated": true
13
},
14
"health": {
15
"href": "http://localhost:8080/actuator/health",
16
"templated": false
17
},
18
"info": {
19
"href": "http://localhost:8080/actuator/info",
20
"templated": false
21
}
22
}
23
}
Модуль Spring Boot Actuator позволяет изменить порт и путь управления, добавив некоторое свойство в файл application.properties. Итак, мы добавим следующие строки кода в файл application.properties.
Файлы свойств
x
1
management.endpoints.web.base-path=/custom-path
2
management.server.port=8070
После развертывания с этими изменениями мы получим тот же вывод с http: // localhost: 8070 / custom-path / URL.
Выставить конечные точки
При конфигурации по умолчанию мы можем получить доступ только к четырем конечным точкам, но Spring Actuator имеет больше конечных точек, таких как метрики, трассировка HTTP, события аудита и т. Д. Если мы хотим получить доступ к таким конечным точкам, нам нужно их настроить. Привод с пружинной загрузкой обеспечивает некоторую конфигурацию для включения и исключения конечных точек от пользователя. Вот пример файла application.properties.
Файлы свойств
x
1
management.endpoints.web.base-path=/custom-path
2
management.server.port=8070
3
management.endpoints.jmx.exposure.include=*
4
management.endpoints.jmx.exposure.exclude=health, metrics
5
management.endpoints.web.exposure.include=*
6
management.endpoints.web.exposure.exclude=health, metrics
После развертывания с помощью этого файла свойств мы проверим различные конечные точки. Мы видим, что без конечных точек работоспособности и показателей будут работать максимальные конечные точки. Чтобы сделать все конечные точки работоспособными, нам нужно добавить больше настроек, связанных с конкретными конечными точками. Если мы нажмем http: // localhost: 8070 / custom-path / , мы увидим, что конечные точки открыты приводом.
Здесь мы видим, что конечная точка работоспособности и показателей отсутствует, потому что мы тогда исключили из нашей конфигурации
Добавить пользовательские конечные точки
Spring Boot Actuator предоставляет возможность записи пользовательских конечных точек, откуда мы можем видеть наши собственные пользовательские данные приложений. Например, я использую пользовательскую конечную точку для проверки адреса моего сервера, сервера, в котором развернута ОС, MAC-адрес сервера и какая версия Java установлена на компьютере сервера.
Джава
xxxxxxxxxx
1
package com.sanju.actuatordemo.core;
2
import org.springframework.boot.actuate.endpoint.annotation.Endpoint;
4
import org.springframework.boot.actuate.endpoint.annotation.ReadOperation;
5
import org.springframework.stereotype.Component;
6
import java.net.InetAddress;
8
import java.net.NetworkInterface;
9
import java.time.LocalDate;
10
import java.time.LocalTime;
11
import java.util.ArrayList;
12
import java.util.List;
13
15
id = "server-info") (
16
public class ServerInfoActuatorEndpoint {
17
19
public List<String> getServerInfo() {
20
List<String> serverInfo = new ArrayList<String>();
21
try {
22
serverInfo.add("Server IP Address : " + InetAddress.getLocalHost().getHostAddress());
23
serverInfo.add("Host Name: " + InetAddress.getLocalHost().getHostName());
24
serverInfo.add("Server OS : " + System.getProperty("os.name").toLowerCase());
25
NetworkInterface network = NetworkInterface.getByInetAddress(InetAddress.getLocalHost());
26
byte[] mac = network.getHardwareAddress();
27
StringBuilder sb = new StringBuilder();
28
for (int i = 0; i < mac.length; i++) {
29
sb.append(String.format("%02X%s", mac[i], (i < mac.length - 1) ? "-" : ""));
30
}
31
serverInfo.add("Hardware Address : "+ sb.toString());
32
serverInfo.add("Java Version : "+getJavaVersion());
33
} catch (Exception e) {
34
e.printStackTrace();
35
}
36
return serverInfo;
37
}
38
private int getJavaVersion() {
39
String version = System.getProperty("java.version");
40
if(version.startsWith("1.")) {
41
version = version.substring(2, 3);
42
} else {
43
int dot = version.indexOf(".");
44
if(dot != -1) { version = version.substring(0, dot); }
45
} return Integer.parseInt(version);
46
}
47
}
49
Spring Boot Actuator предоставляет некоторую аннотацию, с помощью которой мы только что настроили нашу систему. @Endpoint
аннотаций позволило ему в качестве конечной точки и аннотации @WriteOperation
, @ReadOperation
, @DeleteOperation
чтобы выполнить как POST, GET, DELETE операции в HTTP глаголы. Здесь мы просто использовали @ReadOperation
аннотацию. Поэтому, если мы теперь повторно развернем приложение и нажмем URL http: // localhost: 8070 / custom-path / server-info , мы получим следующий вывод.
xxxxxxxxxx
1
// 20200222160924
2
// http://localhost:8070/custom-path/server-info
3
[
5
"Server IP Address : 192.168.0.177",
6
"Host Name: Sanjoys-MacBook-Pro.local",
7
"Server OS : mac os x",
8
"Hardware Address : A4-5E-60-F2-07-51",
9
"Java Version : 8"
10
]
Spring Security с приводом
Spring Boot Actuator предоставляет некоторые конечные точки, которые действительно чувствительны. Эти конечные точки содержат много информации, относящейся к системным и основным приложениям, например, к компонентам, метрикам и информации о конфигурации. Таким образом, мы должны сделать доступ ограниченным для конечных точек. Для этой цели мы можем использовать Spring Security. Spring Boot Actuator обеспечивает автоматическую настройку безопасности пружины. Чтобы обеспечить безопасность конечных точек, мы должны добавить следующую зависимость в файл build.properties .
Groovy
1
compile 'org.springframework.boot:spring-boot-starter-security'
Чтобы определить имя пользователя и пароль, нам нужно добавить следующие строки в файл application.properties .
Groovy
xxxxxxxxxx
1
spring.security.user.name=admin
2
spring.security.user.password=admin
Автоматическая настройка безопасности Spring Boot Actuator завершена. Нам нужно перезапустить сервер снова, чтобы включить безопасность Spring. После повторного развертывания приложения мы должны нажать http: // localhost: 8070 / custom-path / server-info . URL будет перенаправлен на http: // localhost: 8070 / login ..
Поскольку мы настроили admin как имя пользователя и пароль, нам нужно ввести имя пользователя и пароль и нажать кнопку «Войти». Если мы введем неправильное имя пользователя или пароль, это приведет к ошибке «Неверные учетные данные» . В противном случае, перенаправьте на нашу страницу желаний. По умолчанию /info
конечные точки и / health не ограничены. Мы можем получить доступ к тем без учетных данных.
Начиная с Spring Boot 2, мы можем настроить конфигурацию безопасности конечной точки с помощью безопасности Spring, расширив WebSecurityConfigurerAdapter
класс. Я создал класс, SecurityConfig
который расширяет WebSecurityConfigurerAdapter
и переопределяет конфигурацию и userDetailsService
метод. Я также включил кодировщик bcrypt в качестве кодировщика пароля.
Джава
x
1
package com.sanju.actuatordemo.core;
2
import org.springframework.boot.actuate.autoconfigure.security.servlet.EndpointRequest;
4
import org.springframework.context.annotation.Bean;
5
import org.springframework.context.annotation.Configuration;
6
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
7
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
8
import org.springframework.security.core.userdetails.User;
9
import org.springframework.security.core.userdetails.UserDetails;
10
import org.springframework.security.core.userdetails.UserDetailsService;
11
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
12
import org.springframework.security.crypto.password.PasswordEncoder;
13
import org.springframework.security.provisioning.InMemoryUserDetailsManager;
14
17
public class SecurityConfig extends WebSecurityConfigurerAdapter {
18
19
protected void configure(HttpSecurity http) throws Exception {
20
http.requestMatcher(EndpointRequest.toAnyEndpoint()).authorizeRequests()
21
.antMatchers("/custom-path/**").hasRole("ADMIN")
22
.and()
23
.httpBasic();
24
}
25
27
28
public UserDetailsService userDetailsService() {
29
UserDetails user =
30
User.withUsername("admin")
31
.password(passwordEncoder().encode("admin"))
32
.roles("ADMIN")
33
.build();
34
return new InMemoryUserDetailsManager(user);
35
}
36
38
public PasswordEncoder passwordEncoder() {
39
return new BCryptPasswordEncoder();
40
}
41
}
42
С этой конфигурацией мы можем ограничить определенные конечные точки, как мы хотим. Итак, теперь мы нажимаем URL-адрес http: // localhost: 8070 / custom-path / info из браузера, он выдает всплывающее окно с учетными данными.
Поэтому мы должны ввести свои учетные данные для доступа к конкретному URL, в противном случае мы получим 403 несанкционированного ответа. Можем ли мы получить более подробную информацию от весенней безопасности .
Подробнее о / информация Конечная точка
С помощью /info
конечной точки мы хотим получить основную информацию о приложении. Например, мы можем определить статические свойства приложения, указав их в файле application.properties.
xxxxxxxxxx
1
info.app.name=Spring Boot actuator Test Application
2
info.app.description=Sample application for article
3
info.app.version=1.0.0
После добавления этой конфигурации мы можем просмотреть http: // localhost: 8070 / custom-path / info URL. Мы должны получить следующий вывод
Мы можем добавить другую информацию, такую как информация о сборке, информация о git приложения. Итак, мы должны добавить следующие строки кода в файл build.properties. Для информации о сборке мы должны добавить
Groovy
xxxxxxxxxx
1
springBoot {
2
buildInfo()
3
}
А для получения информации о git мы должны инициализировать репозиторий git, выполнив команду git init, а затем добавить файлы и выполнить коммит в git, выполнив git add -A, git commit -m "Initial commit" соответственно. А затем добавьте следующий плагин в build.properties.
Groovy
xxxxxxxxxx
1
plugins {
2
id 'org.springframework.boot' version '2.2.4.RELEASE'
3
id 'io.spring.dependency-management' version '1.0.9.RELEASE'
4
// added plugin to access git information
5
id "com.gorylenko.gradle-git-properties" version "1.5.1"
6
id 'java'
7
}
Мы только что завершили настройку для различной информации о приложении.
Мы можем увидеть пользовательскую информацию приложения с помощью InfoContributor
интерфейса. Мы будем создавать CustomInfoContributor.java
путем реализации InfoIndicator.
Джава
xxxxxxxxxx
1
package com.sanju.actuatordemo.core;
2
import org.springframework.boot.actuate.info.Info;
4
import org.springframework.boot.actuate.info.InfoContributor;
5
import org.springframework.stereotype.Component;
6
8
public class CustomInfoContributor implements InfoContributor {
9
10
public void contribute(Info.Builder builder) {
11
builder.withDetail("customInfo","This is custom info indicator. You can add your application data. " +
12
"You can share application persistent data from here");
13
}
14
}
15
Поэтому мы нажмем http: // localhost: 8070 / custom-path / info URL из браузера и получим следующий ответ.
Итак, здесь мы получили всю информацию с пользовательской информацией.
Подробнее о / здоровье Конечная точка
При конфигурации по умолчанию конечная точка работоспособности возвращает единственную информацию о том, работает ли сервер или нет. Но мы можем проверить детали также, добавив следующую строку кода в файл application.properties. Здесь значение может быть, когда авторизовано, всегда или никогда не по ключу management.endpoint.health.show-details.
xxxxxxxxxx
1
management.endpoint.health.show-details=always
Мы также можем добавить детали пользовательской информации о здоровье с подробным ответом. Вот почему мы должны добавить пользовательский класс, который будет реализовывать интерфейс.HealthIndicator
Джава
xxxxxxxxxx
1
package com.sanju.actuatordemo.core;
2
import org.springframework.beans.factory.annotation.Autowired;
3
import org.springframework.boot.actuate.health.Health;
4
import org.springframework.boot.actuate.health.HealthEndpoint;
5
import org.springframework.boot.actuate.health.HealthIndicator;
6
import org.springframework.stereotype.Component;
7
9
public class CustomHealthIndicator implements HealthIndicator {
10
11
public Health health() {
12
Health health = Health.up().withDetail("Details","Server is up").build();
13
return health;
14
}
15
}
16
После повторного развертывания сервера мы можем просмотреть http: // localhost: 8070 / custom-path / health URL из браузера. Мы получим ответ ниже.
Spring Boot Actuator содержит много полезных конечных точек, больше, чем я объяснил выше. Привод обеспечивает множество полезных функций в производственной среде. Есть много вещей для обсуждения, но эта статья уже идет слишком долго. Я буду обсуждать детали некоторых других конечных точек и функций в моей следующей статье. Спасибо.
Удачного кодирования !!!
Вы можете прочитать мою оригинальную статью здесь