微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

SpringBoot Actuator 被同一端口上的 BaseService Servlet 所掩盖

如何解决SpringBoot Actuator 被同一端口上的 BaseService Servlet 所掩盖

我们正在尝试将我们现有的 Spring WebServices 应用程序迁移到 SpringBoot,但遇到了一个问题,我们寻求您的建议。

我们有一个基本服务 Servlet,出于安全原因,该 Servlet 会在部署应用程序的端口上禁用 GET,该 Servlet 返回 501 未实现的响应,如下所示:

 @Override
    protected void doGet(HttpServletRequest request,HttpServletResponse response) throws servletexception,IOException {
        log.warn("GET request received!");
        response.setStatus(HttpServletResponse.SC_NOT_IMPLEMENTED);
    }
public abstract class BaseServiceServlet extends HttpServlet {
 ...
 } 
  
 public class ServiceServlet extends BaseServiceServlet {
 ...
 } 
  
  
  public class Servletinitializer extends SpringBootServletinitializer implements ServletContextinitializer { 
  @Override
    public void onStartup(ServletContext container) throws servletexception {
         
      ServletRegistration.Dynamic application = container
                .addServlet("ServiceServlet",new ServiceServlet()); 
      application.setLoadOnStartup(2);
      application.addMapping("/*");
        
    }
 }

以前,我们实施了一个老式的 HealthCheck JSP。随着迁移到 SpringBoot,我们现在使用的是 SpringBoot Actuator。

但是我们发现,如果我们在尝试监控健康状况时将 Actuator 健康监控端口设置为与应用程序相同的端口,我们会得到 501 Unimplemented 响应。

配置如下:

# Spring-Boot Embedded Tomcat Config
server.port=8080
server.connection-timeout=10s
server.ssl.enabled=false
## Springboot based health monitor
management.endpoints.enabled-by-default=true
management.endpoint.health.enabled=true
management.endpoint.loggers.enabled=true
management.endpoints.web.cors.allowed-methods=GET
management.endpoint.beans.cache.time-to-live=20s
management.endpoints.web.base-path=/manage
management.server.port=8080
management.security.enabled=false 

我们可以解决这个问题的一种方法是将执行器健康检查端口更改为其他有效的端口。

问题: 我们如何将执行器端口设置为与应用程序相同,并使执行器健康检查 url 类似于 http://localhost:8080/manage/health 不返回 501 Unimplemented from the Base Service Servlet?

解决方法

我们可以在 DispatcherServlet 之前在映射中向健康端点注册 ServiceServlet

@SpringBootApplication
public class ServletInitializer extends SpringBootServletInitializer implements ServletContextInitializer {
    @Autowired
    private DispatcherServlet dispatcherServlet;

    @Override
    public void onStartup(ServletContext container) throws ServletException {
        ServletRegistration.Dynamic dispatcher =
                container.addServlet("dispatcher",dispatcherServlet);
        dispatcher.setLoadOnStartup(1);
        dispatcher.addMapping("/manage","/manage/health");

        ServletRegistration.Dynamic application = container
                .addServlet("ServiceServlet",new ServiceServlet());
        application.setLoadOnStartup(2);
        application.addMapping("/*");
    }
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。