8.1 使用actuator监控
8.1.1 actuator是什么
在Spring Boot的众多Starter POMs中有一个特殊的模块,不同于其他模块大多用于开发业务功能或连接一些其他外部资源,完全是一个用于暴露自身信息的模块,主要用于监控与管理,它就是spring-boot-starter-actuator。
spring-boot-starter-actuator模块的实现对于实施微服务的中小团队来说,可以有效地减少监控系统在采集应用指标时的开发量。当然,它并不是万能的,有时我们需要对其做一些简单的扩展来帮助我们实现自身系统个性化的监控需求。下面将详细介绍关于spring-boot-starter-actuator模块的内容,包括它原生提供的端点以及一些常用的扩展和配置方式。
8.1.2 如何使用actuator
(1)首先在pom.xml加入spring-boot-starter-actuator依赖即可。这里为了方便观察,也加入了spring-boot-starter-web依赖,如代码清单8-1所示。
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.dalaoyang</groupId>
<artifactId>springboot_actuator</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>springboot_actuator</name>
<description>springboot整合actuator</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.9.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
(2)其次。其余没有任何修改,没有新建任何类,在配置文件中加入了几条属性,配置文件如下:
##端口号
server.port=8080
##项目信息
info.name=pbm
info.server.port=${server.port}
(3)然后启动项目可以看到:
介绍一下红框内的Actuator暴露的功能:
虽然大部分端点在默认情况下都是启用状态,但是在Spring Boot应用中,默认只开启info端点和health端点。其余端点都需要通过声明属性来开启
我们可以在浏览器上访问http://localhost:8080/info可以看到如下图:
通过上面表格,我们可以在浏览器上访问http://localhost:8080/health可以看到如下图:
springboot整合Atuactor
链接:https://pan.baidu.com/s/15tnhqVK-M2UVe1tEA4aUmA
提取码:6jkq
8.2 使用Admin监控
8.2.1 什么是Spring Boot Admin
Spring Boot Admin是Spring Boot项目的一个社区项目,主要用于管理和监控Spring Boot应用程序。通常来说,应用程序向我们的Spring Boot Admin Server(通过HTTP)直接注册信息或者Spring Boot Admin Server通过使用Spring Cloud(例如Eureka、Consul)服务发现收集Client信息。UI只是Spring Boot Actuator端点上的一个AngularJs应用程序(2.x版本后使用Vue)。
8.2.2 设置Spring Boot Admin Server
Spring Boot Admin应用分为Spring Boot Admin Server应用和Spring Boot Admin Client应用。其中,Spring Boot Admin Server应用用于收集Spring Boot Admin Client应用的信息并对其进行监控等。接下来,我们创建一个Spring Boot Admin Server应用。
创建Spring Boot Admin Server应用的过程大致分为两步,首先创建一个Spring Boot应用程序,在pom文件中加入依赖,如代码清单8-15所示。
然后在Spring Boot应用程序启动类中加入@EnableAdminServer,引入Spring Boot Admin Server配置,如代码清单8-16所示。
到这里,Spring Boot-Admin-Server项目就已经配置完成了。启动项目可以看到如图8-5所示的页面。
由于还没有Spring Boot Admin Client应用注册到Spring Boot-Admin-Server,因此现在实例数量还是0。
8.2.3 Spring Cloud Eureka
可能到这里有人会问,这是一本讲解Spring Boot的书,为什么突然讲到Spring Cloud的组件Eureka。因为Spring Boot Admin Client有一种方式是基于Eureka获取信息,所以这里介绍一下Spring Cloud的注册中心组件Eureka。
引用官方的介绍:Eureka是Netflix开发的服务发现框架,本身是一个基于REST的服务,主要用于定位运行在AWS域中的中间层服务,以达到负载均衡和中间层服务故障转移的目的。Spring Cloud将它集成在子项目spring-cloud-netflix中,以实现Spring Cloud的服务发现功能。
通俗地理解,Eureka就是一个注册中心。本小节仅对Eureka Server进行简单的介绍,感兴趣的读者可以去Spring Cloud官网(官网地址:https://cloud.spring.io/spring-cloud-static/Finchley.SR2/single/spring-cloud.html)查看更多关于Eureka的信息。
接下来,带领大家创建一个Eureka Server。新建项目,在pom文件中加入spring-cloud-starter-netflix-eureka-server依赖(使用Spring Cloud Finchley.SR1版本)。完整pom文件内容如代码清单8-17所示。
然后在启动类中加入注解@EnableEurekaServer,表明当前Spring Boot应用程序是一个Eureka Server程序,如代码清单8-18所示
最后,我们只需要在配置文件中对Eureka Server应用程序进行配置,因为这里使用单节点Eureka Server应用,注意设置禁止向自己注册服务。配置文件如代码清单8-19所示。
到这里,Eureka Server应用配置完成了。启动项目,在浏览器中访问http://localhost:8761,可以看到如图8-6所示的页面。
与Spring Boot Admin Server一致,目前还没有实例注册进来,所以现在实例是空的,稍后会继续使用。
8.2.4 Spring Boot Admin Client的使用
前面介绍了,使用Spring Boot Admin Server监控管理有两种方式,基于Spring Cloud Discovery(Eureka服务发现)或者对实例应用进行配置。接下来笔者带领大家分别对两种模式进行学习。
- Spring Boot Admin客户端
使用这种方式,所有需要使用Spring Boot Admin Server监控管理的应用程序都需要引入spring-boot-admin-starter-client依赖,如代码清单8-20所示。
接下来,在配置文件中配置Spring Boot Admin Server的地址,并且配置应用名称,以便在Spring Boot Admin Server页面查看。这里将端口号设置为8081,如代码清单8-21所示。
启动Spring Boot Admin Client应用程序后,再来查看一下Spring Boot Admin Server监控页面,如图8-7所示。
从图8-7中可以看到我们刚刚创建的应用实例已经注册到了Spring Boot Admin Server中,在Spring Boot Admin Server中会检测Spring Boot Admin Client实例的健康状况,其实就是检测actuator端点的health端点,因为当前应用实例状态为up,所以状态显示为all up。如果当前有任何应用不是up状态,就会显示状态为down。
接下来单击实例,可以查看实例的详细信息,如图8-8所示
由于当前Spring Boot Admin Client应用程序没有为actuator开放更多的端点,因此这里仅能看到很少的信息。接下来我们为当前应用程序开放全部端点并且设置显示全部详细信息,然后查看Spring Boot Admin Server监控页面,如图8-9所示。
从图8-9中可以看到Spring Boot-Admin Server监控页面的数据随着开放的端点变多而变多,其实Spring Boot-Admin Server监控就是对Spring Boot应用程序的actuator端点进行一定的监控管理。
2. 基于服务发现
接下来,我们使用Eureka的方式使用Spring Boot-Admin Server监控管理。新建项目,在项目中加入spring-cloud-starter-netflix-eureka-client依赖,如代码清单8-22所示。
在配置文件中配置Eureka Server的地址,并且开启全部actuator端点,设置端口号为8082,如代码清单8-23所示。
然后将Spring Boot Admin Server应用程序加入Eureka Client依赖及配置,过程同上。全部配置完成后重启项目,先查看一下Eureka Server监控页面,如图8-10所示。
可以看到实例部分已经存在两个使用Eureka的应用实例。接着查看Spring Boot Admin Server监控页面,如图8-11所示。
分别介绍了使用Spring Boot Admin客户端和基于服务发现两种方式进行注册实例,都可以达到使用Spring Boot Admin监控的目的,这里笔者建议使用基于Eureka的方式,这样会更简单一些,无须基于每个应用频繁地配置。
8.2.5 安全验证
如果Spring Boot Admin Server监控页面可以随意查看,似乎不太安全。接下来笔者带领大家为Spring Boot Admin Server监控增加安全管理,在pom文件中加入spring-boot-starter-security依赖配置,如代码清单8-24所示。
接下来加入一个配置类,使actuator端点可访问(这里设置登录用户可以查看全部端点),如代码清单8-25所示。
在配置文件中配置用户名admin、密码123456,然后重启项目,访问http://localhost:8080,Spring Boot Admin Server为我们提供了友好的登录页面,如图8-12所示。
使用用户名、密码登录后,就可以和之前一样查看Spring Boot Admin Server安全管理页面。
8.2.6 JMX-bean管理
如果在Spring Boot Admin Server安全管理页面需要与JMX-bean交互,那么在应用程序中必须包含Jolokia。由于Jolokia是基于servlet的,因此不支持响应式应用程序,WebFlux在这里暂时不支持。使用Jolokia只需要引入Jolokia依赖,如代码清单8-26。
8.2.7 通知
Spring Boot Admin Server不但提供了管理页面供我们查看,而且提供了一些通知,比如邮件通知、PagerDuty通知、OpsGenie通知等。本小节仅对邮件通知进行介绍。
邮件通知将作为使用Thymeleaf模板呈现的HTML电子邮件传递。如果需要启用邮件通知,就需要在项目中加入spring-boot-starter-mail依赖,如代码清单8-27所示。
在配置文件中新增邮箱相关配置信息,在后面的章节会介绍Spring Boot邮件发送的相关内容,这里不做过多解释。关于Spirng Boot Admin需要设置发送邮件地址和收件地址,如代码清单8-28所示。
重启项目后查看邮件,可以看到如图8-13所示的页面。
从图8-13中可以看到关于实例应用的状态变化、异常信息等,但是模板是英文的,如果需要自定义页面模板,那么可以新建一个HTML,并且在配置文件中配置spring.boot.admin.notify.mail.template。比如在src/main/resources/文件夹下创建status-changed.html文件,然后在配置文件中配置spring.boot.admin.notify.mail.template=classpath:/status-changed.html。以下是笔者根据官方提供的模板页面稍作修改的中文版,如代码清单8-29所示。
使用自定义模板后,页面如图8-14所示
只是将对应英文修改成了中文,没有做过多修改,具体使用可以仔细考量需要得到的信息。