简介
Spring Boot Admin 是一个开源社区项目,用于管理和监控你的 Spring Boot 项目,被监控的应用可以作为 Spring Boot Admin Client 注册到 Spring Boot Admin Server 上,由统一监控。Spring Boot Admin 的前端 UI 是由 Vue.js 写的一个应用程序,用于展示被监控应用的信息。
快速入门
Spring Boot Admin 有两个模块组成,Spring Boot Admin Server
(服务端) 和 Spring Boot Admin Client
(客户端)。
构建 Spring Boot Admin Server
新建服务端项目,在 pom.xml 文件中添加服务端依赖:
<!--spring boot admin server 依赖-->
<dependency>
<groupId>de.codecentric</groupId>
<artifactId>spring-boot-admin-starter-server</artifactId>
<version>${spring.boot.admin.version}</version>
</dependency>
<!--web依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
在启动类上加上 @EnableAdminServer
注解加载配置:
@SpringBootApplication
@EnableAdminServer
public class AdminServerApplication {
public static void main(String[] args) {
SpringApplication.run(SpringBootAdminApplication.class, args);
}
}
启动服务端,访问 http://localhost:8080 可以看到如下界面:
构建 Spring Boot Admin Client
新建客户端项目,在 pom.xml 文件中,添加客户端依赖:
<!--spring boot admin client 依赖-->
<dependency>
<groupId>de.codecentric</groupId>
<artifactId>spring-boot-admin-starter-client</artifactId>
<version>${spring.boot.admin.version}</version>
</dependency>
在 application.yml 文件上添加配置,将客户端注册到服务端上:
server.port: 8090
spring.boot.admin.client.url: http://localhost:8080
management.endpoints.web.exposure.include: "*"
spring.boot.admin.client.url 指定了服务端的地址,客户端将自己注册上去。在这里,为了简单起见我配置了management.endpoints.web.exposure.include=*,将客户端的所有 endpoint 暴露到 Http 上,生产环境需要谨慎的配置想要暴露的地址。启动客户端程序,然后刷新刚才的服务端地址(http://localhost:8080),发现 applications 下已经有客户端的信息:
在 Spring Cloud 上集成
在 Spring Cloud 上集成 Spring Boot Admin,只需要将 Spring Boot Admin Server
注册到注册中心上就可以了,Spring Boot Admin Server
会从注册中心拉取注册到注册中心上的服务。
Spring Boot Admin 支持多种类型的注册中心,这里以 Eureka 为例,演示与 Spring Cloud 集成。
修改 Spring Admin Boot Server
修改服务端的 pom.xml,加入 Eureka 的客户端依赖:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
在启动类加上 @EnableDiscoveryClient
注解:
@SpringBootApplication
@EnableAdminServer
@EnableDiscoveryClient
public class AdminServerApplication {
public static void main(String[] args) {
SpringApplication.run(SpringBootAdminApplication.class, args);
}
}
在 application.yml 上添加 Eureka 配置:
server:
port: 8080
spring:
application:
name: admin-server
eureka:
instance:
instance-id: ${spring.application.name}:${server.port}
client:
serviceUrl:
defaultZone: http://localhost:8761/eureka/
修改 Spring Boot Admin Client
将 Spring Boot Admin Server
注册到注册中心的话,Spring Boot Admin Server
会从注册中心上拉去应用并对应用进行监控,所以应用无需再添加 Spring Boot Admin Client
依赖。
修改 pom.xml:
<!--删除 spring boot admin client 依赖-->
<!--<dependency>-->
<!--<groupId>de.codecentric</groupId>-->
<!--<artifactId>spring-boot-admin-starter-client</artifactId>-->
<!--<version>${spring.boot.admin.version}</version>-->
<!--</dependency>-->
<!--添加 eureka 客户端依赖-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
<version>2.1.1.RELEASE</version>
</dependency>
在启动类上添加 @EnableDiscoveryClient
注解:
@SpringBootApplication
@EnableDiscoveryClient
public class AdminclientApplication {
public static void main(String[] args) {
SpringApplication.run(AdminclientApplication.class, args);
}
}
修改 application.yml :
spring:
application:
name: admin-client
server:
port: 8090
# spring.boot.admin.client.url: http://localhost:8080 #不再需要配置,删除
management.endpoints.web.exposure.include: "*"
eureka:
instance:
# eureka 上的 status的名称这里配置的是:应用名:端口号
instance-id: ${spring.application.name}:${server.port}
client:
service-url:
default-zone: http://localhost:8761/eureka/
启动服务端跟客户端,可以看到,两个应用都已经注册到 Eureka 上了:
访问 http://localhost:8080 在 applications 可以看到 Eureka 上的应用在监控面板上了:
安全认证
上面的例子由于没有安全认证,意味着当我们的 Spring Boot Admin Server
暴露在外网的时候,只要任何人知道了地址,就能访问我们的监控台,从而获取应用的关键信息,这是很危险的。想要集成安全认证功能也很简单,Spring Boot Admin 使用 Spring Security 做应用的安全认证,只需要引入 Security 的依赖,然后在配置文件中配置一下就可以了。下面演示如何集成 Security 安全认证。
在 pom.xml 中添加 security 依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
修改 application.yml :
spring:
application:
name: admin-client
# 配置登录密码
security:
user:
name: admin
password: admin
server:
port: 8090
# spring.boot.admin.client.url: http://localhost:8080 #不再需要配置,删除
management.endpoints.web.exposure.include: "*"
eureka:
instance:
# eureka 上的 status的名称这里配置的是:应用名:端口号
instance-id: ${spring.application.name}:${server.port}
metadata-map:
user:
name: "admin" #These two are needed so that the server
password: "admin" #can access the protected client endpoints
client:
service-url:
default-zone: http://localhost:8761/eureka/
在配置文件中,通过配置 security.user.name 和 security.user.password 配置登录密码,由于是 spring cloud 项目,还需将用户名密码配置到元数据中,这样就每个客户端在启动的时候就能拿到元数据,通过元数据的用户名密码注册到 ```Spring Boot Admin Server` 上。
重新启动服务端,访问 http://localhost:8080 发现,此时需要登录才能进入到监控台:
而且,登录进去后,在监控台的右上角有一个退出登录按钮:
通知
Spring Boot Admin 还提供了通知功能,当应用上/下线的时候,可以通过邮件进行通知。
不止邮件一种通知方式哦,这里只是以邮件举例
增加邮件发送的依赖:
<!--mail-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
</dependency>
配置邮件信息:
spring:
mail:
# 邮箱服务器
host: smtp.163.com
# 邮箱地址
username: xxxx@163.com
# smtp授权码
password: xxxx
boot.admin.notify.mail:
# 发送地址
to: xxxx@163.com
# 发送人
from: xxxx@163.com
这样,在应用上/下线的时候,告警邮箱就会接收到如下的通知:
spring boot admin 官方文档:https://codecentric.github.io/spring-boot-admin/2.1.6/
公众号
觉得不错可以关注我的公众号,不定时更新工作中的踩坑经历,及一些工作思考