You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring Boot中如何将第三方Servlet注册到与应用不同的端口

将第三方Servlet绑定到独立端口的实现方案

核心逻辑是通过Spring Boot的嵌入式容器扩展能力,创建独立的Servlet上下文监听专用端口,将需要隔离的第三方Servlet与主业务端口的请求链路完全拆分,效果和Spring Boot Actuator独立管理端口完全一致,适配K8s等基础设施对业务端口、监控端口分离的要求。


方案1:无Actuator依赖的原生实现

不需要引入额外组件,直接通过自定义嵌入式Web容器实现,适合没有接入Actuator的场景。

  1. 首先删除你之前在主上下文注册MetricsServlet的@Bean方法,避免Servlet被注册到主业务端口。
  2. 新增配置类,创建独立端口的嵌入式容器,仅绑定MetricsServlet:
import io.prometheus.client.exporter.MetricsServlet;
import io.prometheus.client.hotspot.DefaultExports;
import com.codahale.metrics.MetricRegistry;
import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.util.Collections;

@Configuration
public class IndependentMetricsPortConfig {

    // 自定义独立容器监听metrics端口,示例端口为9090,可自行注入配置文件参数
    @Bean
    public TomcatServletWebServerFactory metricsServletContainer() {
        TomcatServletWebServerFactory factory = new TomcatServletWebServerFactory();
        factory.setPort(9090);
        // 仅向该容器注册MetricsServlet,不加载主业务链路的任何Servlet、过滤器、拦截器
        factory.addContextCustomizers(context -> {
            MetricsServlet metricsServlet = new MetricsServlet(metricRegistry());
            context.addServletContainerInitializer((c, ctx) -> 
                ctx.addServlet("prometheusMetrics", metricsServlet).addMapping("/metrics"),
                Collections.emptySet()
            );
        });
        return factory;
    }

    // 原有MetricRegistry初始化逻辑保持不变
    @Bean
    public MetricRegistry metricRegistry() {
        MetricRegistry registry = new MetricRegistry();
        DefaultExports.initialize();
        // 自定义指标注册逻辑
        return registry;
    }
}

如果你用的嵌入式容器不是Tomcat,将TomcatServletWebServerFactory替换为对应容器的工厂类即可:Jetty对应JettyServletWebServerFactory,Undertow对应UndertowServletWebServerFactory,核心逻辑完全一致。


方案2:已接入Spring Boot Actuator的场景

如果项目已经引入Actuator,不需要自行创建额外容器,直接将第三方Servlet注册到Actuator的独立管理上下文即可,维护成本更低。

  1. 先在配置文件开启Actuator独立端口:
management:
  server:
    port: 9090 # 监控专用端口
  1. 新增管理上下文专属配置类,仅在Actuator的端口上下文注册MetricsServlet:
import io.prometheus.client.exporter.MetricsServlet;
import com.codahale.metrics.MetricRegistry;
import org.springframework.boot.actuate.autoconfigure.web.ManagementContextConfiguration;
import org.springframework.boot.web.servlet.ServletRegistrationBean;
import org.springframework.context.annotation.Bean;

@ManagementContextConfiguration
public class MetricsServletConfig {
    @Bean
    public ServletRegistrationBean<MetricsServlet> registerMetricsServlet(MetricRegistry metricRegistry) {
        return new ServletRegistrationBean<>(new MetricsServlet(metricRegistry), "/metrics");
    }
}
  1. 在项目启动类或者任意自动配置类上导入该配置:
@SpringBootApplication
@Import(MetricsServletConfig.class)
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

验证方式

启动项目后执行以下检查确认配置生效:

  • 访问主业务端口(默认8080)的/metrics路径返回404,说明指标接口未在业务端口暴露
  • 访问9090端口的/metrics路径正常返回Prometheus格式的指标数据
  • 系统端口监听列表中可以看到Java进程同时监听业务端口、监控端口两个端口,符合K8s等基础设施的端口隔离要求

内容的提问来源于stack exchange,提问作者gstackoverflow

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 10:06:36