Пользовательский DiscoveryClient для обнаружения сервера Spring Cloud Config - PullRequest
0 голосов
/ 24 апреля 2020

Я пытаюсь создать свой собственный DiscoveryClient, который бы использовал Docker Swarm в качестве источника службы. Я уже работал с Spring Cloud Gateway и Spring Cloud Loadbalancer. Однако, когда я попытался использовать его для обнаружения configserver, установив spring.cloud.config.discovery.enabled=true, я получаю следующую ошибку

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 не загружаются в ОТЧЕТ О ОЦЕНКЕ УСЛОВИЙ особенно те, что есть в других библиотеках.

Подобно Обнаружение Spring Spring сначала вообще не работает , но они используют Eureka, тогда как я пытаюсь определить, как создать свой собственный клиент DiscoveryClient.

Ответы [ 2 ]

0 голосов
/ 25 апреля 2020

Был отдельный набор org.springframework.boot.autoconfigure.EnableAutoConfiguratio элементов в spring.factory, называемый org.springframework.cloud.bootstrap.BootstrapConfiguration

Поэтому я добавил это

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

И этот класс

@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 {
}
0 голосов
/ 24 апреля 2020

Я вижу, что ваш Класс конфигурации для DiscoveryClient содержит следующие аннотации:

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

Возможно, эти параметры не включены? Вы упомянули, что вы включили обнаружение , но вы не упоминаете другие конфигурации ConditionOnX. Если они не включены, компонент не будет загружен.

...