61、Cloud Foundry 支持

当你部署到一个兼容 Cloud Foundry 的实例时,Spring Boot 的 Actuator 模块包含的其他支持将被激活。/cloudfoundryapplication 路径为所有 @Endpoint bean 提供了另外一个安全路由。

该扩展支持允许使用 Spring Boot Actuator 信息扩充 Cloud Foundry 管理 UI(例如可用于查看已部署应用的 Web 应用)。比如,应用程序状态页面可以包括完整的健康信息而不是常见的 running 或 stop 状态。

注意

常规用户无法直接访问 /cloudfoundryapplication 路径。为了能访问端点,你必须在请求时传递一个有效的 UAA 令牌。

61.1、禁用 Cloud Foundry Actuator 扩展支持

如果要完全禁用 /cloudfoundryapplication 端点,可以将以下设置添加到 application.properties 文件中:

application.properties

  1. management.cloudfoundry.enabled=false

61.2、Cloud Foundry 自签名证书

默认情况下,/cloudfoundryapplication 端点的安全验证会对各种 Cloud Foundry 服务进行 SSL 调用。如果你的 Cloud Foundry UAA 或 Cloud Controller 服务使用自签名证书,则需要设置以下属性:

application.properties

  1. management.cloudfoundry.skip-ssl-validation=true

61.3、自定义上下文路径

如果服务器的 context-path 已配置为 / 以外的其他内容,则 Cloud Foundry 端点将无法在应用程序的根目录中使用。例如,如果 server.servlet.context-path=/app,Cloud Foundry 端点将在 /app/cloudfoundryapplication/* 上可用。

如果你希望 Cloud Foundry 端点始终在 /cloudfoundryapplication/* 上可用,则无论服务器的 context-path 如何,你都需要在应用程序中明确配置它。配置因使用的 Web 服务器而有所不同。针对 Tomcat,可以添加以下配置:

  1. @Bean
  2. public TomcatServletWebServerFactory servletWebServerFactory() {
  3. return new TomcatServletWebServerFactory() {
  4. @Override
  5. protected void prepareContext(Host host,
  6. ServletContextInitializer[] initializers) {
  7. super.prepareContext(host, initializers);
  8. StandardContext child = new StandardContext();
  9. child.addLifecycleListener(new Tomcat.FixContextListener());
  10. child.setPath("/cloudfoundryapplication");
  11. ServletContainerInitializer initializer = getServletContextInitializer(
  12. getContextPath());
  13. child.addServletContainerInitializer(initializer, Collections.emptySet());
  14. child.setCrossContext(true);
  15. host.addChild(child);
  16. }
  17. };
  18. }
  19. private ServletContainerInitializer getServletContextInitializer(String contextPath) {
  20. return (c, context) -> {
  21. Servlet servlet = new GenericServlet() {
  22. @Override
  23. public void service(ServletRequest req, ServletResponse res)
  24. throws ServletException, IOException {
  25. ServletContext context = req.getServletContext()
  26. .getContext(contextPath);
  27. context.getRequestDispatcher("/cloudfoundryapplication").forward(req,
  28. res);
  29. }
  30. };
  31. context.addServlet("cloudfoundry", servlet).addMapping("/*");
  32. };
  33. }