如何在 Swisscom Cloud 中使用 CloudFoundry 了解应用程序当前是否已停止? HeaderX-Cf-Routererror可靠吗?

How to find out if an app is currently stopped with CloudFoundry in Swisscom Cloud? Header X-Cf-Routererror reliable?

我们想向我们的 front-end 添加一个维护页面,该页面应该在 back-end 当前不可用(例如停止或部署)时出现。当应用程序不是 运行 时,将显示以下消息以及 404 状态代码:

404 Not Found: Requested route ('name.scapp.io') does not exist.

此外,存在 header,当应用程序停止时(并且仅在那时):

X-Cf-Routererror: unknown_route

如果应用程序不是 运行,是否可以可靠地添加此 header?如果是这种情况,我可以使用此标志来显示维护页面。


顺便说一下:如果应用程序不是 started/crashed,那么提供 5xx 状态代码不是更有意义吗?即停止的应用程序和错误的请求路由之间的区别?捕获 503 错误会容易得多,因为它不会干扰我们的业务逻辑(404 在应用程序内部使用)。

您看到的 404 错误由 CloudFoundrys 路由层生成并在上游维护。

通常,如果您不想收到此类错误消息,可以使用蓝绿部署。这是 CF 文档中的详细描述:https://docs.cloudfoundry.org/devguide/deploy-apps/blue-green.html

另一种选择是添加为您实现此功能的路由服务。请查看 CF 文档:https://docs.cloudfoundry.org/services/route-services.html

另一种选择是使用通配符路由。

https://docs.cloudfoundry.org/devguide/deploy-apps/routes-domains.html#create-an-http-route-with-wildcard-hostname

An application mapped to a wildcard route acts as a fallback app for route requests if the requested route does not exist.

因此,您可以将通配符路由映射到显示维护页面的静态应用程序。然后,如果映射到特定路由的应用程序已关闭或不可用,将显示维护页面而不是 404。

关于你的问题...

By the way: Wouldn't it make more sense to provide a 5xx status code if the application is not started/crashed, i.e. differ between stopped applications and wrong request routes? Catching a 503 error would be much easier, as it does not interfere with our business logic (404 is used inside the application).

GoRouter 维护一个路由列表,用于将传入请求映射到应用程序。如果你的应用程序挂了,那么路由 table 中没有路由,这就是你最终得到 404 的原因。如果你从 GoRouter 的角度考虑它,这是有道理的。没有路由,因此 return 是 404 Not Found。要使 503 有意义,GoRouter 必须知道该应用程序并知道它已关闭或没有响应。

我想如果您使用上面的通配符路由,您可能能够实现该行为,但不要显示维护页面,只需 return 一个 HTTP 503。

希望对您有所帮助!