微服务架构之Spring Boot(八十二)

2022-05-23 15:46:45 浏览数 (1)

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("/*");

};

}

0 人点赞