• 两个和尚锵锵锵95期:佛教“不维权”是理性吗? 2019-10-19
  • 万花瞳:万花迷人眼 慧瞳观天下 2019-10-06
  • 银联商务“银杏大数据”获“金融大数据创新应用优秀成果奖” 2019-10-01
  • 300架F35已交付 专家:中国五代机步子应快点 2019-09-25
  • “陪堂妈妈”上课3000多节 班主任:她去中考没问题 2019-09-25
  • 外卖平台乱象,要查处更要监管 2019-09-18
  • 国家能源局:四方面工作促洁净能源发展 2019-09-18
  • 会不会搞不是谁说了就算数,而是要实践与历史来证明的;发展经济需要理论引领,更要科技创新来支撑。 2019-09-17
  • 北京将为人才提供住房支持 ——凤凰网房产北京 2019-09-17
  • 经常吃它到老耳聪目明牙齿好 让你越来越健康-美食资讯 2019-09-14
  • 美帝拉拢人民,才能反对共产党。 2019-09-13
  • “ONE NIGHT 给小孩”开启公益探访第一站 周迅惠若琪最萌身高差参与“亲子运动会” 2019-09-11
  • Xi Jinping le peuple, créateur de lhistoire et véritable héros 2019-09-11
  • 朔州检察院新机制助力企业家创业 2019-08-31
  • 河北省政府办公厅发出通知:加快推进河湖全面清理整治工作 2019-08-31
  • 我的位置: 热火vs马刺总决赛6 > 学习专区 > JAVA技术 >
    热点专题更多 >
    热门标签更多 >
    东莞北大青鸟教你Spring Cloud Config 规范
    时间:2018-12-23 18:51:42   来源:
    大家都在关注:东莞北大青鸟
    分享到:
    [导读] Spring Cloud Config项目是一个解决分布式系统的配置管理方案。首先Spring Cloud 是基于 Spring 来扩展的,Spring 本身就提供当创建一个Bean时可从Environment 中将一些属性值通过@Value的形式注入到业务代码中的能力。
    导读:Spring Cloud Config项目是一个解决分布式系统的配置管理方案。首先Spring Cloud 是基于 Spring 来扩展的,Spring 本身就提供当创建一个Bean时可从Environment 中将一些属性值通过@Value的形式注入到业务代码中的能力。那Spring Cloud Config 要解决的问题就是:
     
     
        如何将配置加载到 Environment 。
        配置变更时,如何控制 Bean 是否需要 create,重新触发一次 Bean 的初始化,才能将 @Value 注解指定的字段从 Environment 中重新注入。
        配置变更时,如何控制新的配置会更新到 Environment 中,才能保证配置变更时可注入最新的值。
     
     
    要解决以上三个问题:Spring Cloud Config 规范中刚好定义了核心的三个接口:
     
     
        PropertySourceLocator:抽象出这个接口,就是让用户可定制化的将一些配置加载到 Environment。这部分的配置获取遵循了 Spring Cloud Config 的理念,即希望能从外部储存介质中来 loacte。
        RefreshScope: Spring Cloud 定义这个注解,是扩展了 Spring 原有的 Scope 类型。用来标识当前这个 Bean 是一个refresh 类型的 Scope。其主要作用就是可以控制 Bean 的整个生命周期。
        ContextRefresher:抽象出这个 Class,是让用户自己按需来刷新上下文(比如当有配置刷新时,希望可以刷新上下文,将最新的配置更新到 Environment,重新创建 Bean 时,就可以从 Environment 中注入最新的配置)。
     
     
    Spring Cloud Config 原理
     
     
    Spring Cloud Config 的启动过程
     
     
    1、如何将配置加载到Environment:
    PropertySourceLocator
     
     
    在整个 Spring Boot 启动的生命周期过程中,有一个阶段是 prepare environment。在这个阶段,会publish 一个 ApplicationEnvironmentPreparedEvent,通知所有对这个事件感兴趣的 Listener,提供对 Environment 做更多的定制化的操作。Spring Cloud 定义了一个BootstrapApplicationListener,在 BootstrapApplicationListener 的处理过程中有一步非常关键的操作如下所示:
     东莞java大数据开发技术
     
     
    这是 Spring 的工厂加载机制,可通过在 META-INF/spring.factories 文件中配置一些程序中预定义的一些扩展点。比如 Spring Cloud 这里的实现,可以看到 BootstrapConfiguration 不是一个具体的接口,而是一个注解。通过这种方式配置的扩展点好处是不局限于某一种接口的实现,而是同一类别的实现??梢圆榭?spring-cloud-context 包中的 spring.factories 文件关于BootstrapConfiguration的配置,有一个比较核心入口的配置就是:
     东莞java大数据开发技术
     
     
    可以发现
     
    PropertySourceBootstrapConfiguration 实现了 ApplicationContextInitializer 接口,其目的就是在应用程序上下文初始化的时候做一些额外的操作。在 Bootstrap 阶段,会通过 Spring Ioc 的整个生命周期来初始化所有通过key为_org.springframework.cloud.bootstrap.BootstrapConfiguration_ 在 spring.factories 中配置的 Bean。Spring Cloud Alibaba Nacos Config 的实现就是通过该key来自定义一些在Bootstrap 阶段需要初始化的一些Bean。在该??榈?spring.factories 配置文件中可以看到如下配置:
     东莞java大数据开发技术
     
     
    在 Bootstrap 阶段初始化的过程中,会获取所有 ApplicationContextInitializer 类型的 Bean,并设置回SpringApplication主流程当中。如下 BootstrapApplicationListener 类中的部分代码所示:
     
     东莞java大数据开发技术
     
     东莞java大数据开发技术
    这样一来,就可以通过在 SpringApplication 的主流程中来回调这些ApplicationContextInitializer 的实例,做一些初始化的操作。如下 SpringApplication 类中的部分代码所示:
     
     东莞java大数据开发技术
     
     东莞java大数据开发技术
    在 applyInitializers 方法中,会触发 PropertySourceBootstrapConfiguration 中的 initialize 方法。如下所示:
     
     东莞java大数据开发技术
     
     东莞java大数据开发技术

    在这个方法中会回调所有实现 PropertySourceLocator 接口实例的locate方法,
    locate 方法返回一个 PropertySource 的实例,统一add到CompositePropertySource实例中。如果 composite 中有新加的PropertySource,最后将composite中的PropertySource添加到当前应用上下文的propertySources中。
    Spring Cloud Alibaba Nacos Config 在 Bootstrap 阶段通过Java配置的方式初始化了一个 NacosPropertySourceLocator 类型的Bean。从而在 locate 方法中将存放在Nacos中的配置信息读取出来,将读取结果存放到 PropertySource 的实例中返回。具体如何从Nacos中读取配置信息可参考 NacosPropertySourceLocator 类的实现。
     
     
    Spring Cloud Config 正是提供了PropertySourceLocator接口,来提供应用外部化配置可动态加载的能力。Spring Ioc 容器在初始化 Bean 的时候,如果发现 Bean 的字段上含有 @Value 的注解,就会从 Enviroment 中的PropertySources 来获取其值,完成属性的注入。
     
     
    Spring Cloud Config 外部化配置可动态刷新
     
     
    感知到外部化配置的变更这部分代码的操作是需要用户来完成的。Spring Cloud Config 只提供了具备外部化配置可动态刷新的能力,并不具备自动感知外部化配置发生变更的能力。比如如果你的配置是基于Mysql来实现的,那么在代码里面肯定要有能力感知到配置发生变化了,然后再显示的调用 ContextRefresher 的 refresh方法,从而完成外部化配置的动态刷新(只会刷新使用RefreshScope注解的Bean)。
     
     
    例如在 Spring Cloud Alibaba Nacos Config 的实现过程中,Nacos 提供了对dataid 变更的Listener 回调。在对每个dataid 注册好了相应的Listener之后,如果Nacos内部通过长轮询的方式感知到数据的变更,就会回调相应的Listener,在 Listener 的实现过程中,就是通过调用 ContextRefresher 的 refresh方法完成配置的动态刷新。具体可参考 NacosContextRefresher 类的实现。
     
     
    Sring Cloud Config的动态配置刷新原理图如下所示:
     东莞java大数据开发技术
     
     
    ContextRefresher的refresh的方法主要做了两件事:
     
        触发PropertySourceLocator的locator方法,需要加载最新的值,并替换 Environment 中旧值
        Bean中的引用配置值需要重新注入一遍。重新注入的流程是在Bean初始化时做的操作,那也就是需要将refresh   scope中的Bean 缓存失效,当再次从refresh scope中获取这个Bean时,发现取不到,就会重新触发一次Bean的初始化过程。
     
     
    这两个操作所对应的代码如下所示:
     
     东莞java大数据开发技术
     
     东莞java大数据开发技术
    addConfigFilesToEnvironment 方法中发生替换的代码如下所示:
     
     东莞java大数据开发技术
     
     东莞java大数据开发技术
    this.scope.refreshAll() 清空缓存的操作代码如下所示:
     
     东莞java大数据开发技术
     
    为了验证每次配置刷新时,Bean 是新创建的,特意写了一个Demo 验证了下,如下所示:
     
     东莞java大数据开发技术
     
    Spring Cloud Config 扩展Scope的核心类:RefreshScope
     
     
    可以看到上面的代码中有 this.scope.refreshAll(),其中的scope就是RefreshScope。是用来存放scope类型为refresh类型的Bean(即使用RefreshScope注解标识的Bean),也就是说当一个Bean既不是singleton也不是prototype时,就会从自定义的Scope中去获取(Spring 允许自定义Scope),然后调用Scope的get方法来获取一个实例,Spring Cloud 正是扩展了Scope,从而控制了整个 Bean 的生命周期。当配置需要动态刷新的时候, 调用this.scope.refreshAll()这个方法,就会将整个RefreshScope的缓存清空,完成配置可动态刷新的可能。
     
     
    后续
     
     
    关于ContextRefresh 和 RefreshScope的初始化配置是在RefreshAutoConfiguration类中完成的。而RefreshAutoConfiguration类初始化的入口是在spring-cloud-context中的META-INF/spring.factories中配置的。从而完成整个和动态刷新相关的Bean的初始化操作。
  • 两个和尚锵锵锵95期:佛教“不维权”是理性吗? 2019-10-19
  • 万花瞳:万花迷人眼 慧瞳观天下 2019-10-06
  • 银联商务“银杏大数据”获“金融大数据创新应用优秀成果奖” 2019-10-01
  • 300架F35已交付 专家:中国五代机步子应快点 2019-09-25
  • “陪堂妈妈”上课3000多节 班主任:她去中考没问题 2019-09-25
  • 外卖平台乱象,要查处更要监管 2019-09-18
  • 国家能源局:四方面工作促洁净能源发展 2019-09-18
  • 会不会搞不是谁说了就算数,而是要实践与历史来证明的;发展经济需要理论引领,更要科技创新来支撑。 2019-09-17
  • 北京将为人才提供住房支持 ——凤凰网房产北京 2019-09-17
  • 经常吃它到老耳聪目明牙齿好 让你越来越健康-美食资讯 2019-09-14
  • 美帝拉拢人民,才能反对共产党。 2019-09-13
  • “ONE NIGHT 给小孩”开启公益探访第一站 周迅惠若琪最萌身高差参与“亲子运动会” 2019-09-11
  • Xi Jinping le peuple, créateur de lhistoire et véritable héros 2019-09-11
  • 朔州检察院新机制助力企业家创业 2019-08-31
  • 河北省政府办公厅发出通知:加快推进河湖全面清理整治工作 2019-08-31
  • 欢乐生肖论坛 时时彩攻略与实战技巧 姚记娱乐客服 麻将多少张牌 快乐飞艇计划有软件吗 炸金花可提现1元1金币 永发国际娱乐网址 分分时时彩 十一选五高级技巧 最稳足彩购买 藏分出款成功率高吗 u米娱乐怎么样 澳门21点规则 摩卡国际网址 重庆龙虎和微信群 新生彩票注册