3

我们使用 Spring Cloud Config ( Dalston.SR5),云客户端使用 Spring Boot 2.x、Spring Cloud Bus 和Finchley.SR1.

我从这个答案中了解到为什么云客户端应用程序使用 Config 为父级引导,SpringBootApplication然后在绑定云总线后再次引导。我很好。

我的问题是有没有办法区分这两个引导请求?

我问的原因是我们的配置服务器生成凭据并将它们返回给客户端进行身份验证。两个引导程序意味着两组凭据,只有一组被使用,这是一种浪费。

据我所知,每次都发送相同的引导有效负载ConfigServicePropertySourceLocator,这使 Config 没有机会。

是否有覆盖/挂钩,以便我可以让 Config 知道不要第二次生成凭据?

(我可以从配置/服务器端解决,但这有点绝望,而且我不愿意尝试管理状态 - 跨越两个恰好相隔约 20 秒的其他相同请求。)


我目前最好的想法是按照以下方式进行子类化PropertySourceBootstrapConfiguration和更新spring.factories

# Bootstrap components
org.springframework.cloud.bootstrap.BootstrapConfiguration=\
org.springframework.cloud.bootstrap.config.MyCountingPropertySourceBootstrapConfiguration,\

在发出任何请求之前,我应该能够检查PropertySources 并查找第一个成功引导程序将返回的任何属性。如果存在,我会尝试为我的配置服务器获取额外的标签或配置文件ConfigServicePropertySourceLocator,以便第二次获取。

我想这可以工作,但有没有更清洁/更 Spring Boot-y 的方式?

4

1 回答 1

0

这个解决方案似乎既简单又非常有效。

新的自动配置来接管ConfigServicePropertySourceLocator

@Configuration
@AutoConfigureBefore(ConfigServiceBootstrapConfiguration.class)
public class ConfigPropertyLocatorConfiguration {

    @Bean
    @ConditionalOnProperty(value = "spring.cloud.config.enabled", matchIfMissing = true)
    public ConfigServicePropertySourceLocator configServicePropertySource(ConfigClientProperties properties) {
        return new CachingConfigServicePropertySourceLocator(properties);
    }
}

spring.factories

org.springframework.cloud.bootstrap.BootstrapConfiguration=\
  autoconfigure.ConfigPropertyLocatorConfiguration

缓存定位器实现:

public class CachingConfigServicePropertySourceLocator extends
                                           ConfigServicePropertySourceLocator {

    private final static Logger LOG = getLogger("...");

    private PropertySource<?> cachedProperties;

    public CachingConfigServicePropertySourceLocator(ConfigClientProperties props) {
        super(props);
    }

    public PropertySource<?> locate(final Environment env) {
        if (cachedProperties == null) {
            cachedProperties = super.locate(env);
        }
        else {
            LOG.debug("Returning cached PropertySource for second bootstrap");
        }

        return cachedProperties;
    }
}

获得了第二次引导的机会,完全忽略它并再次返回它似乎有点粗鲁PropertySource- 但在我们的情况下这很好。它可以防止我们两次访问配置服务器并浪费地生成凭据。

无需更改PropertySourceBootstrapConfiguration。云配置服务器没有变化。

于 2018-12-11T22:32:44.000 回答