服务监控
系统使用 Spring Boot Admin 和 SkyWalking 实现后端服务的监控。
# 1. Spring Boot Admin
阅读 《芋道 Spring Boot 监控工具 Admin 入门》 (opens new window) 文章,入门 Spring Boot Admin。
注意,Spring Boot Admin 是内嵌在 yudao-infra-server 服务中,无需单独启动。
# 1.1 如何配置?
① 【开启 Spring Boot Admin Client 客户端】修改 yudao-spring-boot-starter-monitor 模块的 pom.xml 依赖,将如下依赖打开(去掉 <optional>true</optional> 部分):
<dependency>
<groupId>de.codecentric</groupId>
<artifactId>spring-boot-admin-starter-client</artifactId> <!-- 实现 Spring Boot Admin Client 客户端 -->
</dependency>
② 【开启 Spring Boot Admin Server 服务端】修改 yudao-module-infra-server 服务的 pom.xml 依赖,将如下依赖打开(去掉注释):
<dependency>
<groupId>de.codecentric</groupId>
<artifactId>spring-boot-admin-starter-server</artifactId> <!-- 实现 Spring Boot Admin Server 服务端 -->
</dependency>
③ 将 AdminServerConfiguration 类上的 @EnableAdminServer 注解。
之后,使用 IDEA 刷新下 Maven 依赖!!!
# 1.2 如何使用?
::: tip:默认登录账号、密码都是 admin
如果需要修改 Spring Boot 配置文件中,spring.boot.admin.client.username 和 spring.boot.admin.client.password 配置项(对应的 AdminServerConfiguration 配置类)。
注意:生产环境下,一定要修改登录账号、密码!!!并且只允许内网访问,参见 《生产环境安全》 文档。 :::
① 访问 http://127.0.0.1:48080/admin/applications (opens new window) 地址,可以在 Spring Boot Admin 中,查看到应用与实例的列表。如下图所示:

② 点击 yudao-server 应用,再点击实例,可以查看到该实例的细节信息。如下图所示:

③ 点击 [日志 -> 日志文件] 菜单,查看该示例的日志内容。如下图所示:

点击 [日志 -> 日志文件] 菜单,可动态修改 Logger 的日志级别,方便排查线上的某些 BUG。如下图所示:

补充说明:也可以通过前端的 [基础设施 -> 监控中心 -> Java 监控] 菜单。
前端 [基础设施 -> 监控中心 -> Java 监控] 菜单,通过 iframe 内嵌后端 /admin/applications 路径。
如果你想自定义地址,可以前往 [基础设置 -> 配置管理] 菜单,设置 key 为 url.spring-boot-admin 配置项。
# 1.3 常见问题?
# 1.3.1 如何开启登录?
项目已经内置 Spring Boot Admin 的登录认证,无需额外开发。
启用 Spring Boot Admin Server 后,infra-server 中的 AdminServerConfiguration 配置类为 spring.boot.admin.context-path(默认 /admin)下的路径,注册了一个独立的 Spring Security 过滤链,不影响项目原有的 Token 认证:
- 浏览器访问时,使用表单登录。
- Admin Client 注册时,使用 HTTP Basic 认证。
- 账号、密码读取
spring.boot.admin.client.username、spring.boot.admin.client.password配置项,未配置时都是admin。
生产环境下,建议:
① 修改上述账号、密码为强密码,通过环境变量或 Nacos 注入,不要写在代码仓库中。
② /admin 只允许内网或 VPN 访问。注意,Gateway 有一条 Path=/admin/** 的路由转发到 infra-server,所以公网 Nginx 不能把 /admin 转发给网关。
③ 修改 spring.boot.admin.frame-ancestors 配置项为管理后台的域名,保证 [基础设施 -> 监控中心 -> Java 监控] 菜单的 iframe 可以嵌入。
注意,spring.boot.admin.client.enabled: false 只是停止 Client 注册,不会关闭 Server 和 /admin 页面。不需要 Server 时,保持 spring-boot-admin-starter-server 依赖和 @EnableAdminServer 注解为注释状态即可。
更多公网部署的注意点,可见 《生产环境安全》 文档。
# 1.3.2 prod 生产环境下,后端部署多个 JVM 进程时,spring.boot.admin.client.url 填写哪个 IP?
- 第一步,在 Nginx 中配置
/admin路径,转发到多个 JVM 的 IP 上,使用backup(opens new window) 参数实现主备。注意,该转发只允许内网访问,避免安全问题!!! - 第二步,设置
spring.boot.admin.client.url配置项,为 Nginx 的内置 IP/admin地址。
# 1.3.3 Spring Boot Admin Server 是否可以独立?
确实,也是非常推荐 Spring Boot Admin Server 的。推荐阅读 《芋道 Spring Boot 监控工具 Admin 入门》 (opens new window) 文章,单独搭建 Spring Boot Admin Server 服务端。
然后,参考「1.3.2」问题,将 spring.boot.admin.client.url 配置项,为 Spring Boot Admin Server 的地址即可。
当然,原本项目只需要引入 spring-boot-admin-starter-client 依赖,不用引入 spring-boot-admin-starter-server 依赖!!!
# 1.3.4 Spring Boot Admin 存在 CORS 跨域问题!
如果使用 http://127.0.0.1:48080/admin/applications (opens new window) 访问时,它会存在跨域问题,类似 https://wx.zsxq.com/dweb2/index/topic_detail/1522481281485252 (opens new window) 反馈。
目前的解决方案,使用 http://127.0.0.1:48082/admin/applications (opens new window) 替代,不经过 Spring Cloud Gateway 转发。
未来的解决方案,可能会考虑把 Spring Boot Admin 从 infra 服务独立出去,作为一个纯粹的监控服务。
产生的原因是,在访问 infra 服务的 admin/instances/6af44c477baf/actuator/metrics 时,会返回多个 Access-Control-Allow-Origin 头,导致浏览器报 has been blocked by CORS policy: The 'Access-Control-Allow-Origin' header contains multiple values 错误。
进一步分析,因为 Spring Boot Admin 在 infra 服务中,它自己有跨域处理,然后请求别的 system 等服务获取监控数据的时候,又做了一次跨域处理,导致重复了!!!
# 2. SkyWalking
阅读 《芋道 SkyWalking 极简入门》 (opens new window) 文章,入门 SkyWalking。
注意,SkyWalking 需要单独启动,预计需要 4 核 8G 的硬件资源。
# 2.1 如何配置?
① 修改 yudao-spring-boot-starter-monitor 模块的 pom.xml 依赖,将如下依赖打开(去掉 <optional>true</optional> 部分):
<!-- 监控相关 -->
<dependency>
<groupId>io.opentracing</groupId>
<artifactId>opentracing-util</artifactId>
</dependency>
<dependency>
<groupId>org.apache.skywalking</groupId>
<artifactId>apm-toolkit-trace</artifactId>
</dependency>
<dependency>
<groupId>org.apache.skywalking</groupId>
<artifactId>apm-toolkit-logback-1.x</artifactId>
</dependency>
<dependency>
<groupId>org.apache.skywalking</groupId>
<artifactId>apm-toolkit-opentracing</artifactId>
</dependency>
② 修改所有 logback-spring.xml 日志配置中,添加 SkyWalking 收集日志的 appender 配置。如下图所示:

【可选】补充说明:
默认情况下,控制台 STDOUT 和 FILE 的 Appender 日志输出,是不带 tid 链路追踪编号。
可以参考 SKYWALKING Appender 的 encoder 部分的配置,添加上 LayoutWrappingEncoder、TraceIdPatternLogbackLayout 部分,就是如下:
<encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
<layout class="org.apache.skywalking.apm.toolkit.log.logback.v1.x.TraceIdPatternLogbackLayout">
<pattern>[%tid] ${FILE_LOG_PATTERN}</pattern>
</layout>
</encoder>
<pattern>里面的重点是[%tid]部分,并且要写对CONSOLE_LOG_PATTERN或FILE_LOG_PATTERN噢!!!
③ 修改 SkyWalking 在前端项目的 [基础设施 -> 监控中心 -> 链路追踪] 对应的 skywaling/index.vue (opens new window) 文件,调整为你 SkyWalking 的访问地址。如下图所示:

# 2.2 如何使用?
① 点击 [基础设施 -> 监控中心 -> 链路追踪] 菜单,可以看到 SkyWalking 提供的链路追踪。如下图所示:

② 点击 yudao-server 服务,查看该服务的监控信息。如下图所示:

补充说明:
前端 [基础设施 -> 监控中心 -> 链路追踪] 菜单,通过 iframe 内嵌 http://skywalking.iocoder.cn 路径。
如果你想自定义地址,可以前往 [基础设置 -> 配置管理] 菜单,设置 key 为 url.skywalking 配置项。
# 3. 更多监控系统
# 3.1 Prometheus
参见 《芋道 Prometheus + Grafana + Alertmanager 极简入门 》 (opens new window) 文章。
注意,修改项目的 yudao-spring-boot-starter-monitor 模块的 pom.xml 依赖,将如下依赖打开(去掉 <optional>true</optional> 部分):
<!-- Micrometer 对 Prometheus 的支持 -->
<dependency>
<groupId>io.micrometer</groupId>
<artifactId>micrometer-registry-prometheus</artifactId>
<optional>true</optional>
</dependency>
# 3.2 ELK
参见 芋道 ELK(Elasticsearch + Logstash + Kibana) 极简入门 (opens new window) 文章。