使用 Eureka 从自定义配置服务器加载属性

Ren*_*ith 5 java spring spring-boot netflix-eureka spring-cloud-netflix

我想使用一组由 Eureka 注册的服务提供的属性来引导我的 Web 应用程序。

我在本地设置了 Eureka、ConfigServer(REST 服务)和客户端应用程序。

暴露在端口8761中的Eureka 服务器已向其注册服务。 在此处输入图片说明

/data 服务的端点使用一组键值对进行响应,如下所示。 在此处输入图片说明

配置服务器代码

@GetMapping("/data")
    public Map<String, String> getAllProperties(){
        
        Map<String, String> dataMap = new HashMap<>();
        dataMap.put("A", "1");
        dataMap.put("B", "2");
        dataMap.put("C", "3");
        dataMap.put("D", "4");
        dataMap.put("E", "5");
        dataMap.put("F", "6");
        dataMap.put("G", "7");
        
        return dataMap;
        
    }
Run Code Online (Sandbox Code Playgroud)

客户端/应用程序端

由于我需要对响应进行自定义处理,因此我创建了一个CustomConfigLocator类来实现org.springframework.cloud.bootstrap.config.PropertySourceLocator和覆盖locate()查询和设置自定义属性的方法。

为了查询数据(属性),我需要一个实例DiscoveryClient来发现Config Server和查询/data端点。

CustomConfigLocator在使用spring.factories文件引导应用程序时初始化。

org.springframework.cloud.bootstrap.BootstrapConfiguration=\
com.config.client.ConfigClientApplication.CustomConfigLocator
Run Code Online (Sandbox Code Playgroud)

主类使用@EnableDiscoveryClient 进行注释,bootstrap.properties 提供以下属性。

spring.cloud.config.discovery.enabled = true
spring.cloud.config.discovery.service-id = CUSTOMCONFIGSERVER
eureka.client.serviceUrl.defaultZone=http://localhost:8761/eureka/
Run Code Online (Sandbox Code Playgroud)

现在来到真正的问题。正如我之前提到的,需要一个 的实例DiscoveryClient才能从 Eureka 发现 Config Server 实例。但是,当我尝试注入 (@Autowire) 的实例时org.springframework.cloud.client.discovery.DiscoveryClient,应用程序无法开始抱怨该类型的实例在容器中不可用。

public class CustomConfigLocator implements PropertySourceLocator{
    
    @Autowired
    private DiscoveryClient discoveryClient;
Run Code Online (Sandbox Code Playgroud)

org.springframework.beans.factory.UnsatisfiedDependencyException:创建名为“com.config.client.ConfigClientApplication.CustomConfigLocator”的bean时出错:通过字段“discoveryClient”表达的不满意依赖;嵌套异常是 org.springframework.beans.factory.NoSuchBeanDefinitionException:没有可用的“org.springframework.cloud.client.discovery.DiscoveryClient”类型的合格 bean:预计至少有 1 个 bean 有资格作为自动装配候选。依赖注解:

任何人都可以建议一种从课程中访问DiscoveryClient的方法CustomConfigLocator吗?

############## UPDATE-1 ###############

dependencies {
    implementation 'org.springframework.cloud:spring-cloud-starter-netflix-eureka-client'
    implementation 'org.springframework.boot:spring-boot-starter-web'
    testImplementation('org.springframework.boot:spring-boot-starter-test') {
        exclude group: 'org.junit.vintage', module: 'junit-vintage-engine'
    }
}
Run Code Online (Sandbox Code Playgroud)