有关使用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 无关,与领事等无关。
非常感谢
1条答案
按热度按时间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
课程:但请不要过分依赖它,因为它很可能会在框架的未来版本中被删除。
作为替代,您可以发射
InstanceRegisteredEvent
在代码中的某个地方,但请确保在应用程序实际准备好使用发现客户机时执行此操作。