发布于 

微服务: Admin与服务监测和管理

简介

Spring Boot Admin 并不是 Spring Boot 官方出品的,开源地址 SpringBoot Admin,伴随着 SpringBoot 的更新,Spring Boot Admin 也做了相对应的更新。Spring Boot 推出 2.X 版本时,Spring Boot Admin 也及时进行了更新。本篇使用的就是 Spring Boot Admin 2.2.1版本,最新版本是 2.2.2Spring Boot Admin 分为 clientserver 端,server 端一般独立为一个服务,client 可以是你已经开发完成的服务,也可以是你即将要开发的服务。

Spring Boot Admin 2.x 版本的具体的更新内容和变化感兴趣的朋友,可以参考 changes-2.x.adoc 文档,这里不再赘述。

继上一篇 微服务-Actuator实现服务监测,我们说到使用 Actuator 组件可以实现对服务的监测,但是这种方式没有管理界面体验很不友好。本篇继续学习关于 Admin 的知识,该组件不仅囊括了 Actuator 的功能,还提供了管理界面,使用起来比较方便。

本篇主要内容,如下:

  • 通过 HTTP 方式集成和使用 spring-boot-admin-server

  • 如何安全的使用 spring-boot-admin,这里又包含两个内容:

    • 如何将 spring-boot-admin-server 结合 spring-boot-security,实现安全管控以及如何配置;
    • 如何将 spring-boot-admin-client 结合 spring-boot-security,实现安全管控以及如何配置;

完整工程代码,请移步 Github 下载。后续会结合 spring-cloud 中的 Eureka 组件再次学习和分享使用 spring-boot-admin

配置 Admin Server

为了学习和验证 Spring Boot Admin 的使用,我创建了一个 Admin-Server工程即 ms-admin,创建了两个 Admin-Client 工程即 ms-userms-admin-client,工程结构如下图:

ms-userms-admin-client 不同点在于:ms-user 使用了 spring-boot-security 模块,而 ms-admin-client 没有使用 spring-boot-security 模块,是一个相对比较简单的 SpringBoot 服务。

1、配置 ms-admin

在该 module 的 properties 文件中,配置如下:

1
2
3
4
5
spring.application.name=Admin-Server
# ---------------------------------
# 配置该服务的独立端口
# ---------------------------------
server.port=8087

注意:该服务的端口为 8087

该 module 的 pom 文件,使用了 spring-boot 版本为 2.2.6.RELEASEspring-boot-admin 版本为 2.2.1,这里一定要注意版本的匹配,否则工程运行会存在各种奇葩问题。这里教大家一个方法,如果你不知道如何匹配版本,直接使用 spring initializr 创建工程,然后下载创建的工程,看一下里面的 pom文件中各个模块的版本号就可以了。

修改一下启动类,增加 @EnableAdminServer 注解,如下:

1
2
3
4
5
6
7
8
9
10
11
12
import de.codecentric.boot.admin.server.config.EnableAdminServer;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@EnableAdminServer
@SpringBootApplication
public class MZAdminApplication {

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

2、配置 ms-admin-client

在该 module 的 properties 文件中,配置如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
spring.application.name=Admin-Client
server.port=8083

# ------------------------
# Actuator config
# ------------------------
# 可以访问任意控制点
management.endpoints.web.exposure.include=*

# ------------------------------------------
# 配置 spring boot admin
# ------------------------------------------
spring.boot.admin.client.url=http://localhost:8087
management.endpoint.health.show-details=always

注意:该服务的端口为 8083。如果 admin-client 和 admin-server 没有部署在同一台服务器,这里的spring.boot.admin.client.url 一定要写上 admin-server 所在服务器的ip地址。

在该 module 的 pom 文件中,引入如下依赖即可,如下:

1
2
3
4
5
6
7
8
9
10
11
<!-- springboot admin client -->
<dependency>
<groupId>de.codecentric</groupId>
<artifactId>spring-boot-admin-client</artifactId>
<version>2.2.1</version>
</dependency>

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>

其余的不需要修改任何东西。

3、启动验证

分别启动 ms-adminms-admin-client,启动成功后,在浏览器中打开 http://localhost:8087 就可以看到如下效果,可以看到 ms-admin-client 被发现了。

点进去,可以看到 ms-admin-client 的运行状况。大家可以自己试试,我就不截图了。

配置带 security 的 Admin-Client

上面我们说了,ms-user 也是一个 Admin-Client,我也希望他能被监控和管理,但是 ms-user 有点特殊它使用了 security 模块,那么如何让他被 Admin-Server 发现呢,我们接着往下看。

PSms-user 模块其实是我之前一直在 微服务相关文章 中使用的工程模块,这里只是重构了一下工程结构并且修改了一下名称而已。

因为 ms-user 包含了比较多的内容,其 pom 文件也相对复杂一些,这里粘贴一部分(MySQL和Swagger相关配置就不写了)。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
spring.application.name=User-Server

# ------------------------
# Actuator config
# ------------------------
# 可以访问任意控制点
management.endpoints.web.exposure.include=*
# 配置独立的端口
management.server.port=1012
# 自定义访问控制点的路径
management.endpoints.web.base-path=/monitor
management.endpoint.shutdown.enabled=true

# -----------------------------------------------
# Spring Security Default user name and password
# -----------------------------------------------
spring.security.user.name=admin
spring.security.user.password=admin
spring.security.user.roles=ACTUATOR_ADMIN

# ------------------------------------------
# 配置 spring boot admin
# ------------------------------------------
spring.boot.admin.client.url=http://localhost:8087
management.endpoint.health.show-details=always
# 告诉admin-server用户名和密码,否则监控不到
spring.boot.admin.client.instance.metadata.user.name=${spring.security.user.name}
spring.boot.admin.client.instance.metadata.user.password=${spring.security.user.password}

这里要特别注意, ms-user 使用了security并且设置了用户名和密码,一定要告诉 Admin-Server,否则无法被监控到。也就是说如下的配置必须写:

1
2
3
# 告诉admin-server用户名和密码,否则监控不到
spring.boot.admin.client.instance.metadata.user.name=${spring.security.user.name}
spring.boot.admin.client.instance.metadata.user.password=${spring.security.user.password}

紧接着我们启动 ms-user 这个服务,刷新一下浏览器,效果如下图:

可以看到 ms-user 这个服务被如愿以偿的发现了。

Admin-Server 使用 security

ms-admin 的 pom 文件中引入 security 模块,如下:

1
2
3
4
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>

修改 properties 文件,增加用户名和密码的配置,完整配置如下:

1
2
3
4
5
6
7
8
9
10
11
spring.application.name=Admin-Server
# ---------------------------------
# 配置该服务的独立端口
# ---------------------------------
server.port=8087

# ---------------------------------
# security 配置
# ---------------------------------
spring.security.user.name=admin
spring.security.user.password=admin

配置完成后,我们分别重新启动一下 ms-adminms-admin-client 这两个服务。

再次打开 localhost:8087,会出现如下界面:

输入在 properties 文件中配置的用户名和密码,这里我配置的用户名和密码都是 admin,你也可以配置其他的。

输入之后可以看到如下界面,再次输入上面的用户名和密码即可。

初次进入显示效果如下截图,居然没有发现 ms-admin-client 这个服务。

这是因为没有在客户端配置进入 Admin-Server 的密码,安排上。

ms-admin-client 的 properties 中配置,如下:

1
2
3
4
5
6
7
8
# ------------------------------------------
# 配置 spring boot admin
# ------------------------------------------
spring.boot.admin.client.url=http://localhost:8087
management.endpoint.health.show-details=always
# 配置 admin server 的用户名和密码,否则注册不上
spring.boot.admin.discovery.instances-metadata.user.name=${spring.security.user.name}
spring.boot.admin.discovery.instances-metadata.user.password=${spring.security.user.password}

同理,在 ms-user 的配置文件 properties 中也增加相关的配置即可。

记得继承自 WebSecurityConfigurerAdapter 写一个配置类,可以参考 SpringBootAdminServerApplication 示例代码,不然客户端有可能无法注册成功。

重新启动 ms-admin 服务然后登录进去再启动客户端,就可以看到如下界面:

另外,Admin-Server 还可以集成 spring-boot-starter-mail 模块再简单的配置一下,就可以实现发送邮件的功能,这样服务的运行状态可以及时通知到对应的收件人了。


面朝大海,春暖花开。尚拙能成才,你没有比别人聪明,你只是更加努力罢了~


本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。

veryitman