Spring Kubernetes探针:实现多组件探针的最佳方式

Scenario

我想使用原生的Spring Boot机制来实现Kubernetes的就绪性和有效性探测。官方资料指出,应用程序的可用性状态应该通过发布事件来改变,例如

AvailabilityChangeEvent.publish(this.eventPublisher, this, ReadinessState.REFUSING_TRAFFIC);

然后Spring将确保在/readiness端点中反映这一点。

现在让我们假设我有一个具有多个组件的应用程序,这些组件可以影响准备度。仅仅使用这个建议的事件机制,下面的场景将无法工作。

  1. 组件A发布了 “REFUSING_TRAFFIC”–>应用程序应该变得不就绪。
  2. 组件B发布了 “REFUSING_TRAFFIC” → 应用程序仍未准备好
  3. 组件A发布了 “ACCEPTING_TRAFFIC”–>应用程序仍未就绪,因为组件B仍未就绪。

但是在目前的实现中,只有一个全局状态,所以一旦组件A发布了 “ACCEPTING_TRAFFIC”,应用程序就会再次准备好(即使组件B还没有发布 “ACCEPTING_TRAFFIC”)。

我可能的想法

实现这一目标的最好和最干净的方法是什么?我有以下想法。

  1. 覆盖端点(例如用健康组),并为每个应该影响就绪性或活泼性的组件实现健康贡献者。
  2. 建立一个自定义的 “可用性监视器”,负责发布这些事件。然后实现自定义事件(例如 “ComponentAvailabilityChangeEvent”),它类似于Spring事件,但报告应用程序中特定组件的可用性。一旦一个组件不可用,自定义监视器将发布相应的Spring-native事件,而一旦所有组件都可用,监视器将负责发布全局可用性事件。

基本上想法1忽略了内置的Spring机制,并且会破坏使用`ApplicationAvailability’来获取应用程序状态的可能性,所以我认为这可能不是一个选项。

想法2对我来说是最好的方法,但我觉得我实现的东西是Spring应该可以原生做的,而且我好像复制了很多已经存在的行为(例如,自定义的ComponentAvailabilityChangeEvent几乎是Spring原生AvailabilityChangeEvent的副本)。

问题

你认为使用Spring的内置功能来实现这些探针的最佳和最简洁的方式是什么,但有可能在组件基础上影响可用性?

StackOverflow:java - SpringBoot - NumberFormatException on "favicon.ico" - Stack Overflow