用于发现 Spring Cloud Config 服务器的自定义 DiscoveryClient

Custom DiscoveryClient for to discover Spring Cloud Config server

我正在尝试构建自己的 DiscoveryClient,它将使用 Docker Swarm 作为服务源。我已经在 Spring Cloud Gateway 和 Spring Cloud Loadbalancer 上使用它了。但是,当我尝试通过设置 spring.cloud.config.discovery.enabled=true 使用它来发现 configserver 时,出现以下错误

Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'org.springframework.cloud.client.discovery.DiscoveryClient' available: expected at l
east 1 bean which qualifies as autowire candidate. Dependency annotations: {}

我也创建了 AutoConfigure 类,但没有成功。项目在这里 https://github.com/trajano/spring-cloud-demo.

查看调试日志时,无论有无发现,似乎 AutoConfiguration bean 都没有加载到 CONDITIONS EVALUATION REPORT 中,特别是那些在其他图书馆。

类似于 但他们使用的是 Eureka,而我正在尝试确定如何构建我自己的 DiscoveryClient。

我看到你的 Configuration class for the DiscoveryClient 有这些注释:

@ConditionalOnDiscoveryEnabled
@ConditionalOnBlockingDiscoveryEnabled
@ConditionalOnDockerSwarmDiscoveryEnabled
@AutoConfigureAfter({
    DockerSwarmDiscoveryAutoConfiguration.class
})
@AutoConfigureBefore({
    SimpleDiscoveryClientAutoConfiguration.class,
    CommonsClientAutoConfiguration.class
})

会不会是那些设置没有启用? 你提到你启用了发现,但你没有提到其他 ConditionOnX 配置。 如果未启用它们,则不会加载 bean。

spring.factory 中有一组单独的 org.springframework.boot.autoconfigure.EnableAutoConfiguratio 元素,称为 org.springframework.cloud.bootstrap.BootstrapConfiguration

所以我添加了这个

org.springframework.cloud.bootstrap.BootstrapConfiguration=\
net.trajano.spring.swarm.discovery.DockerSwarmDiscoveryClientConfigServiceBootstrapConfiguration

还有这个class

@ConditionalOnClass(ConfigServicePropertySourceLocator.class)
@ConditionalOnProperty("spring.cloud.config.discovery.enabled")
@Configuration(proxyBeanMethods = false)
@Import({
    DockerSwarmDiscoveryClientAutoConfiguration.class,
    // this emulates
    // @EnableDiscoveryClient, the import
    // selector doesn't run before the
    // bootstrap phase
    DockerClientConfiguration.class,
    DockerSwarmDiscoveryAutoConfiguration.class,
    DockerSwarmReactiveDiscoveryClientAutoConfiguration.class,
    ReactiveCommonsClientAutoConfiguration.class
})
public class DockerSwarmDiscoveryClientConfigServiceBootstrapConfiguration {
}