1

spring-cloud-starter-vault-config用来从保险库中提取秘密。我可以使用 Config First Bootstrap 正常工作。当我尝试启用服务发现以便从领事获取保险库实例时,我收到一个错误:

Error creating bean with name 'vaultPropertySourceLocator' defined in class path resource [org/springframework/cloud/vault/config/VaultBootstrapPropertySourceConfiguration.class]: Unsatisfied dependency expressed through method 'vaultPropertySourceLocator' parameter 0
org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'org.springframework.cloud.client.discovery.DiscoveryClient' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {}

在启动的引导阶段,Consul 自动配置似乎根本没有启动。

我相信我已经在 bootstrap.yml 中设置了所有正确的属性

spring:
  application:
    name: my-app-name
  cloud:
    consul:
      discovery:
        enabled: true
      host: localhost
      port: 8500
    vault:
      discovery:
        enabled: true
        service-id: vault
      authentication: approle
      app-role:
        role-id: my-role-id
        secret-id: my-secret-id
      kv:
        enabled: true
        application-name: ${spring.application.name}
      fail-fast: true
      scheme: http

是否有我缺少的属性或注释在引导期间启用领事?

4

1 回答 1

0

由于您提到Config First Bootstrap ( https://cloud.spring.io/spring-cloud-config/multi/multi__spring_cloud_config_client.html#config-first-bootstrap ),这意味着您使用 Spring Cloud Config 而不是 Spring Cloud Consul Config?

如果是这样,您还需要包括

<dependency>
  <groupId>org.springframework.cloud</groupId>
  <artifactId>spring-cloud-consul-discovery</artifactId>
</dependency>

如果使用 Spring Cloud Consul Config 而不是 Spring Cloud Config(有关差异的讨论,请参阅 Spring Cloud config server vs consul?Spring Cloud Consul Config over Spring Cloud Config的区别),您可能仍然会遇到此问题。

以下是使用 Spring Cloud Consul Config 的情况:

没有提到 spring cloud 版本,但是查看 3.0.0 版本,我看到 spring.factories 用于自动配置的 bootstrap 部分不包含文件ConsulDiscoveryClientConfiguration。这是导出DiscoveryClient bean 的配置文件(ConsulDiscoveryClient 扩展了 DiscoveryClient)。

public class ConsulDiscoveryClientConfiguration {

  ...

  @Bean
  @ConditionalOnMissingBean
  public ConsulDiscoveryClient consulDiscoveryClient(ConsulClient consulClient,
      ConsulDiscoveryProperties discoveryProperties) {
    return new ConsulDiscoveryClient(consulClient, discoveryProperties);
  }

}

ConsulDiscoveryClientConfiguration包含在常规的 # Auto-Configuration 部分中,如下所示,但该阶段发生在 # Bootstrap Configuration 阶段之后。这些是相关的 spring.factories 文件

org/springframework/cloud/spring-cloud-vault-config/3.0.0/spring-cloud-vault-config-3.0.0.jar!/META-INF/spring.factories

# Auto-Configuration
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
org.springframework.cloud.vault.config.VaultReactiveAutoConfiguration,\
org.springframework.cloud.vault.config.VaultAutoConfiguration,\
org.springframework.cloud.vault.config.VaultHealthIndicatorAutoConfiguration

# Bootstrap Configuration
org.springframework.cloud.bootstrap.BootstrapConfiguration=\
org.springframework.cloud.vault.config.DiscoveryClientVaultBootstrapConfiguration,\
org.springframework.cloud.vault.config.ReactiveDiscoveryClientVaultBootstrapConfiguration,\
org.springframework.cloud.vault.config.VaultBootstrapConfiguration,\
org.springframework.cloud.vault.config.VaultReactiveBootstrapConfiguration,\
org.springframework.cloud.vault.config.VaultBootstrapPropertySourceConfiguration

# ConfigData Resolver
org.springframework.boot.context.config.ConfigDataLocationResolver=\
org.springframework.cloud.vault.config.VaultConfigDataLocationResolver

# ConfigData Loader
org.springframework.boot.context.config.ConfigDataLoader=\
org.springframework.cloud.vault.config.VaultConfigDataLoader

org/springframework/cloud/spring-cloud-consul-discovery/3.0.0/spring-cloud-consul-discovery-3.0.0.jar!/META-INF/spring.factories

# Auto-Configuration
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
org.springframework.cloud.consul.discovery.configclient.ConsulConfigServerAutoConfiguration,\
org.springframework.cloud.consul.serviceregistry.ConsulAutoServiceRegistrationAutoConfiguration,\
org.springframework.cloud.consul.serviceregistry.ConsulServiceRegistryAutoConfiguration,\
org.springframework.cloud.consul.discovery.ConsulDiscoveryClientConfiguration,\
org.springframework.cloud.consul.discovery.reactive.ConsulReactiveDiscoveryClientConfiguration,\
org.springframework.cloud.consul.discovery.ConsulCatalogWatchAutoConfiguration, \
org.springframework.cloud.consul.support.ConsulHeartbeatAutoConfiguration

# Bootstrap Configuration
org.springframework.cloud.bootstrap.BootstrapConfiguration=\
org.springframework.cloud.consul.discovery.configclient.ConsulDiscoveryClientConfigServiceBootstrapConfiguration

org.springframework.boot.Bootstrapper=\
org.springframework.cloud.consul.discovery.configclient.ConsulConfigServerBootstrapper

如您所见, spring-cloud-vault-config 中的 #Bootstrap Configuration 包含正确的 Vault 配置文件,但 spring-cloud-consul-discovery 中的 #Bootstrap Configuration 仅包含ConsulDiscoveryClientConfigServiceBootstrapConfiguration,这似乎适用于某人的情况选择 Spring Cloud Config 而不是 Spring Cloud Consul Config。我这样说是因为该文件以ConfigServicePropertySourceLocator.class为条件

@ConditionalOnClass(ConfigServicePropertySourceLocator.class)
@ConditionalOnProperty("spring.cloud.config.discovery.enabled")
@Configuration(proxyBeanMethods = false)
@ImportAutoConfiguration({ ConsulAutoConfiguration.class, ConsulDiscoveryClientConfiguration.class,
    ConsulReactiveDiscoveryClientConfiguration.class })
public class ConsulDiscoveryClientConfigServiceBootstrapConfiguration {

}

在 spring-cloud-config-client-3.0.0.jar 中找到。如果您要包含 spring-cloud-config-client 依赖项,则 Vault 服务发现将起作用,因为它包含

@ImportAutoConfiguration({ ... ConsulDiscoveryClientConfiguration.class })

所需的确切配置文件。问题是,如果您包含 spring-cloud-config-client,您现在将同时使用 Spring Cloud Consul ConfigSpring Cloud Config,这可能不是您想要的(两者都由spring.cloud.discovery.enabled,因此尝试同时包含依赖项并关闭其中一项可能会很棘手)。

好的,所以从我上面看到的情况来看,这看起来像是 Spring Cloud Consul 中的一个错误。我没有看到任何其他可能在 Bootstrap Configuration 部分加载ConsulDiscoveryClientConfiguration的 spring.factories。如果存在需要执行此操作的其他依赖项,我还没有看到它。

作为在 Spring Cloud Consul 中解决问题之前的临时解决方法,您可以将自己的src/main/resources/META-INF/spring.factories文件添加到项目中的模块并包括

org.springframework.cloud.bootstrap.BootstrapConfiguration=\
org.springframework.cloud.consul.discovery.ConsulDiscoveryClientConfiguration

它解决了spring cloud 3.0.0版本中的问题。

于 2021-03-12T14:42:38.527 回答