0

有关使用 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 等无关。

非常感谢

4

1 回答 1

2

有同样的问题,我注意到org.springframework.cloud.client.discovery.health.DiscoveryClientHealthIndicator它的discoveryInitialized字段设置为false. InstanceRegisteredEvent这是因为没有人在应用程序上下文中触发 an 。通常应该从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自己从代码的某个位置发出,但请确保在应用程序实际准备好与发现客户端一起使用时执行此操作。

于 2020-12-16T05:46:15.187 回答