实战:使用Spring Boot Admin实现运维监控平台

我们知道,使用Actuator可以收集应用系统的健康状态、内存、线程、堆栈、配置等信息,比较全面地监控了Spring Boot应用的整个生命周期。但是还有一个问题:如何呈现这些采集到的应用监控数据、性能数据呢?在这样的背景下,就诞生了另一个开源软件Spring Boot Admin。下面就来介绍什么是Spring Boot Admin以及如何使用Spring Boot Admin搭建完整的运维监控平台。

一、什么是Spring Boot Admin

Spring Boot Admin是一个管理和监控Spring Boot应用程序的开源项目,在对单一应用服务监控的同时也提供了集群监控方案,支持通过eureka、consul、zookeeper等注册中心的方式实现多服务监控与管理。Spring Boot Admin UI部分使用Vue JS将数据展示在前端。

Spring Boot Admin分为服务端(spring-boot-admin-server)和客户端(spring-boot-admin-client)两个组件:

  • spring-boot-admin-server通过采集actuator端点数据显示在spring-boot-admin-ui上,已知的端点几乎都有进行采集。
  • spring-boot-admin-client是对Actuator的封装,提供应用系统的性能监控数据。此外,还可以通过spring-boot-admin动态切换日志级别、导出日志、导出heapdump、监控各项性能指标等。

Spring Boot Admin服务器端负责收集各个客户的数据。各台客户端配置服务器地址,启动后注册到服务器。服务器不停地请求客户端的信息(通过Actuator接口)。具体架构如下图所示。

实战:使用Spring Boot Admin实现运维监控平台

上图为Spring Boot Admin的整体架构,在每个Spring Boot应用程序上增加Spring Boot Admin Client组件。这样每个Spring Boot应用即Admin客户端,Admin服务端通过请求Admin客户端的接口收集所有的Spring Boot应用信息并进行数据呈现,从而实现Spring Boot应用监控。


二、使用Spring Boot Admin搭建运维监控平台

下面就通过示例,演示如何使用Spring Boot Admin 搭建运维监控平台。

1、创建服务器端

Spring Boot Admin服务器端主要负责收集各个客户的数据。建立一个Spring Boot Admin服务器端只需要简单的两步。下面通过示例演示创建Spring Boot Admin服务器端的过程。

1. 配置依赖

创建新的Spring Boot项目,在新建的项目中添加Spring Boot Admin服务器端的依赖JAR包:spring-boot-admin-starter-server。

<dependency>
   <groupId>de.codecentric</groupId>
   <artifactId>spring-boot-admin-starter-server</artifactId>
   <version>2.1.3</version>
</dependency>
<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-web</artifactId>
</dependency>

添加spring-boot-starter-web是为了让应用处于启动状态。


2. 配置启动端口

修改系统配置文件application.properties,配置服务端的启动端口为8000:

server.port=8000


3. 启用Admin服务器

使用@EnableAdminServer注解启动Admin服务器,示例代码如下:

@SpringBootApplication
// 启用Admin服务器
@EnableAdminServer
public class AdminServerApplication {
    public static void main(String[] args) {
       SpringApplication.run(AdminServerApplication.class, args);
    }
}


4. 运行测试

完成以上3步之后,启动服务器端,在浏览器中访问http://localhost:8000,可以看到如下所示的界面。

实战:使用Spring Boot Admin实现运维监控平台


从Admin服务端的启动界面可以看到,Applications页面会展示应用数量、实例数量和状态3个信息。这里由于没有启动客户端,因此显示出“No applications registered.”的信息。


2、创建客户端

接下来我们创建一个客户端并注册到服务器端。

1. 配置依赖

创建新的Spring Boot项目,在新建的项目中添加Spring Boot Admin客户端的依赖JAR包:spring-boot-admin-starter-server。

<dependency>
    <groupId>de.codecentric</groupId>
    <artifactId>spring-boot-admin-starter-client</artifactId>
    <version>2.1.0</version>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

spring-boot-admin-starter-client会自动添加Actuator相关依赖,所以这里不需要重复添加Actuator的相关依赖。


2. 配置客户端

修改application.properties配置文件,增加如下配置:

server.port=8001
spring.application.name=Admin Client
spring.boot.admin.client.url=http://localhost:8000
management.endpoints.web.exposure.include=*

相关配置说明如下:

  • server.port:当前应用设置端口为8001。
  • spring.application.name:设置Application名称,其默认名称都是spring-boot-application。
  • spring.boot.admin.client.url:配置Admin服务器的地址。
  • management.endpoints.web.exposure.include=*:打开客户端Actuator的监控。


3. 运行验证

配置完成后启动客户端,客户端会自动注册到Admin服务器,Admin服务器检查到客户端的变化并展示其应用信息。重新刷新地址http://localhost:8000后,可以看到如图15-7所示的页面。

实战:使用Spring Boot Admin实现运维监控平台

客户端启动之后,Admin服务器界面的Application数量会增加。单击Application下的数值可以查看完整的应用信息。页面会展示被监控的应用列表,单击应用名称会进入此应用的详细监控信息页面。

实战:使用Spring Boot Admin实现运维监控平台


这个页面会实时显示应用的运行监控信息,包括之前介绍的Actuator所有的端点数据信息。

Spring Boot Admin以图形化的形式展示了应用的各项信息,这些信息大多来自于Spring Boot Actuator提供的接口。利用图形化的形式很容易看到应用的各项参数变化,甚至有些页面还可以进行一些配置操作,比如改变打印日志的级别等。


三、告警提醒功能

虽然Spring Boot Admin提供了强大的监控功能,但它不能存储历史数据,我们不可能一直盯着系统,为此,Spring Boot Admin提供了强大的提醒功能,能够在发生服务状态变更的时候发出告警。支持的Email等提醒功能,同时也支持自定义告警提醒。

下面就来介绍Spring Boot Admin的告警提醒功能。

​​​​​​​​​1、邮件提醒

设置Spring Boot Admin的邮件提醒,需要用到Spring Boot的邮件组件:spring-boot-starter-mail。这里只展示邮件提醒功能的使用。

  1. 配置依赖

修改前面的服务器端,在pom.xml 文件中,增加邮件组件,示例代码如下:

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-mail</artifactId>
        </dependency>
  1. 修改系统配置

修改application.properties 系统配置文件,增加邮件发送配置,和告警通知配置,示例代码如下:

# 邮件服务配置
spring.mail.host=smtp.163.com
spring.mail.username=18618243664@163.com
spring.mail.password=#邮箱授权码 
spring.mail.properties.mail.smtp.auth=true
spring.mail.properties.mail.smtp.ssl.enable=true

#告警接收
spring.boot.admin.notify.mail.enabled=true
spring.boot.admin.notify.mail.to=417114764@qq.com
spring.boot.admin.notify.mail.from=18618243664@163.com

上面,我们配置了Spring Boot 发送邮件的相关配置,这个是通用的。然后配置了告警消息的接收地址。


  1. 验证测试

我们再次启动服务端和客户端,然后停止客户端,模拟应用宕机的情况。这样Spring Boot Admin 就会发送告警邮件提醒。

实战:使用Spring Boot Admin实现运维监控平台

2、自定义告警提醒

除了邮件提醒之外,通常我们还需要其他的提醒方式,比如:短信,日志等。我们可以​通过自定义的方式实现自定义的消息告警方式。

Spring Boot Admin 实现自定义告警提醒也非常简单,只要实现Notifier接口即可。具体实现方式:继承AbstractEventNotifier 或AbstractStatusChangeNotifier这两个类。然后重写doNotify中实现具体的业务逻辑。

下面通过示例演示自定义告警提醒功能:

首先,创建AppStatusNotifier类,实现告警提醒功能,示例代码如下:

**
 * 自定义的事件通知者
 * @author weiz
 *
 */
@Service
public class AppStatusNotifier extends AbstractEventNotifier {
    private static final Logger LOGGER = LoggerFactory.getLogger(LoggingNotifier.class);

    public AppStatusNotifier(InstanceRepository repository) {
        super(repository);
    }

    @Override
    protected Mono<Void> doNotify(InstanceEvent event, Instance instance) {
        return Mono.fromRunnable(() -> {
            if (event instanceof InstanceStatusChangedEvent) {
                LOGGER.info("Instance {} ({}) is {}", instance.getRegistration().getName(), event.getInstance(),
                        ((InstanceStatusChangedEvent) event).getStatusInfo().getStatus());
            }
            else {
                LOGGER.info("Instance {} ({}) {}", instance.getRegistration().getName(), event.getInstance(),
                        event.getType());
            }
        });
    }
}

然后,再次运行服务端和客户端。启动成功之后,再关掉客户端,模拟应用宕机的情况。

实战:使用Spring Boot Admin实现运维监控平台

我们看到服务端后台日志显示,服务端已经收到了客户端状态改变的告警消息。客户端状态已经变为OFFLINE。


最后

以上,就将Spring Boot Admin搭建运维监控平台介绍完毕

上一篇:一起学Golang系列(四)学习Go语言语法,这篇文章就够了!


下一篇:极简教程 | 使用Actuator 实现Spring Boot 应用监控