使用 Spring Boot Admin 监控应用状态

1 Spring Boot Actuator

Spring Boot Actuator 是 Spring Boot 提供的对应用的自省和监控功能,如健康检查,审计,指标收集,HTTP 跟踪等,可以帮助开发和运维人员监控和管理 Spring Boot 应用。该模块采集应用的内部信息,并暴露给外部的模块,支持 HTTP 和 JMX,并可以与一些第三方监控系统(如 Prometheus)整合。

端点 Endpoint 是 Actuator 的核心组成部分,用来监视应用程序的各种状态。 Spring Boot Actuator 内置很多 Endpoint,总体上看分成三类:

在 pom.xml 中添加 Actuator 的 starter:


    org.springframework.boot
    spring-boot-starter-actuator

添加依赖后,启动服务,可通过如下请求查看暴露的端点:

http://localhost:9099/actuator

该请求返回:

{
    "_links": {
        "self": {
            "href": "http://localhost:9099/actuator",
            "templated": false
        },
        "health-path": {
            "href": "http://localhost:9099/actuator/health/{*path}",
            "templated": true
        },
        "health": {
            "href": "http://localhost:9099/actuator/health",
            "templated": false
        }
    }
}

从返回的结果可以看出默认只开放了 /actuator/health 端点。访问该端点 http://localhost:9099/actuator/health

{"status":"UP"}

其他未开放的端点可以独立配置开启或禁用。

在 application.yml 中添加如下配置,开放所有的端点,并显示详细的 health:

management:
  endpoints:
    web:
      exposure:
        include: '*'
  endpoint:
    health:
      show-details: always

重启服务,再次查看暴露的端点,可以看出有如下端点:

2 Spring Boot Admin

Spring Boot Actuator 提供了各种端点,Spring Boot Admin 能够将 Actuator 中的信息进行界面化的展示,并提供实时报警功能。

在微服务环境中,使用 Spring Boot Admin,通常包括服务端和客户端,服务端只运行 Spring Boot Admin Server,收集各个客户端的数据,并以可视化界面显示出来。客户端运行 Spring Boot Admin Client,或者通过服务发现与注册获取应用的信息。

这里的 demo 我就不在 Spring Boot Admin Server了,将 当前 hero-springboot-demo 既作为 server、也作为 client 使用。在后面的实战篇章中会独立 Admin Server,同时客户端也不使用 client,而是通过服务注册与发现。

在 pom.xml 中添加 Spring Boot Admin Server 的依赖:


    de.codecentric
    spring-boot-admin-starter-server
    2.7.4

    de.codecentric
    spring-boot-admin-starter-client
    2.7.4

在启动类 DemoApplication 上添加注解 @EnableAdminServer 开启 Spring Boot Admin Server。

@EnableAdminServer
@EnableAsync
@MapperScan("com.yygnb.demo.mapper")
@SpringBootApplication
public class DemoApplication {
  ...

}

在 application.yml 中添加如下配置:

spring:
  application:
    name: hero-springboot-demo
  boot:
    admin:
      client:
        url: 'http://localhost:9099/monitor'
      context-path: '/monitor'

重启服务,在浏览器中访问 Spring Boot Admin Server:

http://localhost:9099/monitor

可以看到当前应用的作为客户端注册到 Admin Server 上:

再次强调,上述操作仅仅针对demo学习,非真实的企业级开发!

3 自定义告警

当应用状态异常时,Spring Boot Admin 会自动实时告警,而告警的方式可以由我们自定义。这里模拟日志的方式。

在 config 包下创建类 DemoNotifier,该类继承自 AbstractEventNotifier

@Slf4j
@Component
public class DemoNotifier extends AbstractEventNotifier {

    protected DemoNotifier(InstanceRepository repository) {
        super(repository);
    }

    @Override
    protected Mono doNotify(InstanceEvent event, Instance instance) {
        return Mono.fromRunnable(() -> log.error("Instance info: {}, {}, {}",
                instance.getRegistration().getName(), event.getInstance(),
                event.getType()));
    }
}

此时,注册到这个Admin Server的其他客户端启动、停止等,当前应用都会监听到事件,输出日志。实战中可以在这里面发送邮件、消息等。

4 登录访问

上面配置的 Admin Server 无需登录就可以访问,在真实开发中需要登录后才能访问。admin server 也提供了登录页面。

在 pom.xml 添加 Spring Security 的依赖:


    org.springframework.boot
    spring-boot-starter-security

在 application.yml 中配置登录的用户名和密码:

spring:
  application:
    name: hero-springboot-demo
  boot:
    admin:
      client:
        url: 'http://localhost:9099/monitor'
      context-path: '/monitor'
  security:
    user:
      name: admin
      password: 111111

上面的配置在之前的基础上增加了: spring.security.user 的配置。

在 config 包下添加 Spring Security 的配置类 SecurityConfig

@Configuration
public class SecurityConfig {

    private final String adminContextPath;

    public SecurityConfig(AdminServerProperties adminServerProperties) {
        this.adminContextPath = adminServerProperties.getContextPath();
    }

    @Bean
    public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
        SavedRequestAwareAuthenticationSuccessHandler successHandler =
                new SavedRequestAwareAuthenticationSuccessHandler();
        successHandler.setTargetUrlParameter("redirectTo");
        successHandler.setDefaultTargetUrl(adminContextPath + "/");
        return http.authorizeHttpRequests(auth -> auth.antMatchers(
                                        adminContextPath + "/assets/**",
                                        adminContextPath + "/login",
                                        adminContextPath + "/instances",
                                        adminContextPath + "/actuator/**"
                                ).permitAll()
                                .antMatchers(adminContextPath + "/**").authenticated()
                                .anyRequest().permitAll()
                ).formLogin(form -> form.loginPage(adminContextPath + "/login")
                        .successHandler(successHandler)
                ).logout(logout -> logout.logoutUrl(adminContextPath + "/logout"))
                .csrf(AbstractHttpConfigurer::disable)
                .build();
    }
}

上面配置文件中的 adminContextPath 就是前面配置的 spring.boot.admin.context-path,即 /monitor

上面配置包括几个部分:

重启服务,访问之前开发的 computer 等接口,可以正常访问;如果访问 /monitor 等路径,就会跳转 Spring Boot Admin 提供的登录页:

使用配置的用户名密码(admin/111111)登录,登录成功后进入 Admin Server 页面。

感谢你阅读本文,如果本文给了你一点点帮助或者启发,还请三连支持一下,点赞、关注、收藏,作者会持续与大家分享更多干货

Original: https://www.cnblogs.com/youyacoder/p/16672921.html
Author: 程序员优雅哥(/同)
Title: 使用 Spring Boot Admin 监控应用状态

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/622487/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • java学习摘抄笔记mybaits2

    mybatis 第二天 高级映射 查询缓存 和 spring 整合 课程复习: mybatis 是什么? mybatis 是一人持久层框架,mybatis 是一个不完全的ORM 框…

    Java 2023年5月29日
    061
  • 动态规划算法(DP,Dynamic Programming)

    动态规划算法(DP,Dynamic Programming) 文章目录 动态规划算法(DP,Dynamic Programming) 前言 一、递归到DP的一般转化方法 二、DP解…

    Java 2023年6月5日
    088
  • 新的开始

    新的开始 很久之前就动过写博客的想法,因为我个人认为每天写博客是一个很好的习惯,写博客的过程就是把你今天所学到的知识进行系统性的总结,不仅可以加强你今天所学的知识的印象,后面复习的…

    Java 2023年6月15日
    083
  • 微服务保护

    1.初识Sentinel 1.1.雪崩问题及解决方案 1.1.1.雪崩问题 依赖服务I的业务请求被阻塞,用户不会得到响应,则tomcat的这个线程不会释放,于是越来越多的用户请求到…

    Java 2023年6月9日
    085
  • java中远程调用第三方接口

    一、概述 在实际开发过程中,我们经常需要调用对方提供的接口或测试自己写的接口是否合适。很多项目都会封装规定好本身项目的接口规范,所以大多数需要去调用对方提供的接口或第三方接口(短信…

    Java 2023年5月29日
    088
  • LiteFlow 2.6.4版本发行注记,里程碑版本!

    一 这个版本做的很折腾。期间几个issue推翻重做了好几次。 但我最终还是带来了LiteFlow 2.6.4这个重要版本。 虽然版本是小版本号升级,但是带来的更新可一点也不少。并完…

    Java 2023年6月8日
    082
  • Java课程课堂作业代码

    本文章只是单纯记录课堂老师布置的课堂作业代码,题目都比较简单,所以没有写解题思路,相信大家都能理解,当然其中有的解法和代码不是最优的,当时只是为了完成题目,后来也懒得改了,如果有不…

    Java 2023年6月5日
    0203
  • Linux机器自建账号并赋予sudo权限,同时修改远程端口

    默认使用root账号来操作Linux有一定风险,因此需要自建账号并赋予sudo权限,方便使用 登录为root用户后,创建账号 adduser <username>&lt…

    Java 2023年6月14日
    097
  • springmvc静态资源配置

    <servlet> <servlet-name>dispatcher</servlet-name> <servlet-class>o…

    Java 2023年6月9日
    095
  • 1. Two Sum——LeetCode

    Given an array of integers, return indices of the two numbers such that they add up to a s…

    Java 2023年6月15日
    067
  • 我把自己的java库发布到了maven中央仓库,从此可以像Jackson、Spring的jar一样使用它了

    欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java、Docker、Kuberne…

    Java 2023年6月8日
    075
  • 线程不安全

    众所周知,多线程访问同一公共资源会带来线程的不安全,本文探讨一下这个问题的若干细节。 关于线程安全的基本问题 有关线程安全常涉及两个概念: 竞态条件:当两个线程竞争同一资源时,如果…

    Java 2023年5月30日
    071
  • Java字节码含义

    Java字节码 操作数栈 在解释执行过程中,每当为Java方法分配栈桢时,Java虚拟机往往需要开辟一块额外的空间作为操作数栈,来存放计算的操作数以及返回结果。具体来说, JVM执…

    Java 2023年5月29日
    053
  • 基础知识,不是很了解的

    Java中方法参数传递方式是按值传递。对于基本类型(int a, long b),参数传递时传递的是值,例如int a = 5,传递的就是5。如果是引用类型,传递是指向具体对象内存…

    Java 2023年6月14日
    081
  • MarkDown语法学习

    用 “#” + ” ” 即可创建标题。一个 “#” + ” ” 就是一级标题,两个 …

    Java 2023年6月5日
    0113
  • 教你win7系统手动导入注册表获取管理员权限

    想必大家都遇到过win7系统手动导入注册表获取管理员权限的问题吧,大多数朋友还不知道怎么处理固然处理起来也不难,然而还是有一些小伙伴不明白win7系统手动导入注册表获取管理员权限应…

    Java 2023年5月30日
    095
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球