《深入理解 Spring Cloud 与微服务构建》第十五章 微服务监控 Spring Boot Admin
文章目录
- 《深入理解 Spring Cloud 与微服务构建》第十五章 微服务监控 Spring Boot Admin
- 一、Spring Boot Admin 简介
- 二、使用 Spring Boot Admin 监控 Spring Boot 应用程序
- 1.创建 Spring Boot Admin Server
- 2.创建 Spring Boot Admin Client
- 三、使用 Spring Boot Admin 监控 Spring Cloud 微服务
- 1.构建 Admin Server
- 2.构建 Admin Client
- 四、在 Spring Boot Admin 中添加 Security 和 Mail 组件
- 1.Spring Boot Admin 集成 Security 组件
- 2.Spring Boot Admin 集成 Mail 组件
一、Spring Boot Admin 简介
Spring Boot Admin 用于管理和监控一个或者多个 Spring Boot 程序。Spring Boot Admin 分为 Server(服务端)和 Client(客户端),客户端可以通过向服务端注册,也可以结合 Spring Cloud 的服务注册组件(Eureka 和 Consul)进行注册。Spring Boot Admin 提供了用 React 编写的 UI 界面,用于管理和监控。其中,监控内容包括 Spring Boot 的监控组件 Actuator 的各个 Http 节点,也支持更高级的功能,包括 Jmx 和 Loglevel 等。能够监控的信息和功能如下:
- 显示健康状况
- 显示详细信息,例如:JVM 和内存指标、micrometer.io 指标、数据源指标
- 缓存指标
- 显示构建信息编号
- 关注并下载日志文件
- 查看 jvm 系统和环境属性
- 查看 Spring Boot 配置属性
- 支持 Spring Cloud 的 postable / env- 和 /refresh-endpoint
- 轻松的日志级管理
- 与 JMX-beans 交互
- 查看线程转储
- 查看 auditevents
- 查看 http-endpoints
- 查看计划任务
- 查看和删除活动会话(使用 spring-session)
- 查看 Flyway/Liquibase 数据库迁移
- 下载 heapdump
- 状态变更通知(通过电子邮件、Slack、Hipchat 等方式)
- 状态更改的事件日志(非持久性)
二、使用 Spring Boot Admin 监控 Spring Boot 应用程序
本节案例将使用 Spring Boot Admin 监控 Spring Boot 应用程序。案例包括 2 个工程,如下表所示:
应用名 | 端口 | 说明 |
admin-server | 8769 | Admin 服务端 |
admin-client | 8768 | Admin 客户端 |
1.创建 Spring Boot Admin Server
主 Maven 工程的 pom 文件代码如下所示:
<?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>org.example</groupId>
<artifactId>Boot-Admin</artifactId>
<version>1.0-SNAPSHOT</version>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.0.RELEASE</version>
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
<spring-cloud.version>Greenwich.RELEASE</spring-cloud.version>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
</project>
在父工程下创建子工程 admin-server,在该工程引入 admin-server 的起步依赖和 WEB 的起步依赖,代码如下:
<dependencies>
<dependency>
<groupId>de.codecentric</groupId>
<artifactId>spring-boot-admin-starter-server</artifactId>
<version>2.1.0</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
然后在工程的启动类 AdminServerApplication 加上 @EnableAdminServer 注解,开启 AdminServer 的功能
在工程的配置文件 application.yml 中配置应用名和应用的端口,代码如下:
spring:
application:
name: admin-server
server:
port: 8769
2.创建 Spring Boot Admin Client
在父工程下创建一个 admin-client 的子工程,在子工程的 pom 文件引入 admin-client 的起步依赖和 WEB 的起步依赖,代码如下:
<dependencies>
<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>
</dependencies>
在工程的配置文件 application.yml 中配置应用名和端口信息,并向 admin-server 注册的地址为 http://localhost:8769,最后暴露自己的 Actuator 的所有端口信息,以供 admin-server 监控,具体配置如下:
spring:
application:
name: admin-client
boot:
admin:
client:
url: http://localhost:8769
server:
port: 8768
management:
endpoints:
web:
exposure:
include: '*'
endpoint:
health:
show-details: ALWAYS
依次启动 admin-server 和 admin-client 两个工程,在浏览器中输入 localhost:8769,浏览器显示的界面如图所示:
单击 Wallboard 界面,进入客户端实例的详细界面,查看 admin-client 的具体信息。在详细界面中可以查看客户端实例的信息、日志信息、招标信息、环境信息、日志级别管理和 JMX 等。客户端实力的内存状态信息如图所示:
三、使用 Spring Boot Admin 监控 Spring Cloud 微服务
本案例需要使用 3 个工程,分别为服务注册中心 Eureka Server、服务客户端 Eureka Client 和 Spring Boot Admin Server。本案例是一个 Maven 多 Module 的工程,需要创建一个主 Maven 工程,主 Maven 工程指定了 Spring Boot 版本为 2.1.0,Spring Cloud 版本为 Greenwich.RELEASE。主 Maven 工程的创建过程和服务注册中心 Eureka Server 的创建过程同不再重复。3 个工程的基本信息如下表所示:
应用名 | 端口 | 说明 |
eureka-server | 8761 | 服务注册中心 |
admin-server | 8769 | Admin 服务端,向注册中心注册 |
admin-client | 8768 | Admin 客户端,向注册中心注册 |
1.构建 Admin Server
在主 Maven 工程下创建一个 Module 工程,取名为 admin-server,该工程作为 Spring Boot Admin Server 工程,用于对微服务系统进行监控和管理。首先,在 admin-server 工程的 pom 文件引入相关的依赖,包括继承饿了主 Maven 的 pom 文件,引入 admin-server 的起步依赖 、WEB 的起步依赖、eureka-client 的起步依赖。完整的 pom 文件的依赖代码如下:
<dependencies>
<dependency>
<groupId>de.codecentric</groupId>
<artifactId>spring-boot-admin-starter-server</artifactId>
<version>2.1.0</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
</dependencies>
然后在工程的配置文件 application.yml 中配置应用名和端口信息,并向注册中心注册,注册地址为 http://localhost:8761,最后将 Actuator 组件的所有端口暴露出来,具体配置如下:
spring:
application:
name: admin-server
server:
port: 8769
eureka:
client:
registry-fetch-interval-seconds: 5
service-url:
defaultZone: ${EUREKA_SERVICE_URL:http://localhost:8761}/eureka/
instance:
lease-renewal-interval-in-seconds: 10
health-check-url-path: /actuator/health
management:
endpoints:
web:
exposure:
include: "*"
endpoint:
health:
show-details: ALWAYS
在工程的启动类 AdminServerApplication 加上 @EnableAdminServer 注解,开启 admin-server 的功能,加上 @EnableDiscoveryClinet 注解开启 Eureka Clinet 功能
2.构建 Admin Client
同 admin-server 工程,在主 Maven 工程下新建一个 Module 工程,取名为 admin-client。admin-client 工程的 pom 文件继承了主 Maven 的 pom 文件,并在 admin-client 工程的 pom 文件中引入了 WEB 功能的起步依赖 spring-boot-starter-web、Eureka 的起步依赖 spring-cloud-starter-netflix-eureka-client、Actuator 的起步依赖 spring-boot-starter-actuator,以及 Jolokia 的依赖 jolokia-core,代码如下:
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
</dependencies>
在工程的配置文件 application.yml 中指定服务注册的地址为 http://localhost:8761/eureka/,程序名为 admin-client-one,端口号为 8768,并暴露 Actuator 的所有端口,代码如下:
spring:
application:
name: admin-client
eureka:
instance:
lease-renewal-interval-in-seconds: 10
health-check-url-path: /actuator/health
client:
registry-fetch-interval-seconds: 5
service-url:
defaultZone: ${EUREKA_SERVICE_URL:http://localhost:8761}/eureka/
management:
endpoints:
web:
exposure:
include: "*"
endpoint:
health:
show-details: ALWAYS
server:
port: 8762
在程序的启动类 AdminClientApplication 加上 @EnableEurekaClient 注解,开启 EurekaClient 的功能
依次启动 eureka-server、admin-client 和admin-server,在浏览器上访问 admin-server 的主页 http://localhost:8769/,浏览器显示的 admin-server 的界面如图所示:
四、在 Spring Boot Admin 中添加 Security 和 Mail 组件
Spring Boot Admin 提供了非常良好的组件化功能,比如集成 Security 安全组件和 Mail 报警组件等
1.Spring Boot Admin 集成 Security 组件
在生产环境中,不希望通过网址直接访问 Spring Boot Admin Server 的主页界面,因为这个界面包含了太多的服务信息,必须对这个界面的访问进行安全验证。Spring Boot Admin 提供了登录界面的组件,并且和 Spring Boot Security 相结合,需要用户登录才能访问 Spring Boot Admin Server 的界面
下面来进行具体的案例讲解,本节的案例在上一节的案例基础之上进行改造。在admin-server 工程的 pom 文件加上 Security 的起步依赖,代码如下:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
在工程的配置文件 application.yml 中做以下的配置,创建一个 Security 的 user 用户,它的用户名为 admin,密码为 admin。通过 eureka.instance.metadate-map 配置带上该 Security 的 user 用户信息,因为在工程的 pom 文件加上 Spring Boot Security 的起步依赖以后,该项目的所有资源(包括静态资源 html、css,以及 API 接口等)都是受保护的,需要加上该管理员信息进行安全验证才能访问,代码如下:
spring:
application:
name: admin-server
security:
user:
name: admin
password: admin
server:
port: 8769
eureka:
client:
registry-fetch-interval-seconds: 5
service-url:
defaultZone: ${EUREKA_SERVICE_URL:http://localhost:8761}/eureka/
instance:
lease-renewal-interval-in-seconds: 10
health-check-url-path: /actuator/health
metadata-map:
user.name: admin
user.password: admin
management:
endpoints:
web:
exposure:
include: "*"
endpoint:
health:
show-details: ALWAYS
然后,在程序中配置 Spring Boot Security,写 SecurityConfig 的配置类,该配置类继承 WebSecurityConfigurerAdapter,并复写了 configure(HttpSecurity http) 方法。在该方法下做了各种配置,例如配置了登录界面为 “/login.html”,退出截面为 “/logout”。这些页面以及静态资源 css、img 都在引入的 Jar 中,这些资源的访问不需要认证。给这些静态资源加上 permitAll() 方法,除上述以外的资源访问需要权限认证,即加上 authenticated() 方法。另外,这些静态资源界面不支持 CSFR(跨站请求伪造),所以禁用掉 CSFR,最后需要开启 HTTP 的基本认证,即 httpBasic() 方法,代码如下:
package com.sisyphus.config;
import de.codecentric.boot.admin.server.config.AdminServerProperties;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.web.authentication.SavedRequestAwareAuthenticationSuccessHandler;
@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");
http.authorizeRequests()
.antMatchers(adminContextPath + "/assets/**").permitAll()
.antMatchers(adminContextPath + "/login").permitAll()
.anyRequest().authenticated()
.and()
.formLogin().loginPage(adminContextPath + "/login").successHandler(successHandler).and()
.logout().logoutUrl(adminContextPath + "/logout").and()
.httpBasic().and()
.csrf().disable();
}
}
重新启动 admin-server 工程,在浏览器中访问 http://localhost:8769/,浏览器显示的界面如图所示:
在界面上输入用户名为 admin,密码为 admin,单击 “Login” 按钮,登录成功就会跳转到 Spring Boot Admin 的主页
2.Spring Boot Admin 集成 Mail 组件
在 Spring Boot Admin 中,也可以集成邮箱报警功能,比如服务不健康或者下线了,都可以给指定邮箱发送邮件。集成非常简单,只需要对 admin-server 工程进行改造即可。在 admin-server 工程 pom 文件中加上 mail 的起步依赖,代码如下:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
</dependency>
在 admin-server 工程的配置文件 application.yml 文件中,需要完成邮件相关的配置工作,代码如下:
spring:
mail:
host: smtp.qq.com
username: 1305799874@qq.com
password: #此处为 SMTP 授权码,需要额外开通
boot:
admin:
notify:
mail:
from: 1305799874@qq.com #需要与 spring.mail.username 保持一致
to: 1305799874@qq.com
做完以上配置后,当我们已注册的客户端状态从 UP 变为 OFFLINE 或其他状态时,admin-server 就会自动将电子邮件发送到上面配置的邮箱