有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java Spring执行器服务发现/运行状况“说明”:“发现客户端未初始化”,“状态”:“未知”

有关使用Spring Boot Actuator和Spring Cloud Kubernetes进行服务发现的问题,请回答

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

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

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"]}*

请问为什么是“未知”?我本以为这里的三个选项中至少有一个能说明问题,而且肯定不是“发现客户端未初始化”

我忘记初始化什么了吗?注册什么?要配置什么

顺便说一句,这确实是一个关于库伯内特斯发现的问题。与尤里卡无关,与领事等无关

非常感谢


共 (1) 个答案

  1. # 1 楼答案

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

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

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

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

    但是请不要过度依赖它,因为它可能会在框架的后续版本中被删除

    作为替代方案,您可以自己从代码中的某个地方发出InstanceRegisteredEvent,但请确保在应用程序实际准备好使用discovery client时发出