如何将Spring Boot Admin服务端与客户端合并部署为单个Spring Boot应用
Spring Boot Admin 与业务应用同进程拆分整合实现方案
(适配环境:Spring Boot 2.3.4.RELEASE、Spring Boot Admin 2.3.0)
实现效果
单应用启动后同时运行两类独立服务:
- 原有业务接口固定监听8080端口,原有访问逻辑不受影响
- Spring Boot Admin 控制台固定监听8081端口,独立提供监控能力
- 业务应用自动注册到内置的SBA实例,无需单独启动SBA服务、无需依赖外部启动脚本
第一步:引入匹配版本依赖
在业务应用的pom.xml中添加SBA核心依赖,注意版本与现有环境严格对应,避免兼容冲突:
- 引入SBA服务端依赖,承载监控控制台核心能力
<dependency> <groupId>de.codecentric</groupId> <artifactId>spring-boot-admin-starter-server</artifactId> <version>2.3.0</version> </dependency>
- 引入SBA客户端依赖,实现自身实例自动注册
<dependency> <groupId>de.codecentric</groupId> <artifactId>spring-boot-admin-starter-client</artifactId> <version>2.3.0</version> </dependency>
第二步:配置双端口拆分与访问隔离
Spring Boot默认仅支持单个Web端口,需要通过新增内嵌Tomcat连接器的方式,让8081端口专门承载SBA服务,同时配置过滤器隔离SBA路径,避免SBA服务在8080业务端口暴露。
新增配置类:
@Configuration public class AdminMultiPortConfig { // 业务应用固定端口,与原服务配置保持一致 @Value("${server.port:8080}") private int businessPort; // SBA专属运行端口 @Value("${admin.server.port:8081}") private int adminPort; /** * 为内嵌Tomcat新增8081端口连接器,专门承载SBA服务请求 */ @Bean public WebServerFactoryCustomizer<TomcatServletWebServerFactory> adminPortCustomizer() { return factory -> { Connector adminConnector = new Connector(TomcatServletWebServerFactory.DEFAULT_PROTOCOL); adminConnector.setPort(adminPort); factory.addAdditionalTomcatConnectors(adminConnector); }; } /** * 端口隔离过滤器:拦截业务端口上的SBA路径请求,仅允许8081端口访问SBA资源 */ @Bean public FilterRegistrationBean<Filter> adminAccessIsolateFilter() { FilterRegistrationBean<Filter> registration = new FilterRegistrationBean<>(); registration.setFilter((request, response, chain) -> { HttpServletRequest req = (HttpServletRequest) request; int currentRequestPort = req.getServerPort(); String requestPath = req.getRequestURI(); // 匹配SBA控制台的所有核心路径 boolean isAdminPath = requestPath.startsWith("/instances") || requestPath.startsWith("/applications") || requestPath.startsWith("/wallboard") || requestPath.startsWith("/journal") || requestPath.startsWith("/about") || requestPath.startsWith("/assets"); // 如果请求从业务8080端口访问SBA路径,直接返回404 if (currentRequestPort == businessPort && isAdminPath) { ((HttpServletResponse) response).sendError(HttpServletResponse.SC_NOT_FOUND); return; } chain.doFilter(request, response); }); registration.addUrlPatterns("/*"); registration.setOrder(Ordered.HIGHEST_PRECEDENCE); return registration; } }
第三步:开启SBA服务端能力
在业务应用的启动类上添加@EnableAdminServer注解,激活SBA服务端的控制台接口能力:
@SpringBootApplication @EnableAdminServer public class BusinessApplication { public static void main(String[] args) { SpringApplication.run(BusinessApplication.class, args); } }
第四步:配置自注册规则
在application.yml中补充客户端注册、actuator端点暴露的相关配置,注意注册地址要指向8081端口的SBA服务,避免注册失败:
server: # 业务应用主端口,与原配置保持一致 port: 8080 # SBA专属端口配置,与配置类保持对应 admin: server: port: 8081 spring: boot: admin: client: # 注册地址指向本地内置的SBA服务8081端口 url: http://localhost:8081 instance: # 注册上报的实例地址、端口填业务应用的8080端口,供SBA拉取actuator监控数据 service-host: localhost service-port: 8080 # 开启注册重试,避免启动顺序问题导致首次注册失败 auto-registration: true register-on-application-ready: true management: endpoints: web: exposure: # 开放所有actuator端点,供SBA拉取完整监控数据 include: "*" endpoint: health: show-details: always
落地注意事项
- 严禁直接将
server.port修改为8081,否则会导致原有业务应用的端口被替换,必须通过新增Tomcat连接器的方式拆分两个端口的服务 - 端口隔离过滤器是必加项,缺少该过滤器会导致8080业务端口可直接访问SBA控制台,无访问隔离效果
- 版本需严格匹配:Spring Boot 2.3.4.RELEASE对应SBA 2.3.0版本,跨版本搭配会出现类加载冲突、接口不兼容等启动报错问题
- 若出现实例注册失败,优先检查客户端配置的注册地址是否指向8081端口,确认本地防火墙未拦截8081端口的本地请求
内容的提问来源于stack exchange,提问作者Allen4Tech
相关产品推荐
相关产品推荐

