【**前情提要**】Spring Boot Actuator 提供了对单个 Spring Boot 应用的监控,信息包含应用状态、内存、线程、堆栈等,比较全面的监控了 Spring Boot 应用的整个生命周期。但是这样监控也有一些问题:第一,所有的监控都需要调用固定的接口来查看,如果全面查看应用状态需要调用很多接口,并且接口返回的 JSON 信息不方便运营人员理解;第二,如果 Spring Boot 应用集群非常大,每个应用都需要调用不同的接口来查看监控信息,操作非常繁琐低效。在这样的背景下,就诞生了另外一个开源软件:**Spring Boot Admin**。

----
# 壹、什么是Spring Boot Admin
Spring Boot Admin 是一个管理和监控 Spring Boot 应用程序的开源软件,每个应用都认为是一个客户端,通过 HTTP 或者使用 Eureka 注册到 admin server 中进行展示,Spring Boot Admin UI 部分使用 Vue.js 将数据展示在前端。

Spring Boot Admin 是一个针对 Spring Boot 的 Actuator 接口进行 UI 美化封装的监控工具,它可以在列表中浏览所有被监控 spring-boot 项目的基本信息、详细的 Health 信息、内存信息、JVM 信息、垃圾回收信息、各种配置信息(比如数据源、缓存列表和命中率)等,还可以直接修改 logger 的 level。

值得注意的是 Spring Boot Admin 并不是 Spring Boot 官方出品的开源软件,但是其软件质量和使用广泛度都非常的高,并且 Spring Boot Admin 会及时随着 Spring Boot 的更新而更新,当 Spring Boot 推出 2.X 版本时 Spring Boot Admin 也及时进行了更新。

Spring Boot Admin 2.x 不仅是跟着支持了 Spring Boot 2.x,还在 1.x 的基础上进行了大量的更新和优化:

重新规划了项目依赖包,让项目中更方便的集成 Spring Boot Admin
1.x 前端使用了 Angular.js,2.x 使用 Vue 对界面进行了重写,界面美观度提升幅度非常高
提供了支持 Spring Cloud 的组件
其他更新,具体参考:Changes with 2.x

Spring Boot Admin 分为服务端和客户端,服务端其实就是一个监控后台用来汇总展示所有的监控信息,客户端就是我们的应用,使用时需要先启动服务端,在启动客户端的时候打开 Actuator 的接口,并指向服务端的地址,这样服务端会定时读取相关信息以达到监控的目的。

----
接下来演示如何使用 Spring Boot Admin 对 Spring Boot 应用进行监控。

# 贰、监控单体应用

先给大家展示如何使用 Spring Boot Admin 监控单个 Spring Boot 应用。
## Admin Server 端

### 项目依赖
```pom

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

org.springframework.boot
spring-boot-starter-web

```

**2.x 下只需要添加此一个包即可,其他组件会自动依赖添加。**

### 配置文件

server.port=8000

服务端设置端口为:8000。

### 启动类
~~~java
@EnableAdminServer
@SpringBootApplication
public class AdminServerApplication {

public static void main(String[] args) {
SpringApplication.run(AdminServerApplication.class, args);
}
}

~~~
完成上面三步之后,启动服务端,访问网址 http://localhost:8000 可以看到以下界面:
![监控页面](https://img2018.cnblogs.com/blog/1035487/201908/1035487-20190810231021326-1719527225.png)
因为刚启动没有应用,因此显示:No applications registered.,同时根据上图也可以看出 applications 页面会展示项目的应用数、实例数和状态三个信息。

接下来我们构建一个客户端,并注册到服务端。
## Admin Client 端

## 项目依赖
~~~pom

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

org.springframework.boot
spring-boot-starter-web

~~~
**添加 spring-boot-starter-web 是为了使应用处于启动状态,spring-boot-admin-starter-client 会自动添加 Actuator 相关依赖。**

### 配置文件
~~~properties
server.port=8001
spring.application.name=Admin Client
spring.boot.admin.client.url=http://localhost:8000
management.endpoints.web.exposure.include=*
~~~
spring.boot.admin.client.url 配置 Admin Server 的地址
management.endpoints.web.exposure.include=* 打开客户端 Actuator 的监控

### 启动类
~~~java
@SpringBootApplication
public class AdminClientApplication {
public static void main(String[] args) {
SpringApplication.run(AdminClientApplication.class, args);
}
}
~~~

配置完成之后,启动 Client 端,Admin 服务端会自动检查到客户端的变化,并展示其应用:
![结果](https://img2018.cnblogs.com/blog/1035487/201908/1035487-20190810231021476-1805092307.png)
页面会展示被监控的服务列表,点击项目名称会进入此应用的详细监控信息:
![详情](https://img2018.cnblogs.com/blog/1035487/201908/1035487-20190810231021665-419212640.png)
通过上图可以看出,Spring Boot Admin 以图形化的形式展示了应用的各项信息,这些信息大多都来自于 **Spring Boot Actuator** 提供的接口。利用图形化的形式很容易看到应用的各项参数变化,甚至有些页面还可以进行一些操作,比如改变打印日志的级别等。

### 点击 journal 页面可以看到应用状态变化的历史过程:
![journal](https://img2018.cnblogs.com/blog/1035487/201908/1035487-20190810231021820-465709400.png)
### 点击第一个菜单 wallboard 可以以更形象的方式查看应用数量启动的时间等。
![wallboard ](https://img2018.cnblogs.com/blog/1035487/201908/1035487-20190810231022273-587137330.png)

# 叁、监控微服务

如果我们使用的是单个 Spring Boot 应用,就需要在每一个被监控的应用中配置 Admin Server 的地址信息;如果应用都注册在 Eureka 中就不需要再对每个应用进行配置,Spring Boot Admin 会自动从注册中心抓取应用的相关信息。

如果使用了 Spring Cloud 的服务发现功能,就不需要再单独添加 Admin Client 客户端,仅仅需要 Spring Boot Server,其他内容会自动进行配置。

接下来以 Eureka 作为服务发现的示例来进行演示,实际上也可以使用 Consul 或者 Zookeeper。

(1)服务端和客户端添加 spring-cloud-starter-eureka 到包依赖中
```pom

org.springframework.cloud
spring-cloud-starter-netflix-eureka-client

```
(2)启动类添加注解
~~~java
@Configuration
@EnableAutoConfiguration
@EnableDiscoveryClient
@EnableAdminServer
public class SpringBootAdminApplication {
public static void main(String[] args) {
SpringApplication.run(SpringBootAdminApplication.class, args);
}

@Configuration
public static class SecurityPermitAllConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests().anyRequest().permitAll()
.and().csrf().disable();
}
}
}

~~~
使用类 **SecurityPermitAllConfig** 关闭了安全验证。

(3)在客户端中配置服务发现的地址
~~~yaml
eureka:
instance:
leaseRenewalIntervalInSeconds: 10
health-check-url-path: /actuator/health
metadata-map:
startup: ${random.int} #needed to trigger info and endpoint update after restart
client:
registryFetchIntervalSeconds: 5
serviceUrl:
defaultZone: ${EUREKA_SERVICE_URL:http://localhost:8761}/eureka/

management:
endpoints:
web:
exposure:
include: "*"
endpoint:
health:
show-details: ALWAYS
~~~

**Spring Cloud** 提供了示例代码可以参考这里:[spring-boot-admin-sample-eureka](https://github.com/codecentric/spring-boot-admin/tree/master/spring-boot-admin-samples/spring-boot-admin-sample-eureka/)。

重启启动服务端和客户端之后,访问服务端的相关地址就可以看到监控页面了。
# 肆、安全控制

**Spring Boot Admin** 后台有很多的敏感信息和操作,如果公司不做权限控制可能会影响到公司系统的安全性。Spring Boot Admin 也考虑到了这个因素,可以利用前面的 Spring Security 做安全访问控制,在 spring-boot-admin-server 上进行改造。

(1)添加 Spring Boot Security 依赖包
~~~pom

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

~~~

(2)添加安全访问控制

和前面的 Security 配置一样,给项目添加访问控制。
~~~java
@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 {
// @formatter:off
SavedRequestAwareAuthenticationSuccessHandler successHandler = new SavedRequestAwareAuthenticationSuccessHandler();
successHandler.setTargetUrlParameter("redirectTo");
successHandler.setDefaultTargetUrl(adminContextPath + "/");

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()
.csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse())
.ignoringAntMatchers(
adminContextPath + "/instances",
adminContextPath + "/actuator/**"
);
}
}

antMatchers(adminContextPath + "/assets/**").permitAll() 所有静态内容不做安全验证
anyRequest().authenticated() 其他请求均需要验证
formLogin() 配置登录
logout() 配置登出
httpBasic() 支持 HTTP,引导 Spring Boot Admin 客户端注册
csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse()) 打开跨站点请求保护 Cookies
adminContextPath + "/instances" 取消跨站点请求保护 "/instances",方便 Admin 客户端注册
adminContextPath + "/actuator/** " 取消跨站点请求保护 "/actuator/**",可以让 Admin 监控到 Actuator 的相关接口
~~~

然后可以给 security 设置一个用户名和密码:
~~~propert
spring.security.user.name=admin
spring.security.user.password=admin
~~~
配置完成之后重启 Admin Server 端,访问网址 http://localhost:8000 就会发现需要一个登录的用户名和密码了。
![Admin Server](https://img2018.cnblogs.com/blog/1035487/201908/1035487-20190810231022473-466473161.png)
使用刚才设置的用户名和密码登录之后,发现注册到 Server 端的服务数成为 0 了,这是客户端统一也需要配置帐户名和密码信息。

~~~propert
spring.security.user.name=admin
spring.security.user.password=admin
~~~

配置完成之后重新启动,在服务端就又可以查看监控到的应用了。

# 伍、其他方式

如果 Actuator 的端口被使用 HTTP 认证保护,那么 Spring Boot Admin Server 访问的时候需要凭证信息,这时候可以使用 metadata 的方式对账户和密码进行配置。

## 直接使用客户端注册的方式:
~~~yaml
spring.boot.admin.client:
url: http://localhost:8080
instance:
metadata:
user.name: ${spring.security.user.name}
user.password: ${spring.security.user.password}
~~~
## 使用 Eureka 进行注册的方式:
~~~yaml
eureka:
instance:
metadata-map:
user.name: ${spring.security.user.name}
user.password: ${spring.security.user.password}
~~~
Eureka 中的 metadataMap 是专门用来存放一些自定义的数据,当注册中心或者其他服务需要此服务的某些配置时可以在 metadataMap 里取。实际上,每个 instance 都有各自的 metadataMap,map 中存放着需要用到的属性。例如,上面配置中的 eureka.instance.metadata-map.user.name,当这个服务成功注册到 Eureka 上,Spring Boot Admin 就会拿到这个 instance,进而拿到 metadataMap 里的属性,然后放入请求头,向此服务发送请求,访问此服务的 Actuator 开放的端点。
# 陆、邮件告警

Spring Boot Admin 将微服务中所有应用信息在后台进行了展示,非常方便我们对微服务整体的监控和治理。但是我们的运营人员也不可能一天 24 小时盯着监控后台,因此如果服务有异常的时候,有对应的邮件告警就太好了,其实 Spring Boot Admin 也给出了支持。

我们对上面的示例项目 spring-boot-admin-server 进行改造。

## 添加依赖
~~~pom

org.springframework.boot
spring-boot-starter-mail

~~~
## 增加了邮件发送的 starter 包。

### 配置文件
~~~properties
spring.mail.host=smtp.qq.com
spring.mail.username=xxx@qq.com
spring.mail.password=xxx
spring.mail.properties.mail.smtp.auth=true
spring.mail.properties.mail.smtp.starttls.enable=true
spring.mail.properties.mail.smtp.starttls.required=true
spring.boot.admin.notify.mail.from=yyyy@qq.com
spring.boot.admin.notify.mail.to=zzz@qq.com
~~~
**在配置文件中添加邮件发送相关信息:邮件的发送者、接受者、协议、移动授权码等**。

配置完成后,重新启动项目 spring-boot-admin-server,这样 Admin Server 就具备了邮件告警的功能,默认情况下 Admin Server 对 Eureka 中的服务上下线都进行了监控,当服务上下线的时候我们就会收到相应的告警邮件。

当然这只是最基本的邮件监控,在实际的使用过程中,需要根据情况对邮件告警内容进行自定义,比如监控堆内存的使用情况,当到达一定比例的时候进行告警等。

【写在后面的话】Spring Boot Admin 解决了我们对大规模 Spring Boot 应用监控的需求,Spring Boot Admin 充分利用了 Actuator 开放的相关接口,采用优秀的图形界面将这些信息进行了展示,方便我们更加直观的查看集群中应用的状态。Spring Boot Admin 不仅可以监控单个 Spring Boot 应用,也可以结合 Spring Cloud 监控注册到服务中心的所有应用状态,再结合报警系统的使用就可以随时感知到应用的状态变化。在实际工作中 Spring Boot Admin 是我们在后期运营中频繁用到的一个组件,应该作为重点关注。

----
最后是一个用http方式监听的demo:[Spring Boot Admin使用http连接server端](https://github.com/eelve/springbootadmin)

SpringBoot-Admin的使用的更多相关文章

  1. 使用SpringBoot Admin监控SpringCloud微服务

    spring-boot admin的github地址:https://github.com/codecentric/spring-boot-admin 本文基于SpringCloud的环境和配置上增加 ...

  2. SpringBoot Actuator & SpringBoot Admin

    SpringBoot Actuator提供了很多监控和管理你的spring boot应用的HTTP或者JMX端点,并且你可以有选择地开启和关闭部分功能. 当你的spring boot应用中引入依赖之后 ...

  3. SpringBoot Admin 使用指南

    什么是 SpringBoot Admin? Spring Boot Admin 是一个管理和监控你的 Spring Boot 应用程序的应用程序.这些应用程序通过 Spring Boot Admin ...

  4. 【Springboot】用Springboot Admin监控你的微服务应用

    1 简介 目前,微服务大行其道,各大小公司争相学习模仿,把单体应用拆得七零八落.服务多了,运行的实例多了,给运维人员的压力就更大了.如果有十几个应用,单单做Health Check就已经够费时间的了. ...

  5. 实战SpringBoot Admin

    长话短说哦,直接查看下文吧 目录 声明 先锋 前提 SpringBoot Admin 介绍 服务端的搭建 客户端的搭建 参数的指南 尾声 声明 见名知意,实战SpringBoot Admin,实战!实 ...

  6. SpringBoot Admin应用监控搭建

    简介 Spring Boot Admin 用于监控基于 Spring Boot 的应用,它是在 Spring Boot Actuator 的基础上提供简洁的可视化 WEB UI. 参考手册地址:htt ...

  7. Springboot admin 发送邮件失败:com.sun.mail.smtp.SMTPSenderFailedException: 553 Mail from must equal authorized user

    发邮件已经是老生常谈了,今天又遇到了,而且又出了各种问题.我晕哦. 我的配置是: spring.mail.host=smtp..com spring.mail.username=klxxxx spri ...

  8. springboot admin

    转 Spring Boot Admin的使用 作者 杜琪 关注 2015.12.25 17:30* 字数 1803 阅读 16569评论 21喜欢 55 上一篇文章中了解了Spring Boot提供的 ...

  9. springboot admin server常用配置

    Property name Description Default value spring.boot.admin.context-path The context-path prefixes the ...

  10. 使用springboot Admin 2.0.6版本 集成监控springcloud微服务应用

    一 新建 添加依赖 <dependencies> <dependency> <groupId>de.codecentric</groupId> < ...

随机推荐

  1. Codeforces Gym101170I:Iron and Coal(建多幅图+多次BFS)***

    题目链接 题意 有n个点,其中有m个点是铁矿,k个点是煤,从1号点出发,你可以派一些士兵跑向不同的点,问占领至少一个铁矿和一个煤的时候,最少需要占领多少个点. 思路 建两幅图,其中一幅是正向边,一幅是 ...

  2. 使用GDAL实现DEM的地貌晕渲图(一)

    目录 1. 原理 1) 点法向量 2) 日照方向 (1) 太阳高度角和太阳方位角 (2) 计算过程 3) 晕渲强度 2. 实现 3. 参考 @ 1. 原理 以前一直以为对DEM的渲染就是简单的根据DE ...

  3. happy and angry day! 2019-07-05

    2019-07-05 01:59:51 现在我是挺开心的哈! 直面困难!迎难而上!毫无畏惧! 现在我的结果,少不了大家给我的支持与鼓励! 鸣谢 章香涛老师---------在各个方面鼓舞了我,激发了我 ...

  4. Facebook Libra - 第一笔交易

    第一笔交易 假定 运行的是Linux或者macOS系统 网络连接正常 git已安装 macOS中安装了Homebrew Linux中安装了yum或者apt-get 提交一笔交易的步骤 克隆并构建Lib ...

  5. Connecting to the Network

    This lesson shows you how to implement a simple application that connects to the network. It explain ...

  6. Ray聊天记录

    由于工作变动,Ray的文档.示例没有及时更新,深表歉意.在Ray升级后,性能较几个月前有了非常大的提升,也更具易用性.这是QQ交流群里大家的聊天记录,跟大家分享一下(由于时间仓促群里大家的聊天记录没有 ...

  7. 快速掌握mongoDB(四)—— C#驱动MongoDB用法演示

    前边我们已经使用mongo shell进行增删查改和聚合操作,这一篇简单介绍如何使用C#驱动MongoDB.C#驱动MongoDB的本质是将C#的操作代码转换为mongo shell,驱动的API也比 ...

  8. 个人永久性免费-Excel催化剂功能第46波-区域集合函数,超乎所求所想

    在常规自定义函数的世界中,一般情况下,仅会输入一堆的参数,最终输出一个结果值,在以往Excel催化剂的自定义函数,已经大量出现输入一堆参数返回多个结果值并自动输出到多个单元格区域内.此项技术可运用的场 ...

  9. Kafka producer拦截器(interceptor)

    Kafka producer拦截器(interceptor) 拦截器原理 Producer拦截器(interceptor)是在Kafka 0.10版本被引入的,主要用于实现clients端的定制化控制 ...

  10. Python在office开发中的应用

    Python with Excel 有几个很好的Python模块能够方便地操作Excel的数据,包括读与写,不要求本地安装Excel.例如pandas, openpyxl, xlrd, xlutils ...