spring actuator-service discovery-/health“description”:“发现客户端未初始化”,“status”:“未知”

blmhpbnm  于 2021-07-06  发布在  Java
关注(0)|答案(1)|浏览(1278)

有关使用spring boot actuator进行服务发现的问题,请结合spring cloud kubernetes。
目前,我有一个web应用程序,它同时具有actuator和spring-boot-kubernetes依赖项。我也在使用kubernetes提供的发现客户端,一切正常。
然而,当我 curl 我的健康端点时,我确实看到了那些奇怪的陈述:

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 无关,与领事等无关。
非常感谢

xmd2e60i

xmd2e60i1#

同样的问题,我注意到 org.springframework.cloud.client.discovery.health.DiscoveryClientHealthIndicator 有它的 discoveryInitialized 字段设置为 false . 这是因为没有人触发 InstanceRegisteredEvent 在应用程序上下文中。通常事件应该从 start() 所谓的“注册”方法——负责在服务注册中心注册当前应用程序示例的bean,例如。 EurekaAutoServiceRegistration 如果是Eureka 。
关键是kubernetes本身不是一个服务注册中心,它不需要显式注册(因为由于编排的性质,它中的每个pod在默认情况下都是“注册的”)。这就是为什么springcloudkubernetes在默认情况下不向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 在代码中的某个地方,但请确保在应用程序实际准备好使用发现客户机时执行此操作。

相关问题