zoukankan      html  css  js  c++  java
  • Spring Cloud Alibaba学习笔记(22)

    目前业界流行的统一配置管理中心组件有Spring Cloud Config、Spring Cloud Alibaba的Nacos及携程开源的Apollo,本文将介绍Nacos作为统一配置管理中心的使用。

    使用Nacos管理配置

    比如我现在有这样一段代码:

    @Value("${your.configuration}")
    private String yourConfiguration;
    
    @GetMapping("/test_configuration")
    public String testConfiguration(){
        return yourConfiguration;
    }
    

    这段代码读取了一个配置项,常规的配置方式应该配置于项目的application.yaml或者.properties文件中,那么使用Nacos要如何管理这段配置呢?

    首先,添加依赖

    <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
    </dependency>
    

    然后在resources目录下新建一个名为bootstrap.yml的文件,添加配置项:

    spring:
      application:
        name: study01
      cloud:
        nacos:
          config:
            server-addr: 127.0.0.1:8848
            namespace: 888ac051-ae5f-44f1-940a-30c7824a0e91
            cluster-name: HZ
            file-extension: yaml
      profiles:
        active: dev
    

    打开Nacos控制台-配置管理-配置列表,点击+号新建配置,详情如下。

    注意,这里的Data ID是具有一定格式的,需要与项目中的配置对应上。如上图中的:study01-dev.yaml,其中study01是微服务名称,dev是环境,yaml是配置文件的格式,对应关系如下:

    到目前为止,我们就已经为项目整合了Nacos的配置管理功能,并在Nacos Server上新建了项目所需的配置。启动项目,访问/test_configuration接口,返回结果如下则代表整合成功:

    动态刷新配置及回滚

    动态刷新配置

    在实际的应用开发中,我们通常希望在配置中心上修改了配置项后,不需要重启项目就能够实现实时的动态配置刷新。对于整合了Nacos的微服务项目来说,想要实现这个功能是很简单的,只需要在读取了配置属性的类上加上@RefreshScope注解即可。

    添加完该注解后,重启项目,然后到Nacos上修改之前配置项的值,点击发布后会有一个内容比较的提示:

    点击确认发布后,然后再访问/test_configuration接口,返回的就是修改后的值了,而此时我们并没有重启项目:

    回滚

    我们可以在Nacos控制台-配置管理-历史版本中查询指定配置的历史版本,Data IDGroup必填,点击查询可以看见所有的历史版本:

    点击“回滚”则可以回滚到指定的历史版本。需要注意的是当选择回滚的版本是最初版本时就会触发一个Bug,回滚失败,配置丢失,官方称会在1.2版本中修复该问题。只要回滚的不是初始版本则不会触发这个bug,回滚其他版本是可以正常使用的,所以该问题注意一下即可规避。

    配置共享

    不同环境之间的配置共享

    想要实现配置共享只需要新建一个配置文件即可,首先我们来看一段日志信息,当我们启动项目时,控制台会出输出如下一段日志信息:

    2019-10-29 09:35:17.986  INFO 9104 --- [           main] b.c.PropertySourceBootstrapConfiguration : Located property source: CompositePropertySource {name='NACOS', propertySources=[NacosPropertySource {name='study01-dev.yaml'}, NacosPropertySource {name='study01.yaml'}]}
    

    该日志信息可以看到,项目在启动时会到Nacos上读取两个配置文件,即study01-dev.yaml和study01.yaml,其中study01-dev.yaml里保存的是开发环境下特定的配置,而study01.yaml里保存的则是所有环境下通用的配置。项目在启动时具体读取哪个环境的配置文件是由bootstrap.yml文件中的spring.profiles.active配置项所决定的。
    既然我们知道保存在content-center.yaml里的配置项会在所有环境中共享,那么只需要到Nacos上新建这个配置文件即可,配置方法同上。
    PS:特定环境下的配置优先级高于通用环境配置,例如${your.configuration}配置项同时存在于content-center-dev.yaml和content-center.yaml中,若spring.profiles.active的值为dev,那么读取的将是content-center-dev.yaml里所配置的值。

    不同应用之间的配置共享

    目前Nacos提供了两种方式可以实现不同应用之间的配置共享

    使用shared-dataids

    实现

    首先需要到Nacos上创建一些共享配置

    修改项目中的bootstrap.yml文件如下

    spring:
      application:
        name: study01
      cloud:
        nacos:
          config:
            server-addr: 127.0.0.1:8848
            namespace: 888ac051-ae5f-44f1-940a-30c7824a0e91
            cluster-name: HZ
            file-extension: yaml
            # 共享配置的DataId,多个使用,分隔
            # 越靠后,优先级越高
            # .yaml后缀不能少,只支持yaml/properties
            shared-dataids: common1.yaml,common2.yaml
            # 哪些共享配置支持动态刷新,多个使用,分隔
            refreshable-dataids: common1.yaml
      profiles:
        active: dev
    

    从以上的配置示例可以看出,其实shared-dataids的主要作用就是用来指定共享配置的Data ID,使得该微服务可以读取这些共享配置。同理,其他微服务若想读取这些共享配置,只需在项目的bootstrap.yml文件中添加相应的shared-dataids配置即可,如此一来就实现了多个微服务之间的配置共享。

    测试代码

    @Value("${common1.configuration1}")
    private String common1Configuration;
    
    @Value("${common2.configuration2}")
    private String common2Configuration;
    
    @GetMapping("/test_common_configuration1")
    public String testCommonConfiguration1() {
        return common1Configuration;
    }
    
    @GetMapping("/test_common_configuration2")
    public String testCommonConfiguration2() {
        return common2Configuration;
    }
    

    测试结果

    使用ext-config

    实现

    spring:
      application:
        name: study01
      cloud:
        nacos:
          config:
            server-addr: 127.0.0.1:8848
            file-extension: yaml
            ext-config:
              # 需共享的DataId,yaml后缀不能少,目前只支持yaml/properties
              # 越靠后,优先级越高 优先级common2.yaml > common1.yaml
              - data-id: common1.yaml
                # common1.yaml所在的group
                group: DEFAULT_GROUP
                # 是否允许刷新,默认false
                refresh: true
              - data-id: common2.yaml
                group: DEFAULT_GROUP
                refresh: true
      profiles:
        active: dev
    

    ext-config提供了较为细化的配置方式,并且可以指定配置组。到目前为止,我们介绍了三种从Nacos上读取配置的方式,其优先级如下:

    • shared-dataids < ext-config < 自动

    除此之外,当存在相同的远程配置和本地配置时,远程配置优先级要高于本地配置文件。但可以通过添加如下配置调整,需要注意的是这段配置需要放在远程配置才会生效:

    spring:
      cloud:
        config:
          # 是否允许本地配置覆盖远程配置,默认true
          allow-override: true
          # 是否一切以本地配置为准,默认false
          override-none: false
          # 系统环境变量或系统属性才能覆盖远程配置文件的配置
          # 本地配置文件中配置的优先级低于远程配置,默认true
          override-system-properties: true
    
  • 相关阅读:
    Ant 警告:sun.misc.BASE64Decoder 是 Sun 的专用 API,可能会在未来版本中删除
    SerfJ REST
    SimpleDateFormat的线程安全问题与解决方案
    蔡勒(Zeller)公式:根据日期推算是星期几
    【转】详解 Spring 3.0 基于 Annotation 的依赖注入实现
    PostgreSQL JSON ARRAY 数据类型
    【转】Tomcat源代码阅读系列
    Spring 数据源
    IBatis-Spring 整合
    24 The Go image package go图片包:图片包的基本原理
  • 原文地址:https://www.cnblogs.com/fx-blog/p/11756759.html
Copyright © 2011-2022 走看看