1

到目前为止我已经实施的是:

  1. 带有“本机”存储库的 Spring Cloud Config Server。

spring.profiles.active: native

spring.cloud.config.server.native.searchLocations: file:/path/to/config-repo

  1. Config Server 正在通过 RabbitMQ 向 Config Client App 推送通知,如http://cloud.spring.io/spring-cloud-config/spring-cloud-config.html#_push_notifications_and_spring_cloud_bus

  2. 配置客户端应用程序在服务 bean 上注释了 @RefreshScope。

所以 /config-repo 有 3 个文件 - application.yaml、client.yaml 和 client.json 所有 yaml 属性更改肯定会由 Config Client App 自动重新加载。但是,client.json 没有。

基于https://github.com/spring-cloud/spring-cloud-config/issues/147,我可以使用 /{appname}/{profile} 通过 REST api 调用 Config Server 来获取 Config Client App 上的文件/{标签}/client.json

问题是:

1) Config Server 是否通过“本机”监视此纯文本文件更改?

2) Config Client App 如何在更新后自动重新加载此 client.json?(我可以安排任务来调用配置服务器,但这并不理想。)

4

2 回答 2

1

Config客户端:restTemplate.getForObject(" http://localhost:8080/application/default/master/testing-dev.json ",String.class);

可以获取.json后缀的文件内容,但我认为它没有获取文件内容,有其他方式获取文件内容

于 2017-07-06T06:47:46.680 回答
1

我喜欢这样(尚未完成):我有 spring.cloud.config.server.native.serach-locations 以逗号分隔的 URI 列表形式

file:/c:/repo/a,file:/c:/repo/b

我创建了 FileMonitorConfiguration bean(但它有一些问题,因为它被调度了 2 次,一个 bean 本身和一个 spring 增强实例,我不熟悉这个)

并实现(只是草稿) NativePropertyPathNotificationExtractor

@Configuration
@EnableAutoConfiguration
@EnableConfigServer
public class ConfigServerApplication {
    public static void main(String[] args) {
        SpringApplication.run(ConfigServerApplication.class, args);
    }

    @Bean
    NativePropertyPathNotificationExtractor nativePropertyPathNotificationExtractor(@Autowired(required = false) NativeEnvironmentRepository nativeRepo) {
        return new NativePropertyPathNotificationExtractor(nativeRepo);
    }

    @Bean
    FileMonitorConfiguration fileMonitorConfiguration() {
        return new FileMonitorConfiguration();
    }
}

@Order(Ordered.LOWEST_PRECEDENCE - 500)
public class NativePropertyPathNotificationExtractor implements PropertyPathNotificationExtractor {
    private final Set<Path> searchPaths;

    public NativePropertyPathNotificationExtractor(NativeEnvironmentRepository nativeRepo) {
        searchPaths = searchLocations(nativeRepo);
    }

    @Override
    public PropertyPathNotification extract(MultiValueMap<String, String> headers, Map<String, Object> payload) {

        // FileMonitor with empty headers, so if some there, ignore
        if (false == headers.isEmpty()) {
            return null;
        }
        if (null == searchPaths) {
            return null;
        }

        Path path = pathFromPayload(payload);
        if (null == path) {
            return null;
        }

        for (Path searchPath : searchPaths) {
            Path relative = searchPath.relativize(path);
            // just a try ;-)
            if (true == relative.startsWith("..")) {
                continue;
            }

            return new PropertyPathNotification(relative.toString());
        }

        return null;
    }

    private Path pathFromPayload(Map<String, Object> payload) {
        if (null == payload) {
            return null;
        }
        if (true == payload.isEmpty()) {
            return null;
        }
        if (false == payload.containsKey("path")) {
            return null;
        }
        if (null == payload.get("path")) {
            return null;
        }
        if (true == StringUtils.isEmpty(payload.get("path").toString())) {
            return null;
        }
        return Paths.get(payload.get("path").toString()).normalize().toAbsolutePath();
    }

    private Set<Path> searchLocations(NativeEnvironmentRepository nativeRepo) {
        if (null == nativeRepo) {
            return null;
        }
        if (null == nativeRepo.getSearchLocations()) {
            return null;
        }

        final Set<Path> paths = new LinkedHashSet<>();
        for (String location : nativeRepo.getSearchLocations()) {
            try {
                paths.add(Paths.get(new URI(location)).normalize().toAbsolutePath());
            } catch (Exception e) {
                System.err.println("Nevalidne search location uri: " + location);
            }
        }
        return paths;

    }
}
于 2017-02-24T12:55:03.887 回答