60.过程监测
在 spring-boot 模块中,您可以找到两个类来创建通常对进程监视有用的文件:
ApplicationPidFileWriter 创建一个包含应用程序PID的文件(默认情况下,在应用程序目录中,文件名为 application.pid )。
WebServerPortFileWriter 创建一个包含正在运行的Web服务器端口的文件(默认情况下,在文件名为 application.port 的应用程序
目录中)。
默认情况下,这些编写器未激活,但您可以启用:
通过扩展配置
第60.2节“以编程方式”
60.1扩展配置
在 META-INF/spring.factories 文件中,您可以激活写入PID文件的侦听器,如以下示例所示:
org.springframework.context.ApplicationListener=
org.springframework.boot.context.ApplicationPidFileWriter,
org.springframework.boot.web.context.WebServerPortFileWriter
60.2以编程方式
您还可以通过调用 SpringApplication.addListeners(… ) 方法并传递相应的 Writer 对象来激活侦听器。此方法还允许您在 Writer 构造函数
中自定义文件名和路径。
61. Cloud Foundry支持
Spring Boot的执行器模块包括在部署到兼容的Cloud Foundry实例时激活的其他支持。/cloudfoundryapplication 路径为所有 @Endpoint
beans提供了另一条安全路线。
通过扩展支持,可以使用Spring Boot执行器信息扩充Cloud Foundry管理UI(例如可用于查看已部署应用程序的Web应用程序)。例如,应用
程序状态页面可以包括完整的健康信息,而不是典型的“运行”或“停止”状态。
常规用户无法直接访问 /cloudfoundryapplication 路径。为了使用端点,必须与请求一起传递有效的UAA令牌。
61.1禁用Extended Cloud Foundry Actuator支持
如果要完全禁用 /cloudfoundryapplication 端点,可以将以下设置添加到 application.properties 文件中:
application.properties。
management.cloudfoundry.enabled=false
61.2 Cloud Foundry自签名证书
默认情况下, /cloudfoundryapplication 端点的安全验证会对各种Cloud Foundry服务进行SSL调用。如果您的Cloud Foundry UAA或
Cloud Controller服务使用自签名证书,则需要设置以下属性:
application.properties。
management.cloudfoundry.skip-ssl-validation=true
61.3自定义上下文路径
如果服务器的上下文路径已配置为 / 以外的任何其他内容,则Cloud Foundry端点将不会在应用程序的根目录中可用。例如,如
果 server.servlet.context-path=/app ,Cloud Foundry端点将在 /app/cloudfoundryapplication/* 处可用。
如果您希望Cloud Foundry端点始终在 /cloudfoundryapplication/* 处可用,则无论服务器的上下文路径如何,您都需要在应用程序中明确
配置它。配置将根据使用的Web服务器而有所不同。对于Tomcat,可以添加以下配置:
@Bean
public TomcatServletWebServerFactory servletWebServerFactory() {
return new TomcatServletWebServerFactory() {
@Override
protected void prepareContext(Host host,
ServletContextInitializer[] initializers) {
super.prepareContext(host, initializers);
StandardContext child = new StandardContext();
child.addLifecycleListener(new Tomcat.FixContextListener());
child.setPath("/cloudfoundryapplication");
ServletContainerInitializer initializer = getServletContextInitializer(
getContextPath());
child.addServletContainerInitializer(initializer, Collections.emptySet());
child.setCrossContext(true);
host.addChild(child);
}
};
}
private ServletContainerInitializer getServletContextInitializer(String contextPath) {
return (c, context) -> {
Servlet servlet = new GenericServlet() {
@Override
public void service(ServletRequest req, ServletResponse res)
throws ServletException, IOException {
ServletContext context = req.getServletContext()
.getContext(contextPath);
context.getRequestDispatcher("/cloudfoundryapplication").forward(req,
res);
}
};
context.addServlet("cloudfoundry", servlet).addMapping("/*");
};
}