Spring Cloud 内提供了 PropertySourceLocator 接口来对接 Spring 的 PropertySource 体系,通过 PropertySourceLocator,我们就拿到一个”自定义”的 PropertySource,Spring Cloud 里还有一个实现 ConfigServicePropertySourceLocator,通过它,我们可以定义一个远程的 ConfigService,通过公用这个 ConfigService 来实现分布式的配置服务。
从 ConfigClientProperties 这个配置类我们可以看得出来,它也为远程配置预设了用户名密码等安全控制选项,还有 label 用来区分服务池等配置。scope 配置刷新远程配置有了,接下来就是对变化的监测和基于配置变化的刷新。Spring Cloud 提供了 ContextRefresher 来帮助我们实现环境的刷新,其主要逻辑在 refreshEnvironment 方法和 scope.refreshAll() 方法,我们分开来看。我们先来看 spring cloud 支持的 scope.refreshAll 方法。public void refreshAll() { super.destroy(); this.context.publishEvent(new RefreshScopeRefreshedEvent());}scope.refreshAll 则更”野蛮”一些,直接销毁了 scope,并发布了一个 RefreshScopeRefreshedEvent 事件,scope 的销毁会导致 scope 内(被 RefreshScope 注解)所有的 bean 都会被销毁。而这些被强制设置为 lazyInit 的 bean 再次创建时,也就完成了新配置的重新加载。ConfigurationProperties 配置刷新然后再回过头来看 refreshEnvironment 方法。Map<String, Object> before = extract(this.context.getEnvironment().getPropertySources());addConfigFilesToEnvironment();Set keys = changes(before,extract(this.context.getEnvironment().getPropertySources())).keySet();this.context.publishEvent(new EnvironmentChangeEvent(context, keys));return keys;它读取了环境内所有 PropertySource 内的配置后,重新创建了一个 SpringApplication 以刷新配置,再次读取所有配置项并得到与前面保存的配置项的对比,最后将前后配置差发布了一个 EnvironmentChangeEvent 事件。而 EnvironmentChangeEvent 的监听器是由 ConfigurationPropertiesRebinder 实现的,其主要逻辑在 rebind 方法。Object bean = this.applicationContext.getBean(name);if (AopUtils.isAopProxy(bean)) { bean = ProxyUtils.getTargetObject(bean);}if (bean != null) { this.applicationContext.getAutowireCapableBeanFactory().destroyBean(bean); this.applicationContext.getAutowireCapableBeanFactory().initializeBean(bean, name); return true;可以看到它的处理逻辑,就是把其内部存储的 ConfigurationPropertiesBeans 依次执行销毁逻辑,再执行初始化逻辑实现属性的重新绑定。这里可以知道,Spring Cloud 在进行配置刷新时是考虑过 ConfigurationProperties 的,经过测试,在 ContextRefresher 刷新上下文后,ConfigurationProperties 注解类的属性是会进行动态刷新的。
Spring Cloud 配置概要
最新推荐文章于 2022-08-04 17:05:22 发布