本站消息

站长简介/公众号

  出租广告位,需要合作请联系站长


+关注
已关注

分类  

暂无分类

标签  

暂无标签

日期归档  

2024-11(1)

Spring Boot Admin 介绍及使用

发布于2022-05-31 02:54     阅读(1603)     评论(0)     点赞(19)     收藏(2)


概述

Spring Boot 有一个非常好用的监控和管理的源软件,这个软件就是 Spring Boot Admin。该软件能够将 Actuator 中的信息进行界面化的展示,也可以监控所有 Spring Boot 应用的健康状况,提供实时警报功能。

主要的功能点有:

  • 显示应用程序的监控状态
  • 应用程序上下线监控
  • 查看 JVM,线程信息
  • 可视化的查看日志以及下载日志文件
  • 动态切换日志级别
  • Http 请求信息跟踪
  • 其他功能点……

 可点击 https://github.com/codecentric/spring-boot-admin 更多了解 Spring-boot-admin。

搭建服务流程说明

  • admin-server  admin 监控服务
  • admin-order amdin 客户端服务

创建Spring Boot Admin项目

版本说明:版本建议: 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 的依赖,具体代码如下所示

pom 依赖

  1. <parent>
  2. <groupId>org.springframework.boot</groupId>
  3. <artifactId>spring-boot-starter-parent</artifactId>
  4. <version>2.3.6.RELEASE</version>
  5. </parent>
  6. <properties>
  7. <java.version>1.8</java.version>
  8. <spring.cloud.alibaba.version>2.2.5.RELEASE</spring.cloud.alibaba.version>
  9. <spring.boot.version>2.3.6.RELEASE</spring.boot.version>
  10. <spring.cloud.version>Hoxton.SR8</spring.cloud.version>
  11. <admin.starter.server.version>2.3.1</admin.starter.server.version>
  12. </properties>
  13. <dependency>
  14. <groupId>org.springframework.boot</groupId>
  15. <artifactId>spring-boot-starter-web</artifactId>
  16. </dependency>
  17. <dependency>
  18. <groupId>de.codecentric</groupId>
  19. <artifactId>spring-boot-admin-starter-server</artifactId>
  20. <version>${admin.starter.server.version}</version>
  21. </dependency>

启动类

添加 @EnableAdminServer

  1. @EnableAdminServer
  2. @SpringBootApplication
  3. public class AdminServerApplication {
  4. public static void main(String[] args) {
  5. SpringApplication.run(AdminServerApplication.class,args);
  6. }
  7. }

yml 配置

在属性文件中增加端口配置信息:

  1. server:
  2. port: 8000
  3. spring:
  4. application:
  5. ## 注册服务名
  6. name: admin-order
  7. management:
  8. endpoint:
  9. health:
  10. show-details: always

启动程序,访问 Web 地址 http://127.0.0.1:8000/ 就可以看到主页面了,这个时候是没有数据的,如图 1 所示


客户端服务

流程

创建 amdin-order 服务,将服务注册到 admin-server 中

pom 依赖

  1. <parent>
  2. <groupId>org.springframework.boot</groupId>
  3. <artifactId>spring-boot-starter-parent</artifactId>
  4. <version>2.3.6.RELEASE</version>
  5. </parent>
  6. <properties>
  7. <java.version>1.8</java.version>
  8. <spring.cloud.alibaba.version>2.2.5.RELEASE</spring.cloud.alibaba.version>
  9. <spring.boot.version>2.3.6.RELEASE</spring.boot.version>
  10. <spring.cloud.version>Hoxton.SR8</spring.cloud.version>
  11. <spring.boot.admin.client.version>2.3.1</spring.boot.admin.client.version>
  12. </properties>
  13. <dependencies>
  14. <dependency>
  15. <groupId>org.springframework.boot</groupId>
  16. <artifactId>spring-boot-starter-web</artifactId>
  17. </dependency>
  18. <dependency>
  19. <groupId>org.springframework.boot</groupId>
  20. <artifactId>spring-boot-starter-actuator</artifactId>
  21. </dependency>
  22. <dependency>
  23. <groupId>org.projectlombok</groupId>
  24. <artifactId>lombok</artifactId>
  25. <version>1.16.14</version>
  26. <scope>provided</scope>
  27. </dependency>
  28. <dependency>
  29. <groupId>de.codecentric</groupId>
  30. <artifactId>spring-boot-admin-starter-client</artifactId>
  31. <version>${spring.boot.admin.client.version}</version>
  32. </dependency>
  33. </dependencies>

yml 配置

  1. spring:
  2. application:
  3. ## 注册服务名
  4. name: admin-order
  5. ## spring boot admin
  6. boot:
  7. admin:
  8. client:
  9. api-path:
  10. url: http://127.0.0.1:8000
  11. instance:
  12. prefer-ip: true # 使用ip注册进来
  13. server:
  14. port: 8100
  15. #  endpoints config
  16. management:
  17. endpoint:
  18. health:
  19. show-details: always
  20. endpoints:
  21. enabled-by-default: true
  22. web:
  23. base-path: /actuator
  24. exposure:
  25. include: '*'

启动 admin-order 服务

  1. @SpringBootApplication
  2. public class AdminOrderApp {
  3. public static void main(String[] args) {
  4. SpringApplication.run(AdminOrderApp.class,args);
  5. }
  6. }

从新刷新 admin 平台,admin-order 服务就可以监控

  • 绿色:健康
  • 灰色:连接客户端健康信息超时(超过10s)
  • 红色:就能看到具体异常信息 

Spring Boot Admin 监控平台

Insighs 信息

自定义的 Info 信息、健康状态、元数据,如图

Endpoint 端点接口信息

JVM 信息

Admin 中查看各个服务的日志 

客户端需要把日志同步ADMI服务中,通过JMX,客户端配置如下

添加 logback-spring.xml 配置

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!--
  3. 小技巧: 在根pom里面设置统一存放路径,统一管理方便维护
  4. <properties>
  5. <log-path>/Users/lengleng</log-path>
  6. </properties>
  7. 1. 其他模块加日志输出,直接copy本文件放在resources 目录即可
  8. 2. 注意修改 <property name="${log-path}/log.path" value=""/> 的value模块
  9. -->
  10. <configuration debug="false" scan="false">
  11. <property name="log.path" value="logs/admin-order"/>
  12. <!-- 彩色日志格式 -->
  13. <property name="CONSOLE_LOG_PATTERN"
  14. 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}}"/>
  15. <!-- 彩色日志依赖的渲染类 -->
  16. <conversionRule conversionWord="clr" converterClass="org.springframework.boot.logging.logback.ColorConverter"/>
  17. <conversionRule conversionWord="wex"
  18. converterClass="org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter"/>
  19. <conversionRule conversionWord="wEx"
  20. converterClass="org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter"/>
  21. <!-- Console log output -->
  22. <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
  23. <encoder>
  24. <pattern>${CONSOLE_LOG_PATTERN}</pattern>
  25. </encoder>
  26. </appender>
  27. <!-- Log file debug output -->
  28. <appender name="debug" class="ch.qos.logback.core.rolling.RollingFileAppender">
  29. <file>${log.path}/debug.log</file>
  30. <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
  31. <fileNamePattern>${log.path}/%d{yyyy-MM, aux}/debug.%d{yyyy-MM-dd}.%i.log.gz</fileNamePattern>
  32. <maxFileSize>50MB</maxFileSize>
  33. <maxHistory>30</maxHistory>
  34. </rollingPolicy>
  35. <encoder>
  36. <pattern>%date [%thread] %-5level [%logger{50}] %file:%line - %msg%n</pattern>
  37. </encoder>
  38. </appender>
  39. <!-- Log file error output -->
  40. <appender name="error" class="ch.qos.logback.core.rolling.RollingFileAppender">
  41. <file>${log.path}/error.log</file>
  42. <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
  43. <fileNamePattern>${log.path}/%d{yyyy-MM}/error.%d{yyyy-MM-dd}.%i.log.gz</fileNamePattern>
  44. <maxFileSize>50MB</maxFileSize>
  45. <maxHistory>30</maxHistory>
  46. </rollingPolicy>
  47. <encoder>
  48. <pattern>%date [%thread] %-5level [%logger{50}] %file:%line - %msg%n</pattern>
  49. </encoder>
  50. <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
  51. <level>ERROR</level>
  52. </filter>
  53. </appender>
  54. <logger name="org.activiti.engine.impl.db" level="DEBUG">
  55. <appender-ref ref="debug"/>
  56. </logger>
  57. <!-- Level: FATAL 0 ERROR 3 WARN 4 INFO 6 DEBUG 7 -->
  58. <root level="INFO">
  59. <appender-ref ref="console"/>
  60. <appender-ref ref="debug"/>
  61. </root>
  62. </configuration>

yml 配置

  1. management:
  2. endpoints:
  3. web:
  4. exposure:
  5. include: '*'
  6. enabled-by-default: true
  7. endpoint:
  8. health:
  9. show-details: ALWAYS
  10. # 日志记录
  11. logfile:
  12. external-file: D:/project/springcould-alibaba-example/logs/admin-order/debug.log

Spring Boot Admin 查询日志

从新打 Admin 监控平台,点击 admin-order 服务查看日志,如下

访问 admin-order 接口

  1. @Slf4j
  2. @RestController
  3. public class OrderController {
  4. @GetMapping("getOrder")
  5. public String getOrder() {
  6. log.info("getOrder.execute");
  7. Date date = new Date();
  8. // SimpleDateFormat
  9. SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  10. String time = sdf.format(date);
  11. log.info("getOrder.resp 记录当前时间:普通时间: {}", time);
  12. return "admin order cliect hello";
  13. }
  14. }

访问 http://127.0.0.1:8100/getOrder 查看日志文件

 日志文件等级配置

Admin 中 SpringSecurity

pom 依赖

  1. <!-- security -->
  2. <dependency>
  3. <groupId>org.springframework.boot</groupId>
  4. <artifactId>spring-boot-starter-security</artifactId>
  5. </dependency>

 SecuritySecureConfig

  1. @Configuration(proxyBeanMethods = false)
  2. public class SecuritySecureConfig extends WebSecurityConfigurerAdapter {
  3. private final String adminContextPath;
  4. public SecuritySecureConfig(AdminServerProperties adminServerProperties) {
  5. this.adminContextPath = adminServerProperties.getContextPath();
  6. }
  7. @Override
  8. protected void configure(HttpSecurity http) throws Exception {
  9. SavedRequestAwareAuthenticationSuccessHandler successHandler = new SavedRequestAwareAuthenticationSuccessHandler();
  10. successHandler.setTargetUrlParameter( "redirectTo" );
  11. http.authorizeRequests()
  12. .antMatchers( adminContextPath + "/assets/**" ).permitAll()
  13. .antMatchers( adminContextPath + "/login" ).permitAll()
  14. .anyRequest().authenticated()
  15. .and()
  16. .formLogin().loginPage( adminContextPath + "/login" ).successHandler( successHandler ).and()
  17. .logout().logoutUrl( adminContextPath + "/logout" ).and()
  18. .httpBasic().and()
  19. .csrf().disable();
  20. }
  21. }

yml 配置

  1. spring:
  2. security:
  3. user:
  4. name: "admin"
  5. password: "admin"

从新启动 admin-server 服务

客户端注册 admin 服务需要配置 username 和 password 

  1. spring:
  2. application:
  3. ## 注册服务名
  4. name: admin-order
  5. ## spring boot admin
  6. boot:
  7. admin:
  8. client:
  9. api-path:
  10. url: http://127.0.0.1:8000
  11. instance:
  12. prefer-ip: true # 使用ip注册进来
  13. username: admin
  14. password: admin

Nacos 拉取客户端

不懂 Nacos 怎样作为注册中心,可以查看  Spring Cloud Alibaba 微服务组件 Nacos 注册中心(三)

pom 依赖

  1. <parent>
  2. <groupId>org.springframework.boot</groupId>
  3. <artifactId>spring-boot-starter-parent</artifactId>
  4. <version>2.3.6.RELEASE</version>
  5. </parent>
  6. <properties>
  7. <java.version>1.8</java.version>
  8. <spring.cloud.alibaba.version>2.2.5.RELEASE</spring.cloud.alibaba.version>
  9. <spring.boot.version>2.3.6.RELEASE</spring.boot.version>
  10. <spring.cloud.version>Hoxton.SR8</spring.cloud.version>
  11. <admin.starter.server.version>2.3.1</admin.starter.server.version>
  12. </properties>
  13. <dependencies>
  14. <dependency>
  15. <groupId>org.springframework.boot</groupId>
  16. <artifactId>spring-boot-starter-web</artifactId>
  17. </dependency>
  18. <dependency>
  19. <groupId>de.codecentric</groupId>
  20. <artifactId>spring-boot-admin-starter-server</artifactId>
  21. <version>${admin.starter.server.version}</version>
  22. </dependency>
  23. <!-- security -->
  24. <dependency>
  25. <groupId>org.springframework.boot</groupId>
  26. <artifactId>spring-boot-starter-security</artifactId>
  27. </dependency>
  28. <!--alibaba-nacos-discovery(阿里注册中心discovery)-->
  29. <dependency>
  30. <groupId>com.alibaba.cloud</groupId>
  31. <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
  32. </dependency>
  33. </dependencies>
  34. <dependencyManagement>
  35. <dependencies>
  36. <!--Spring Cloud 相关依赖-->
  37. <dependency>
  38. <groupId>org.springframework.cloud</groupId>
  39. <artifactId>spring-cloud-dependencies</artifactId>
  40. <version>${spring.cloud.version}</version>
  41. <type>pom</type>
  42. <scope>import</scope>
  43. </dependency>
  44. <!--Spring Cloud Alibaba 相关依赖-->
  45. <dependency>
  46. <groupId>com.alibaba.cloud</groupId>
  47. <artifactId>spring-cloud-alibaba-dependencies</artifactId>
  48. <version>${spring.cloud.alibaba.version}</version>
  49. <type>pom</type>
  50. <scope>import</scope>
  51. </dependency>
  52. </dependencies>
  53. </dependencyManagement>

yml 配置

group: ADMIN 作为一组监控服务,服务端可以拉取客户端配置为 group:ADMIN

  1. spring:
  2. application:
  3. ## 注册服务名
  4. name: admin-server
  5. security:
  6. user:
  7. name: "admin"
  8. password: "admin"
  9. cloud:
  10. nacos:
  11. ## 注册中心地址
  12. discovery:
  13. server-addr: 127.0.0.1:8848
  14. group: ADMIN

客户端同服务端配置 (也要从新注册到 Nacos 服务)

邮件配置

  1. <!-- mail -->
  2. <dependency>
  3. <groupId>org.springframework.boot</groupId>
  4. <artifactId>spring-boot-starter-mail</artifactId>
  5. </dependency>

 yml 配置

  1. spring:
  2. mail:
  3. host: smtp.qq.com # 发件人使用的qq邮箱服务
  4. username: 865391093@qq.com
  5. # 授权码,不是密码,在qq邮箱设置‐账号里面有生成授权码
  6. password: zaydkxfjbjwbbgbc
  7. boot:
  8. admin:
  9. notify:
  10. mail:
  11. # 发件人
  12. from: 865391093@qq.com
  13. # 收件人,多个中间用,分隔
  14. to: 865391093@qq.com

qq 邮箱设置

 测试

自定义端点配置

Indicator

  1. /**
  2. * 自定义 dicator
  3. * @date: 2021/12/15 17:31
  4. */
  5. @Component
  6. public class MyHealthIndicator implements HealthIndicator {
  7. @Override
  8. public Health health() {
  9. int errorCode = check(); // perform some specific health check
  10. if (errorCode != 0) {
  11. return Health.down().
  12. withDetail("msg","error service").
  13. withDetail("code",500).
  14. build();
  15. }
  16. return Health.up().build();
  17. }
  18. private int check() {
  19. return 0;
  20. }
  21. }

info

  1. /**
  2. * 自定义 info
  3. * @date: 2021/12/16 18:53
  4. */
  5. @Component
  6. public class AppInfo implements InfoContributor {
  7. @Override
  8. public void contribute(Info.Builder builder) {
  9. builder.withDetail("version","1.0.RELEASE");
  10. builder.withDetail("project","admin-order");
  11. }
  12. }

 yml 配置

  1. info:
  2. appName: admin-order
  3. mavenAppName: '@project.artifactId@'
  4. mavenVersion: '@project.version@'

ADMIN 控制台查看

Metrics

Spring Boot Actuator 为 Micrometer 提供了依赖管理和自动配置功能,Micrometer 是一个应用指标 facade(面门),支持多种监控系统,包括:

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)
  1. @RestController
  2. public class HelloController {
  3. @GetMapping("/sayHi")
  4. public String sayHi(String productNo) throws InterruptedException {
  5. // 线程长请求
  6. //Thread.sleep(5000);
  7. // 定制基于Metrics的计数器
  8. Metrics.counter("order.counter","productNo",productNo).increment();
  9. // 定制基于Metrics的定时器
  10. Timer timer = Metrics.timer("order.timer");
  11. timer.record(()->{
  12. System.out.println("success");
  13. });
  14. // 定制基于Metrics的仪表 记录单个值 一般集合数量
  15. Metrics.gauge("order.gauge",1);
  16. // 定制基于Metrics的摘要 一般用来记录 百分比数值(缓存命中率)
  17. DistributionSummary summary = Metrics.summary("redis.hitRate");
  18. summary.record(1.5);
  19. return "success";
  20. }
  21. }

增加定制 Metrics

  • Counter

Counter 是一种比较简单的Meter,它是一种单值的度量类型,或者说是一个单值计数器。
使用场景:
Counter 的作用是记录XXX的总量或者计数值,适用于一些增长类型的统计,例如下单、支付次数、Http请求总量记录等等

  1. // 定制基于Metrics的计数器
  2. 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(计时器)适用于记录耗时比较短的事件的执行时间,通过时间分布展示事件的序列和发生频率。
使用场景:
根据个人经验和实践,总结如下:

  • 记录指定方法的执行时间用于展示。
  • 记录一些任务的执行时间,从而确定某些数据来源的速率,例如消息队列消息的消费速率等。
  1. // 定制基于Metrics的定时器
  2. Timer timer = Metrics.timer("xushu.timer");
  3. timer.record(()->{
  4. System.out.println("success");
  5. });
  • Summary

Summary(摘要)主要用于跟踪事件的分布,在Micrometer中,对应的类是DistributionSummary(分发摘要)。它的使用方式和Timer
十分相似,但是它的记录值并不依赖于时间单位。
使用场景:
根据个人经验和实践,总结如下:

  1. 不依赖于时间单位的记录值的测量,例如服务器有效负载值,缓存的命中率等。
  1. // 定制基于Metrics的摘要 一般用来记录 百分比数值(缓存命中率)
  2. DistributionSummary summary = Metrics.summary("redis.hitRate");
  3. summary.record(1.5);



所属网站分类: 技术文章 > 博客

作者:黑暗之神

链接:http://www.javaheidong.com/blog/article/443795/f302aa072dad18aa42f4/

来源:java黑洞网

任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任

19 0
收藏该文
已收藏

评论内容:(最多支持255个字符)