首页 文章

Spring Cloud Config Server如何将纯文本文件推送到配置客户端应用程序?

提问于
浏览
1

到目前为止我实施的是:

  • Spring Cloud Config Server with "native" repo .

spring.profiles.active: native

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

所以/ 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,我可以通过REST api调用Config Server来获取Config Client App上的文件,使用////client.json

问题是:

1)Config Server监控此纯文本文件是否更改为“native”?

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

2 回答

  • 1

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

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

  • 1

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

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

    我创建了FileMonitorConfiguration bean(但它有一些问题,因为它被安排了2次,一个bean本身和一个spring enhaced实例,我对此并不熟悉)

    并实现(只是草稿)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;
    
        }
    }
    

相关问题