SpringBoot的Admin服务监控详解

 更新时间:2024年01月27日 10:23:02   作者:魅Lemon  
这篇文章主要介绍了SpringBoot的Admin服务监控详解,Spring Boot Admin(SBA)是一个开源的社区项目,用于管理和监控 Spring Boot 应用程序,需要的朋友可以参考下

一、介绍

1、SBA简介

官网参考文档

Spring Boot Admin(SBA)是一个开源的社区项目,用于管理和监控 Spring Boot 应用程序。应用程序可以通过 http 的方式,或 Spring Cloud 服务发现机制注册到 SBA 中,然后就可以实现对 Spring Boot 项目的可视化管理和查看了。

Spring Boot Admin 可以监控 Spring Boot 单机或集群项目,它提供详细的健康 (Health)信息、内存信息、JVM 系统和环境属性、垃圾回收信息、日志设置和查看、定时任务查看、Spring Boot 缓存查看和管理等功能。

2、SBA工程介绍

Spring Boot Admin分为服务端和客户端,服务端、客户端都是独立的web项目,服务端是监控程序,客户端是被监控的程序,这里需要创建两个SpringBoot工程,一个对应服务端,一个对应客户端

二、SBA服务端构建

1、SBA服务端简单构建

首先新建一个SpringBoot工程,在pom.xml中导入相关依赖

<dependency>
    <groupId>de.codecentric</groupId>
    <artifactId>spring-boot-admin-starter-server</artifactId>
    <!--2.2.0后admin的管理页面支持中文-->
    <version>2.6.6</version>
</dependency>

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

其次在配置文件设置好端口后,在启动类上添加注解@EnableAdminServer,启动项目打开浏览器访问//ip:port即可访问

2、服务端访问权限设置

2.1 Spring Security账号登录

SBA 默认是没有权限验证的,而生产环境一定要配置权限验证,我们这里通过添加 Spring Security 框架来实现权限拦截。首先引入相关依赖

<!--springboot security 安全相关-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-security</artifactId>
</dependency>

在application.properties里设置账号密码

#配置一个账号和密码
spring.security.user.name=admin
spring.security.user.password=123456

编写配置类

/**
 * Security安全配置
 */
@Configuration
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");
        successHandler.setDefaultTargetUrl(adminContextPath + "/");
        http.authorizeRequests()
                //无需登录即可访问
                .antMatchers(adminContextPath + "/assets/**").permitAll()
                .antMatchers(adminContextPath + "/login").permitAll()
                //.antMatchers(adminContextPath + "/instances/**").permitAll()
                .anyRequest().authenticated()
                .and()
                //登录和登出路径
                .formLogin().loginPage(adminContextPath + "/login").successHandler(successHandler).and()
                .logout().logoutUrl(adminContextPath + "/logout").and()
                //开启http basic支持,admin-client注册时需要使用
                .httpBasic().and()
                .csrf()
                //开启基于cookie的csrf保护
                .csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse())
                //忽略这些路径的csrf保护以便admin-client注册
                .ignoringAntMatchers(
                        adminContextPath + "/instances",
                        adminContextPath + "/actuator/**"
                );
    }
}

2.2 客户端actuator端口保护

另外客户端是要暴露actuator的web端口的,为了安全,客户端只允许服务端请求actuator的web接口,为了方便客户端区分请求来源,我们在请求头注入自定义参数

/**
 * 注入额外的请求头,方便客户端区分请求来源
 */
@Component
public class HttpHeadersProviderConfig implements HttpHeadersProvider {
    @Value("${server.port}")
    private String port;
    @Override
    public HttpHeaders getHeaders(Instance instance) {
        HttpHeaders httpHeaders = new HttpHeaders();
        //设置约定好的请求头参数
        httpHeaders.add("spring-boot-admin-service", port);
        return httpHeaders;
    }
}

3、数据监控与通知

3.1 自带邮件报警通知

首先引入邮件相关依赖

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-mail</artifactId>
</dependency>

在 SBA 的配置文件 application.properties 中添加以下收、发邮箱的配置

# 配置发送邮箱
spring.boot.admin.notify.mail.from=xxx@qq.com
# 配置接收邮箱
spring.boot.admin.notify.mail.to=xxx@qq.com
# 配置邮箱 smtp 地址(qq 发送邮箱的固定 host 是 smtp.qq.com)
spring.mail.host=smtp.qq.com
# 配置邮箱授权码(此处为授权码,而非密码,获取授权码本文下一步有说明),需要开启邮箱SMTP服务
spring.mail.password=xxxxxx
# 配置邮箱的账户名(这个是上面配置发送邮件的账户名)
spring.mail.username=xxx@qq.com

经过以上配置之后,无需添加任何代码,就可以实现项目状态改变的邮件提醒功能了。

3.2 自定义通知

自定义通知,当实例状态发生改变,及时通知(发邮件、企业微信、钉钉都可以,自己实现)

/**
 * 自定义通知
 * 继承 AbstractStatusChangeNotifier 类,实现了 doNotify 方法,
 * 当应用状态改变的时候会回调 doNotify 方法。
 */
@Component
public class CustomNotifierConfig extends AbstractStatusChangeNotifier {
    public CustomNotifierConfig(InstanceRepository repository) {
        super(repository);
    }
    @Override
    protected Mono<Void> doNotify(InstanceEvent event, Instance instance) {
        return Mono.fromRunnable(() -> {
            if (event instanceof InstanceStatusChangedEvent) {
                System.out.println("实例名称:"+instance.getRegistration().getName());
                System.out.println("实例服务地址:"+instance.getRegistration().getServiceUrl());
                String status = ((InstanceStatusChangedEvent) event).getStatusInfo().getStatus();
                switch (status) {
                    case "DOWN":
                        System.out.println("健康检查没通过!");
                        break;
                    case "OFFLINE":
                        System.out.println("服务离线!");
                        break;
                    case "UP":
                        System.out.println("服务上线!");
                        break;
                    case "UNKNOWN":
                        System.out.println("服务未知异常!");
                        break;
                    default:
                        System.out.println(status);
                        break;
                }
            }
        });
    }
}

三、SBA客户端构建

1、简单构建

新建工程,导入相关依赖

<dependency>
  <groupId>de.codecentric</groupId>
  <artifactId>spring-boot-admin-starter-client</artifactId>
  <version>2.6.6</version>
</dependency>

<!--查看状态信息的-->
<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

在application.yml中配置

spring:  
  # Spring Boot Admin 监控服务器端地址
  boot:
    admin:
      client:
        port: 9000
        url: http://localhost:${spring.boot.admin.client.port}
        # 如果设置了账号密码就需要
        username: admin
        password: 123456
# 开启监控所有项
management:
  endpoints:
    #公开所有端点web接口
    web:
      exposure:
        include: '*'
  endpoint:
    health:
      #显示db、redis、rabbti连接情况等
      show-details: always
    #启用端点,默认情况下,除shutdown以外的所有端点均已启用
    shutdown: true
    # 具体的日志路径
    logfile:
      external-file: xxx
#添加描述
info:
  describe: SpringBootAdmin,Test Client Service!
  author: shawn
  version: 1.0.0

配置完启动后就可以查看相关监控项,具体客户端的监控首页,有我们在客户端写的info信息、磁盘监控、堆、非堆内存监控、进程、线程监控、垃圾回收监控

在这里插入图片描述

2、actuator的web端口安全设置

客户端是要暴露actuator的web端口的,为了安全,客户端只允许服务端请求actuator的web接口(通过约定好的请求头来判断)

/**
 * 针对actuator接口做安全限制,只允许服务端调用
 */
@WebFilter
@ServletComponentScan
@Component
public class ActuatorFilter implements Filter {
    @Value("${spring.boot.admin.client.port}")
    private String adminServicePort;
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        HttpServletRequest request = (HttpServletRequest) servletRequest;
        //判断约定好的请求头参数
        if (request.getRequestURI().contains("/actuator") && !adminServicePort.equals(request.getHeader("spring-boot-admin-service"))){
            throw new RuntimeException("抱歉,你无权限访问,Actuator端口受保护! Sorry, you have no permission to access it,Actuator port protected!");
        }
        filterChain.doFilter(servletRequest, servletResponse);
    }
}

四、总结

SpringBoot-Admin监控Client有两种模式:

Client端引入spring-boot-admin-starter-client依赖,配置好Server的相关信息。

将所有Client端注册到服务发现(Eureka)组件中去,同时把Server端也注册,这样Server端就可以监控所有Client端了,不用对Client都添加依赖。

到此这篇关于SpringBoot的Admin服务监控详解的文章就介绍到这了,更多相关Admin服务监控内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Spring Boot构建优雅的RESTful接口过程详解

    Spring Boot构建优雅的RESTful接口过程详解

    这篇文章主要介绍了spring boot构建优雅的RESTful接口过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-08-08
  • Spring Boot Admin(监控工具)的使用

    Spring Boot Admin(监控工具)的使用

    今天我们将会讲解一个优秀的监控工具Spring Boot Admin。 它采用图形化的界面,让我们的Spring Boot管理更加简单,需要的朋友可以参考下
    2020-02-02
  • 浅谈Java中static关键字的作用

    浅谈Java中static关键字的作用

    这篇文章主要介绍了Java中static关键字的作用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-03-03
  • SpringCloud微服务踩坑记录分享

    SpringCloud微服务踩坑记录分享

    本文记录了作者在使用SpringCloud微服务时遇到的问题,首先,作者尝试修改配置文件中的service-name和instance-id,但仍然无法解决问题,后来,作者尝试更换SpringCloud版本为2.2.5,并搭配Hoxton.SR3版本,问题得以解决
    2024-11-11
  • Spring MVC Interceptor 实现性能监控的功能代码

    Spring MVC Interceptor 实现性能监控的功能代码

    本篇文章主要介绍了Spring MVC Interceptor 实现性能监控的功能代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-09-09
  • Java中实现分布式定时任务的方法

    Java中实现分布式定时任务的方法

    这篇文章主要介绍了Java中实现分布式定时任务,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-01-01
  • Java实现的微信图片处理工具类【裁剪,合并,等比例缩放等】

    Java实现的微信图片处理工具类【裁剪,合并,等比例缩放等】

    这篇文章主要介绍了Java实现的微信图片处理工具类,可实现针对图片的裁剪、合并、等比例缩放、旋转、识别等各种常见的图片处理功能,需要的朋友可以参考下
    2017-11-11
  • SpringBoot自定义启动界面的实现代码

    SpringBoot自定义启动界面的实现代码

    实现自定义启动动画是一项有趣的任务,虽然Spring Boot本身不提供内置的动画功能,但可以通过一些技巧来实现,本文主要以Demo的形式展示,再者下面的Demo都可以联合使用,需要的朋友可以参考下
    2024-07-07
  • Java的MybatisPlus详解

    Java的MybatisPlus详解

    这篇文章主要介绍了Java的MybatisPlus详解,MyBatis-Plus是一个 MyBatis的增强工具,在MyBatis的基础上只做增强不做改变,为简化开发、提高效率而生,需要的朋友可以参考下
    2023-07-07
  • java 实现局域网文件传输的实例

    java 实现局域网文件传输的实例

    这篇文章主要介绍了java 实现局域网文件传输的实例的相关资料,这里提供了实现代码可以帮助大家理解TCP及文件读写的知识,需要的朋友可以参考下
    2017-07-07

最新评论