Spring Actuator - 服务发现 - /health "description":"Discovery Client not initialized"

Posted

技术标签:

【中文标题】Spring Actuator - 服务发现 - /health "description":"Discovery Client not initialized","status":"UNKNOWN"【英文标题】:Spring Actuator - Service discovery - /health "description":"Discovery Client not initialized","status":"UNKNOWN" 【发布时间】:2021-03-04 11:10:45 【问题描述】:

关于使用 Spring Boot Actuator 进行服务发现的问题,请结合 Spring Cloud Kubernetes。

目前,我有一个 web 应用程序,它同时具有执行器和 spring boot kubernetes 依赖项。 我也在使用kubernetes提供的发现客户端,一切正常。

但是,当我卷曲我的健康端点时,我确实看到了那些奇怪的陈述:

discoveryComposite":"description":"Discovery Client not initialized","status":"UNKNOWN","components":"discoveryClient":"description":"Discovery Client not initialized","status":"UNKNOWN"

"reactiveDiscoveryClients":"description":"Discovery Client not initialized","status":"UNKNOWN","components":"Kubernetes Reactive Discovery Client":"description":"Discovery Client not initialized","status":"UNKNOWN"

Simple Reactive Discovery Client":"description":"Discovery Client not initialized","status":"UNKNOWN"

"readinessState":"status":"UP","refreshScope":"status":"UP","groups":["liveness","readiness"]*

请问为什么是“未知”?我本来希望这里至少有这三个中的一个,而不是“发现客户端未初始化”。

我忘了初始化什么吗?注册一些东西?配置一些东西?

顺便说一句,这确实是一个关于 Kubernetes 发现的问题。与 Eureka 无关,与 Consul 等无关。

非常感谢

【问题讨论】:

【参考方案1】:

遇到同样的问题,我注意到org.springframework.cloud.client.discovery.health.DiscoveryClientHealthIndicatordiscoveryInitialized 字段设置为false。这是因为没有人在应用程序上下文中触发InstanceRegisteredEvent。通常应该从所谓的“注册”的start() 方法触发事件 - 一个负责在服务注册表中注册当前应用程序实例的 bean,例如EurekaAutoServiceRegistration 在 Eureka 的情况下。

关键是 Kubernetes 本身并不是一个服务注册中心,它不需要显式注册(因为编排的性质,默认情况下,其中的每个 pod 都是“注册”的)。这就是为什么 Spring Cloud Kubernetes 默认什么都不做向 Kubernetes 注册应用程序实例的原因。

但是,org.springframework.cloud.kubernetes.registry.KubernetesAutoServiceRegistration 类可以通过简单地将消息发送到日志来“模拟”自动注册的过程。从v1.1.0 开始,这个类是@Deprecated,并且在其他地方的框架中没有使用。目前我看到使用它的唯一好处是它可以触发缺少的InstanceRegisteredEvent 来初始化DiscoveryClientHealthIndicator。您可以通过将以下 bean 声明添加到您的任何 @Configuration 类来使用它:

@Bean
public KubernetesAutoServiceRegistration kubernetesAutoServiceRegistration(
         ApplicationContext context, 
         KubernetesServiceRegistry registry,
         KubernetesRegistration registration) 
  return new KubernetesAutoServiceRegistration(context, registry, registration);

但请不要过度依赖它,因为它可能会在即将发布的框架版本中被删除。

作为替代方案,您可以自己在代码中的某个位置发出 InstanceRegisteredEvent,但请确保在应用程序实际准备好与发现客户端一起使用时执行此操作。

【讨论】:

这是一个很好的答案,谢谢!我刚刚升级到几小时前刚刚发布的 Ilford RC1。似乎它需要一些改变,因为它们在 Kubernetes 方面发生了变化。尝试 第一次试运行,新版好像不这样 无法注册在类路径资源 [org/springframework/cloud/kubernetes/fabric8/Fabric8AutoConfiguration$KubernetesActuatorConfiguration.class] 中定义的 bean 'kubernetesHealthIndicator'。已在类路径资源 [org/springframework/cloud/kubernetes/client/KubernetesClientAutoConfiguration$KubernetesActuatorConfiguration.class] 中定义了具有该名称的 bean,并且已禁用覆盖。 到目前为止,我看不出这个问题与我的答案有任何关系。但是我认为这是一个典型的框架升级问题:KubernetesActuatorConfiguration 类已移至“Ilford RC1”中的 fabric8 包,但您的目标目录仍包含一个 .class 文件,位于来自以前的版本。因此,Spring 在扫描类路径时会找到该类的两个版本,因此会因异常而失败。尝试清理目标目录(例如gradle cleanmvn clean 或在 IDE 中重建)并再次运行应用程序。 @PatPatPat,顺便说一句,我找到了您观察到的问题的根源 - 在 Ilford 版本中进行了重构,其中包被重命名。请参阅发行说明的this section。

以上是关于Spring Actuator - 服务发现 - /health "description":"Discovery Client not initialized"的主要内容,如果未能解决你的问题,请参考以下文章

SpringBoot2.x系列教程(七十)Spring Boot Actuator集成及自定义Endpoint详解

blog: Spring Boot - Actuator Web 访问开启

关于spring-boot-actuator的httptrace端点不生效问题解决办法

Spring Boot (27) actuator服务监控与管理

Spring Boot Actuator 2.0 使用

Spring Boot Admin对Springboot服务进行监控 Actuator