Всем привет, меня зовут Лей.
Обзор
Spring Boot имеет очень полезное исходное программное обеспечение для мониторинга и управления, которым является Spring Boot Admin. Программное обеспечение может отображать информацию в приводе в интерфейсе, а также может отслеживать состояние работоспособности всех приложений Spring Boot и предоставлять функции оповещения в реальном времени.
Основные функциональные точки:
-
Отображение состояния мониторинга приложения -
Онлайн- и офлайн-мониторинг приложений -
Просмотр JVM, информации о потоке -
Визуальный просмотр журналов и загрузка файлов журналов -
Динамическое переключение уровней журнала -
Отслеживание информации по HTTP-запросам -
Другие функциональные точки...
адрес проекта:
https://github.com/codecentric/spring-boot-admin
Описание процесса строительных услуг
-
служба мониторинга администратора сервера -
клиентский сервис admin-order amdin
Создайте проект администратора Spring Boot
Описание версии: Предлагаемая версия: Spring Boot 2.x=Spring Boot Admin 2.x
(Например, Spring Boot 2.3.x может использовать Spring Boot Admin 2.3.x)
Создайте проект Spring Boot для отображения информации мониторинга в каждой службе, а также зависимостей Spring Boot Admin, конкретный код выглядит следующим образом.
пом-зависимости
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.6.RELEASE</version>
</parent>
<properties>
<java.version>1.8</java.version>
<spring.cloud.alibaba.version>2.2.5.RELEASE</spring.cloud.alibaba.version>
<spring.boot.version>2.3.6.RELEASE</spring.boot.version>
<spring.cloud.version>Hoxton.SR8</spring.cloud.version>
<admin.starter.server.version>2.3.1</admin.starter.server.version>
</properties>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>de.codecentric</groupId>
<artifactId>spring-boot-admin-starter-server</artifactId>
<version>${admin.starter.server.version}</version>
</dependency>
стартовый класс
Добавить к@EnableAdminServer
@EnableAdminServer
@SpringBootApplication
public class AdminServerApplication {
public static void main(String[] args) {
SpringApplication.run(AdminServerApplication.class,args);
}
}
YML-конфигурация
Добавьте информацию о конфигурации порта в файл свойств:
server:
port: 8000
spring:
application:
## 注册服务名
name: admin-order
management:
endpoint:
health:
show-details: always
Запустите программу и посетите веб-адрес http://127.0.0.1:8000/
, чтобы увидеть главную страницу В настоящее время нет данных, как показано на рисунке 1.
Обслуживание клиентов
процесс
Создайте amdin-order
сервис, зарегистрируйте сервис admin-server
с помощью
пом-зависимости
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.6.RELEASE</version>
</parent>
<properties>
<java.version>1.8</java.version>
<spring.cloud.alibaba.version>2.2.5.RELEASE</spring.cloud.alibaba.version>
<spring.boot.version>2.3.6.RELEASE</spring.boot.version>
<spring.cloud.version>Hoxton.SR8</spring.cloud.version>
<spring.boot.admin.client.version>2.3.1</spring.boot.admin.client.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.16.14</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>de.codecentric</groupId>
<artifactId>spring-boot-admin-starter-client</artifactId>
<version>${spring.boot.admin.client.version}</version>
</dependency>
</dependencies>
YML-конфигурация
spring:
application:
## 注册服务名
name: admin-order
## spring boot admin
boot:
admin:
client:
api-path:
url: http://127.0.0.1:8000
instance:
prefer-ip: true # 使用ip注册进来
server:
port: 8100
# endpoints config
management:
endpoint:
health:
show-details: always
endpoints:
enabled-by-default: true
web:
base-path: /actuator
exposure:
include: '*'
Запустить службу админ-заказов
@SpringBootApplication
public class AdminOrderApp {
public static void main(String[] args) {
SpringApplication.run(AdminOrderApp.class,args);
}
}
Обновите платформу администратора, и admin-order
сервис можно будет отслеживать

-
Зеленое здоровье -
Серый: время ожидания информации о работоспособности клиента подключения (более 10 с) -
Красный: вы можете увидеть конкретную ненормальную информацию
Платформа мониторинга администратора Spring Boot
Информация о статистике
Индивидуальная информационная информация, состояние здоровья, метаданные, как показано на рисунке.

Информация об интерфейсе конечной точки

Информация JVM

Просмотр журналов каждой службы в Admin
Клиенту необходимо синхронизировать логи с сервисом ADMI.Через JMX конфигурация клиента следующая
Добавьте конфигурацию logback-spring.xml
<?xml version="1.0" encoding="UTF-8"?>
<!--
小技巧: 在根pom里面设置统一存放路径,统一管理方便维护
<properties>
<log-path>/Users/lengleng</log-path>
</properties>
1. 其他模块加日志输出,直接copy本文件放在resources 目录即可
2. 注意修改 <property name="${log-path}/log.path" value=""/> 的value模块
-->
<configuration debug="false" scan="false">
<property name="log.path" value="logs/admin-order"/>
<!-- 彩色日志格式 -->
<property name="CONSOLE_LOG_PATTERN"
value="${CONSOLE_LOG_PATTERN:-%(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %(${LOG_LEVEL_PATTERN:-%5p}) %(${PID:- }){magenta} %(---){faint} %([%15.15t]){faint} %(%-40.40logger{39}){cyan} %(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"/>
<!-- 彩色日志依赖的渲染类 -->
<conversionRule conversionWord="clr" converterClass="org.springframework.boot.logging.logback.ColorConverter"/>
<conversionRule conversionWord="wex"
converterClass="org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter"/>
<conversionRule conversionWord="wEx"
converterClass="org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter"/>
<!-- Console log output -->
<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>${CONSOLE_LOG_PATTERN}</pattern>
</encoder>
</appender>
<!-- Log file debug output -->
<appender name="debug" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${log.path}/debug.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>${log.path}/%d{yyyy-MM, aux}/debug.%d{yyyy-MM-dd}.%i.log.gz</fileNamePattern>
<maxFileSize>50MB</maxFileSize>
<maxHistory>30</maxHistory>
</rollingPolicy>
<encoder>
<pattern>%date [%thread] %-5level [%logger{50}] %file:%line - %msg%n</pattern>
</encoder>
</appender>
<!-- Log file error output -->
<appender name="error" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${log.path}/error.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>${log.path}/%d{yyyy-MM}/error.%d{yyyy-MM-dd}.%i.log.gz</fileNamePattern>
<maxFileSize>50MB</maxFileSize>
<maxHistory>30</maxHistory>
</rollingPolicy>
<encoder>
<pattern>%date [%thread] %-5level [%logger{50}] %file:%line - %msg%n</pattern>
</encoder>
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>ERROR</level>
</filter>
</appender>
<logger name="org.activiti.engine.impl.db" level="DEBUG">
<appender-ref ref="debug"/>
</logger>
<!-- Level: FATAL 0 ERROR 3 WARN 4 INFO 6 DEBUG 7 -->
<root level="INFO">
<appender-ref ref="console"/>
<appender-ref ref="debug"/>
</root>
</configuration>
YML-конфигурация
management:
endpoints:
web:
exposure:
include: '*'
enabled-by-default: true
endpoint:
health:
show-details: ALWAYS
# 日志记录
logfile:
external-file: D:/project/springcould-alibaba-example/logs/admin-order/debug.log
Журнал запросов администратора Spring Boot
На новой платформе мониторинга администратора нажмите « admin-order
Сервис» просмотреть журнал, как показано ниже.

admin-order
интерфейс доступа
@Slf4j
@RestController
public class OrderController {
@GetMapping("getOrder")
public String getOrder() {
log.info("getOrder.execute");
Date date = new Date();
// SimpleDateFormat
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String time = sdf.format(date);
log.info("getOrder.resp 记录当前时间:普通时间: {}", time);
return "admin order cliect hello";
}
}
Доступ http://127.0.0.1:8100/getOrder
Просмотр файлов журнала

Конфигурация уровня файла журнала

SpringSecurity в админке
пом-зависимости
<!-- security -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
БезопасностьSecureConfig
@Configuration(proxyBeanMethods = false)
public class SecuritySecureConfig extends WebSecurityConfigurerAdapter {
private final String adminContextPath;
public SecuritySecureConfig(AdminServerProperties adminServerProperties) {
this.adminContextPath = adminServerProperties.getContextPath();
}
@Override
protected void configure(HttpSecurity http) throws Exception {
SavedRequestAwareAuthenticationSuccessHandler successHandler = new SavedRequestAwareAuthenticationSuccessHandler();
successHandler.setTargetUrlParameter( "redirectTo" );
http.authorizeRequests()
.antMatchers( adminContextPath + "/assets/**" ).permitAll()
.antMatchers( adminContextPath + "/login" ).permitAll()
.anyRequest().authenticated()
.and()
.formLogin().loginPage( adminContextPath + "/login" ).successHandler( successHandler ).and()
.logout().logoutUrl( adminContextPath + "/logout" ).and()
.httpBasic().and()
.csrf().disable();
}
}
YML-конфигурация
spring:
security:
user:
name: "admin"
password: "admin"
Перезапустите службу admin-server

admin
Служба регистрации клиентов требует настройки username
иpassword
spring:
application:
## 注册服务名
name: admin-order
## spring boot admin
boot:
admin:
client:
api-path:
url: http://127.0.0.1:8000
instance:
prefer-ip: true # 使用ip注册进来
username: admin
password: admin
Вытягивающий клиент Nacos
Если вы не знаете, как работает Nacos в качестве регистрационного центра, вы можете проверить:
https://mp.csdn.net/mp_blog/creation/editor/121676330
пом-зависимости
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.6.RELEASE</version>
</parent>
<properties>
<java.version>1.8</java.version>
<spring.cloud.alibaba.version>2.2.5.RELEASE</spring.cloud.alibaba.version>
<spring.boot.version>2.3.6.RELEASE</spring.boot.version>
<spring.cloud.version>Hoxton.SR8</spring.cloud.version>
<admin.starter.server.version>2.3.1</admin.starter.server.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>de.codecentric</groupId>
<artifactId>spring-boot-admin-starter-server</artifactId>
<version>${admin.starter.server.version}</version>
</dependency>
<!-- security -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
<!--alibaba-nacos-discovery(阿里注册中心discovery)-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<!--Spring Cloud 相关依赖-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring.cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!--Spring Cloud Alibaba 相关依赖-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>${spring.cloud.alibaba.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
YML-конфигурация
group: ADMIN
В качестве набора служб мониторинга сервер может получать конфигурацию клиента какgroup:ADMIN
spring:
application:
## 注册服务名
name: admin-server
security:
user:
name: "admin"
password: "admin"
cloud:
nacos:
## 注册中心地址
discovery:
server-addr: 127.0.0.1:8848
group: ADMIN
Конфигурация клиента и сервера (также перерегистрируйтесь в службе Nacos)
Конфигурация почты
<!-- mail -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
</dependency>
YML-конфигурация
spring:
mail:
host: smtp.qq.com # 发件人使用的qq邮箱服务
username: 865391093@qq.com
# 授权码,不是密码,在qq邮箱设置‐账号里面有生成授权码
password: zaydkxfjbjwbbgbc
boot:
admin:
notify:
mail:
# 发件人
from: 865391093@qq.com
# 收件人,多个中间用,分隔
to: 865391093@qq.com
настройки почтового ящика qq

тест

Пользовательская конфигурация конечной точки
Индикатор
/**
* 自定义 dicator
*/
@Component
public class MyHealthIndicator implements HealthIndicator {
@Override
public Health health() {
int errorCode = check(); // perform some specific health check
if (errorCode != 0) {
return Health.down().
withDetail("msg","error service").
withDetail("code",500).
build();
}
return Health.up().build();
}
private int check() {
return 0;
}
}
Информация
/**
* 自定义 info
*/
@Component
public class AppInfo implements InfoContributor {
@Override
public void contribute(Info.Builder builder) {
builder.withDetail("version","1.0.RELEASE");
builder.withDetail("project","admin-order");
}
}
YML-конфигурация
info:
appName: admin-order
mavenAppName: '@project.artifactId@'
mavenVersion: '@project.version@'
Вид консоли АДМИНИСТРАТОРА

Метрики
Spring Boot Actuator обеспечивает управление зависимостями и автоматическую настройку для Micrometer, фасада метрик приложения, который поддерживает различные системы мониторинга, в том числе:
AppOptics
,Azure Monitor
,Netflix Atlas
,CloudWatch
,Datadog
,Dynatrace
,Elastic
,Ganglia
,Graphite
,Humio
,Influx/Telegraf
,JMX
,KairosDB
,New Relic
,Prometheus
,SignalFx
,GoogleStackdriver
,StatsD
和 Wavefront
。
-
提供一些列api供我们操作指标 -
提供了缓存、类加载器、GC、jvm内存、cpu 利用率、线程...指标 能够开箱即用 -
已经融入 springboot Actuator
JVM度量,报告利用率(JVM metrics, report utilization of):
-
各种内存和缓冲池( Various memory and buffer pools) -
与垃圾收集有关的统计数据( Statistics related to garbage collection) -
线程利用率( Threads utilization) -
加载/卸载的类数( Number of classes loaded/unloaded)
@RestController
public class HelloController {
@GetMapping("/sayHi")
public String sayHi(String productNo) throws InterruptedException {
// 线程长请求
//Thread.sleep(5000);
// 定制基于Metrics的计数器
Metrics.counter("order.counter","productNo",productNo).increment();
// 定制基于Metrics的定时器
Timer timer = Metrics.timer("order.timer");
timer.record(()->{
System.out.println("success");
});
// 定制基于Metrics的仪表 记录单个值 一般集合数量
Metrics.gauge("order.gauge",1);
// 定制基于Metrics的摘要 一般用来记录 百分比数值(缓存命中率)
DistributionSummary summary = Metrics.summary("redis.hitRate");
summary.record(1.5);
return "success";
}
}
增加定制 Metrics
Counter
Counter 是一种比较简单的Meter,它是一种单值的度量类型,或者说是一个单值计数器。
使用场景:
Counter 的作用是记录XXX的总量或者计数值,适用于一些增长类型的统计,例如下单、支付次数、Http请求总量记录等等
// 定制基于Metrics的计数器
Metrics.counter("order.counter","produntNo",produntNo).increment();
测试
127.0.0.1:8100/actuator/metrics/order.counter
{
"name": "order.counter",
"description": null,
"baseUnit": null,
"measurements": [{
"statistic": "COUNT",
"value": 3.0
}],
"availableTags": [{
"tag": "productNo",
"values": ["G122390"]
}]
}

Timer
Timer(计时器)适用于记录耗时比较短的事件的执行时间,通过时间分布展示事件的序列和发生频率。
使用场景:
根据个人经验和实践,总结如下:
-
记录指定方法的执行时间用于展示。 -
记录一些任务的执行时间,从而确定某些数据来源的速率,例如消息队列消息的消费速率等。
// 定制基于Metrics的定时器
Timer timer = Metrics.timer("xushu.timer");
timer.record(()->{
System.out.println("success");
});
Summary
Сводка (summary) в основном используется для отслеживания распределения событий, в Micrometer соответствующий класс — это DistributionSummary (сводка распределения). Как это используется и Таймер
Очень похоже, но его регистрируемое значение не зависит от единицы времени.
используемые сцены:
Исходя из личного опыта и практики, резюмирую следующее:
Измерения записанных значений, не зависящих от единиц времени, таких как значения полезной нагрузки сервера, коэффициенты попаданий в кэш и т. д.
// 定制基于Metrics的摘要 一般用来记录 百分比数值(缓存命中率)
DistributionSummary summary = Metrics.summary("redis.hitRate");
summary.record(1.5);
Оригинал cnblogs.com/keatsCoder/p/12934394.html
Последние технические горячие статьи
Рекомендовано в прошлом
3-е издание: Вопросы для интервью для крупных интернет-компаний
Читать исходный текст: 7701-страничные вопросы для интервью в высоком разрешении PDF