如何为Spring Boot Admin添加自定义Actuator端点至新标签页?求参考示例
嘿,这个需求我刚好折腾过,给你梳理下靠谱的实现方式,附带具体示例,绝对比找那个停用的applications-activiti组件管用~
核心实现步骤:客户端注册自定义端点 + 服务器端扩展SBA UI
一、客户端侧:注册并暴露自定义Actuator端点
首先得确保你的自定义端点能被Actuator正常对外提供服务:
- 编写自定义端点类
用Spring Boot的@Endpoint注解创建你的自定义端点,添加需要的操作(比如@ReadOperation用于GET请求):
@Endpoint(id = "custom-business") public class CustomBusinessEndpoint { @ReadOperation public Map<String, Object> getBusinessMetrics() { Map<String, Object> metrics = new HashMap<>(); metrics.put("online-users", 156); metrics.put("pending-orders", 23); metrics.put("system-load", 0.78); metrics.put("last-refresh", LocalDateTime.now().format(DateTimeFormatter.ISO_LOCAL_DATE_TIME)); return metrics; } }
- 注册为Bean并暴露
把这个端点类注册成Spring Bean,然后在配置文件里暴露它:
@Configuration public class ActuatorConfig { @Bean public CustomBusinessEndpoint customBusinessEndpoint() { return new CustomBusinessEndpoint(); } }
在application.properties里添加:
# 暴露自定义端点,同时保留默认的健康、信息端点 management.endpoints.web.exposure.include=health,info,custom-business
二、服务器侧:给SBA添加新标签页
现在官方推荐用通用的UI扩展机制,替代了旧的applications-activiti这类特定组件,下面两种方式任选:
方式1:轻量快速实现(直接展示JSON)
适合只需要查看端点数据,不需要定制UI的场景:
- 引入SBA UI自定义器依赖(Maven为例)
<dependency> <groupId>de.codecentric</groupId> <artifactId>spring-boot-admin-server-ui</artifactId> </dependency> <dependency> <groupId>de.codecentric</groupId> <artifactId>spring-boot-admin-server-ui-customizer</artifactId> </dependency>
- 创建UI配置类,添加新标签页
import de.codecentric.boot.admin.server.ui.config.AdminServerUiCustomizer; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class SbaUiExtensionConfig { @Bean public AdminServerUiCustomizer customTabCustomizer() { return ui -> { // 参数分别是:视图ID、标签显示名称、图标(用Font Awesome图标名)、端点路径 ui.addView("custom-business", "业务监控", "icon-bar-chart", "/instances/{id}/actuator/custom-business"); }; } }
重启SBA服务器后,进入任意应用的详情页,就能看到新增的「业务监控」标签,点击直接展示自定义端点返回的JSON数据。
方式2:定制化UI展示(美化页面)
如果想要更友好的展示效果,比如表格、卡片样式,可以自定义Thymeleaf模板:
- 创建自定义模板文件
在SBA服务器项目的src/main/resources/META-INF/spring-boot-admin-server-ui/views/目录下创建custom-business.html:
<!DOCTYPE html> <html xmlns:th="http://www.thymeleaf.org"> <head> <title>业务监控</title> <th:block th:replace="fragments/header :: header"/> </head> <body> <div class="container-fluid"> <th:block th:replace="fragments/navigation :: navigation"/> <div class="row mt-4"> <div class="col-md-3 mb-3"> <div class="card text-center"> <div class="card-header bg-primary text-white">在线用户数</div> <div class="card-body"> <h3 th:text="${businessMetrics['online-users']}"></h3> </div> </div> </div> <div class="col-md-3 mb-3"> <div class="card text-center"> <div class="card-header bg-warning text-white">待处理订单</div> <div class="card-body"> <h3 th:text="${businessMetrics['pending-orders']}"></h3> </div> </div> </div> <div class="col-md-3 mb-3"> <div class="card text-center"> <div class="card-header bg-info text-white">系统负载</div> <div class="card-body"> <h3 th:text="${businessMetrics['system-load']}"></h3> </div> </div> </div> <div class="col-md-3 mb-3"> <div class="card text-center"> <div class="card-header bg-secondary text-white">最后刷新时间</div> <div class="card-body"> <p th:text="${businessMetrics['last-refresh']}"></p> </div> </div> </div> </div> </div> <th:block th:replace="fragments/footer :: footer"/> </body> </html>
- 创建控制器处理视图请求
编写一个控制器,从应用的Actuator端点获取数据,传递给模板:
import de.codecentric.boot.admin.server.domain.entities.Instance; import de.codecentric.boot.admin.server.domain.entities.InstanceRepository; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.client.RestTemplate; @Controller public class CustomBusinessViewController { private final InstanceRepository instanceRepository; private final RestTemplate restTemplate; public CustomBusinessViewController(InstanceRepository instanceRepository, RestTemplate restTemplate) { this.instanceRepository = instanceRepository; this.restTemplate = restTemplate; } @GetMapping("/instances/{id}/custom-business") public String showBusinessMetrics(@PathVariable String id, Model model) { // 从SBA的实例仓库获取目标应用的Actuator基础URL Instance instance = instanceRepository.findById(id) .orElseThrow(() -> new IllegalArgumentException("实例不存在:" + id)); String actuatorBaseUrl = instance.getRegistration().getServiceUrl() + "/actuator"; String customEndpointUrl = actuatorBaseUrl + "/custom-business"; // 请求自定义端点获取数据 Map<String, Object> businessMetrics = restTemplate.getForObject(customEndpointUrl, Map.class); model.addAttribute("businessMetrics", businessMetrics); return "custom-business"; } }
- 修改UI配置里的路径
把之前AdminServerUiCustomizer里的路径改成控制器的路径:
ui.addView("custom-business", "业务监控", "icon-bar-chart", "/instances/{id}/custom-business");
重启后,点击标签页就能看到美化后的业务监控页面了。
靠谱的参考资料
- Spring Boot Admin官方文档的「Customizing the UI」章节,详细讲解了所有UI扩展方式,包括添加视图、自定义模板、扩展静态资源等。
- 官方GitHub仓库里的
spring-boot-admin-samples模块,其中spring-boot-admin-sample-custom-ui是专门的自定义UI示例,完全贴合你的需求,可以直接参考代码。
补充:那个
applications-activiti确实是旧版本的特定组件,现在已经被官方的通用扩展机制替代了,上面的方案都是官方维护的,不会有停用风险。
内容的提问来源于stack exchange,提问作者Varesh
相关产品推荐
相关产品推荐

