ConfigServerInstanceProvider报错:需DiscoveryClient或Function的解决方法
解决Spring Boot启动错误:ConfigServerInstanceProvider requires a DiscoveryClient or Function
问题描述
Gradle构建配置
plugins { id 'org.springframework.boot' version '2.6.15' id 'io.spring.dependency-management' version '1.1.4' id 'java' } group = 'com.test.config' version = '0.0.1' java { sourceCompatibility = '21' } configurations { compileOnly { extendsFrom annotationProcessor } } ext { set('springCloudVersion', "2021.0.9") } repositories { mavenCentral() } dependencies { implementation 'org.springframework.cloud:spring-cloud-starter-openfeign' implementation 'org.springframework.cloud:spring-cloud-starter-netflix-hystrix:2.2.10.RELEASE' implementation 'io.jsonwebtoken:jjwt-api:0.12.3' implementation 'io.jsonwebtoken:jjwt-impl:0.12.3' implementation 'org.apache.commons:commons-collections4:4.4' implementation 'commons-io:commons-io:2.14.0' implementation 'org.springframework.data:spring-data-commons:2.7.14' implementation 'org.springframework.security:spring-security-config' implementation 'org.springframework.security:spring-security-web' implementation 'javax.persistence:javax.persistence-api:2.2' compileOnly 'javax.servlet:servlet-api:2.5' implementation 'org.postgresql:postgresql' implementation 'com.google.code.findbugs:jsr305:3.0.2' implementation 'org.springframework.cloud:spring-cloud-starter-netflix-ribbon:2.2.10.RELEASE' implementation 'org.hibernate.validator:hibernate-validator:8.0.0.Final' implementation 'joda-time:joda-time:2.12.5' implementation 'org.springframework.boot:spring-boot-starter-data-jpa' implementation 'org.springframework.cloud:spring-cloud-starter-bootstrap' annotationProcessor 'org.springframework.boot:spring-boot-configuration-processor' // Swagger implementation 'org.springdoc:springdoc-openapi-ui:1.7.0' // Lombok compileOnly 'org.projectlombok:lombok:1.18.30' annotationProcessor 'org.projectlombok:lombok:1.18.30' testCompileOnly 'org.projectlombok:lombok:1.18.30' testAnnotationProcessor 'org.projectlombok:lombok:1.18.30' testImplementation 'org.junit.jupiter:junit-jupiter-api' testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine' } dependencyManagement { imports { mavenBom "org.springframework.cloud:spring-cloud-dependencies:${springCloudVersion}" } } tasks.named('test') { useJUnitPlatform() }
启动错误日志
2024-02-12 22:44:31.979 ERROR 8752 --- [ main] o.s.boot.SpringApplication : Application run failed org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'configServerInstanceProvider' defined in class path resource [org/springframework/cloud/config/client/DiscoveryClientConfigServiceBootstrapConfiguration.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframework.cloud.config.client.ConfigServerInstanceProvider]: Factory method 'configServerInstanceProvider' threw exception; nested exception is java.lang.IllegalStateException: ConfigServerInstanceProvider requires a DiscoveryClient or Function at org.springframework.beans.factory.support.ConstructorResolver.instantiate(ConstructorResolver.java:658) ~[spring-beans-5.3.27.jar:5.3.27] at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:638) ~[spring-beans-5.3.27.jar:5.3.27] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:1352) ~[spring-beans-5.3.27.jar:5.3.27] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1195) ~[spring-beans-5.3.27.jar:5.3.27] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:582) ~[spring-beans-5.3.27.jar:5.3.27] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:542) ~[spring-beans-5.3.27.jar:5.3.27] at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:335) ~[spring-beans-5.3.27.jar:5.3.27] at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) ~[spring-beans-5.3.27.jar:5.3.27] at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:333) ~[spring-beans-5.3.27.jar:5.3.27] at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:208) ~[spring-beans-5.3.27.jar:5.3.27] at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:955) ~[spring-beans-5.3.27.jar:5.3.27] at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:920) ~[spring-context-5.3.27.jar:5.3.27] at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:583) ~[spring-context-5.3.27.jar:5.3.27] at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:745) ~[spring-boot-2.6.15.jar:2.6.15] at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:423) ~[spring-boot-2.6.15.jar:2.6.15] at org.springframework.boot.SpringApplication.run(SpringApplication.java:307) ~[spring-boot-2.6.15.jar:2.6.15] at org.springframework.boot.builder.SpringApplicationBuilder.run(SpringApplicationBuilder.java:164) ~[spring-boot-2.6.15.jar:2.6.15] at org.springframework.cloud.bootstrap.BootstrapApplicationListener.bootstrapServiceContext(BootstrapApplicationListener.java:195) ~[spring-cloud-context-3.1.7.jar:3.1.7] at org.springframework.cloud.bootstrap.BootstrapApplicationListener.onApplicationEvent(BootstrapApplicationListener.java:114) ~[spring-cloud-context-3.1.7.jar:3.1.7] at org.springframework.cloud.bootstrap.BootstrapApplicationListener.onApplicationEvent(BootstrapApplicationListener.java:77) ~[spring-cloud-context-3.1.7.jar:3.1.7] at org.springframework.context.event.SimpleApplicationEventMulticaster.doInvokeListener(SimpleApplicationEventMulticaster.java:176) ~[spring-context-5.3.27.jar:5.3.27] at org.springframework.context.event.SimpleApplicationEventMulticaster.invokeListener(SimpleApplicationEventMulticaster.java:169) ~[spring-context-5.3.27.jar:5.3.27] at org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:143) ~[spring-context-5.3.27.jar:5.3.27] at org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:131) ~[spring-context-5.3.27.jar:5.3.27] at org.springframework.boot.context.event.EventPublishingRunListener.environmentPrepared(EventPublishingRunListener.java:85) ~[spring-boot-2.6.15.jar:2.6.15] at org.springframework.boot.SpringApplicationRunListeners.lambda$environmentPrepared$2(SpringApplicationRunListeners.java:66) ~[spring-boot-2.6.15.jar:2.6.15] at java.base/java.util.ArrayList.forEach(ArrayList.java:1596) ~[na:na] at org.springframework.boot.SpringApplicationRunListeners.doWithListeners(SpringApplicationRunListeners.java:120) ~[spring-boot-2.6.15.jar:2.6.15] at org.springframework.boot.SpringApplicationRunListeners.doWithListeners(SpringApplicationRunListeners.java:114) ~[spring-boot-2.6.15.jar:2.6.15] at org.springframework.boot.SpringApplicationRunListeners.environmentPrepared(SpringApplicationRunListeners.java:65) ~[spring-boot-2.6.15.jar:2.6.15] at org.springframework.boot.SpringApplication.prepareEnvironment(SpringApplication.java:343) ~[spring-boot-2.6.15.jar:2.6.15] at org.springframework.boot.SpringApplication.run(SpringApplication.java:301) ~[spring-boot-2.6.15.jar:2.6.15] at org.springframework.boot.SpringApplication.run(SpringApplication.java:1317) ~[spring-boot-2.6.15.jar:2.6.15] at org.springframework.boot.SpringApplication.run(SpringApplication.java:1306) ~[spring-boot-2.6.15.jar:2.6.15] at com.atlas.merchant.onboarding.config.Application.main(Application.java:47) ~[main/:na] Caused by: org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframework.cloud.config.client.ConfigServerInstanceProvider]: Factory method 'configServerInstanceProvider' threw exception; nested exception is java.lang.IllegalStateException: ConfigServerInstanceProvider requires a DiscoveryClient or Function at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:185) ~[spring-beans-5.3.27.jar:5.3.27] at org.springframework.beans.factory.support.ConstructorResolver.instantiate(ConstructorResolver.java:653) ~[spring-beans-5.3.27.jar:5.3.27] ... 34 common frames omitted Caused by: java.lang.IllegalStateException: ConfigServerInstanceProvider requires a DiscoveryClient or Function at org.springframework.cloud.config.client.DiscoveryClientConfigServiceBootstrapConfiguration.configServerInstanceProvider(DiscoveryClientConfigServiceBootstrapConfiguration.java:52) ~[spring-cloud-config-client-3.1.8.jar:3.1.8] at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103) ~[na:na] at java.base/java.lang.reflect.Method.invoke(Method.java:580) ~[na:na] at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:154) ~[spring-beans-5.3.27.jar:5.3.27] ... 35 common frames omitted
YML配置
spring: application: name: test-app cloud: config: enabled: true discovery: enabled: true serviceId: test-app-config failFast: true jackson: time-zone: UTC
错误原因
配置中开启了Config Server的服务发现模式(spring.cloud.config.discovery.enabled=true),但项目依赖里未添加任何服务发现客户端的starter,导致Spring无法找到DiscoveryClient实例来定位Config Server地址,因此抛出该错误。
解决方案
根据实际需求选择以下方案之一:
方案1:保留服务发现模式,添加服务发现客户端依赖
若架构中使用服务发现组件(如Eureka、Nacos等)管理Config Server地址,需添加对应客户端依赖:
- 若使用Spring Cloud Netflix Eureka,在Gradle的
dependencies块中添加:
implementation 'org.springframework.cloud:spring-cloud-starter-netflix-eureka-client'
同时在YML中配置Eureka服务地址:
eureka: client: service-url: defaultZone: http://你的Eureka服务地址:端口/eureka/
- 若使用Nacos作为服务发现,替换为Nacos的starter依赖:
implementation 'com.alibaba.cloud:spring-cloud-starter-alibaba-nacos-discovery'
并在YML中配置Nacos地址:
spring: cloud: nacos: discovery: server-addr: 你的Nacos服务地址:端口
方案2:关闭服务发现模式,直接指定Config Server地址
若不需要通过服务发现获取Config Server,直接关闭发现模式并指定Config Server具体地址:
修改YML配置:
spring: cloud: config: enabled: true discovery: enabled: false uri: http://你的Config Server地址:端口/ # 替换为实际地址 failFast: true
内容的提问来源于stack exchange,提问作者Peter Penzov
相关产品推荐
相关产品推荐

