用于发现 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 {
}
我正在尝试构建自己的 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 中,特别是那些在其他图书馆。
类似于
我看到你的 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 {
}