Nacos七Nacos共享配置

26次阅读

共计 4921 个字符,预计需要花费 13 分钟才能阅读完成。

前言

本文参考文章:
SpringCloud Alibaba – Nacos Config 自定义共享配置

前景回顾:

  • Nacos(六):多环境下如何“管理”及“隔离”配置和服务
  • Nacos(五):多环境下如何“读取”Nacos 中相应环境的配置
  • Nacos(四):SpringCloud 项目中接入 Nacos 作为配置中心

前几章已经基本介绍了 springcloud 项目结合 Nacos 的大部分用法,本文介绍一下 Nacos 作为配置中心时,如何读取共享配置

我的环境

  • Windows10
  • JDK8
  • SpringCloud:Finchley.RELEASE
  • SpringBoot:2.0.4.RELEASE
  • spring-cloud-alibaba-dependencies:0.2.2.RELEASE
  • Nacos-server:1.0.1

本文的项目 Demo 继续沿用之前文章中的聚合工程Nacos, 若小伙伴还没有之前的环境,可至源码地址中下载

场景描述

一个项目中服务数量增加后,配置文件相应增加,多个配置文件中会存在相同的配置,那么我们可以将相同的配置独立出来,作为该项目中各个服务的共享配置文件,每个服务都可以通过 Nacos 进行共享配置的读取

下面用一个 demo 演示下,是否可行

  • demo 工程:nacos-config-share
  • 配置文件:nacos-config-share.yml
  • 共享配置文件:shareconfig1.yml,shareconfig2.yml

创建项目

一如往常,还是在聚合工程 Nacos 下创建名为 nacos-config-share 的子工程,其 pom.xml 文件依赖与之前的项目都一致,如果您没有之前的项目可参考源码地址

1、修改 springboot 启动类NacosConfigShareApplication.java

@SpringBootApplication
@EnableDiscoveryClient
@RestController
@RefreshScope
public class NacosConfigShareApplication {public static void main(String[] args) {SpringApplication.run(NacosConfigShareApplication.class, args);
    }

    @Value("${nacos.share}")
    private String share;


    @Value("${share.config1}")
    private String shareConfig1;

    @Value("${share.config2}")
    private String shareConfig2;

    @RequestMapping("/getValue")
    public String getValue() {return share;}

    @RequestMapping("/getShare1")
    public String getShare1() {return shareConfig1;}

    @RequestMapping("/getShare2")
    public String getShare2() {return shareConfig2;}
}

2、修改该项目的配置文件bootstrap.yml

spring:
  application:
    name: nacos-config-share
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848
      config:
        server-addr: 127.0.0.1:8848
        prefix: ${spring.application.name}
        file-extension: yml
        shared-dataids: shareconfig1.yml,shareconfig2.yml
        refreshable-dataids: shareconfig1.yml,shareconfig2.yml

从配置文件可以看出,通过 shared-dataids 属性来指定要读取共享配置文件的 DataID, 多个文件用, 分隔
使用 refreshable-dataids 指定共享配置文件支持自动刷新

新建配置文件

这里我们作为演示,暂不加入 Namespace,直接在公共空间中创建及测试

创建配置文件nacos-config-share.yml, 详细如下:

  • DataId:nacos-config-share.yml
  • 配置格式:YAML
  • 配置内容:

    server:
        port: 9984
    nacos: 
        share: nacos-config-share

创建共享配置文件 1 shareconfig1.yml, 详细如下:

  • DataId:shareconfig1.yml
  • 配置格式:YAML
  • 配置内容:

    share: 
        config1: 这里是共享配置文件 1 

创建共享配置文件 1 shareconfig2.yml, 详细如下:

  • DataId:shareconfig2.yml
  • 配置格式:YAML
  • 配置内容:

    share: 
        config2: 这里是共享配置文件 2 

创建成功后,配置列表如下图:

启动测试

直接启动项目,如果启动成功。可以看到日志中如下信息:

访问启动类中提供的接口,测试下能否获取到共享配置文件中的值

访问 127.0.0.1:9984/getValue, 返回:nacos-config-share
访问 127.0.0.1:9984/getShare1, 返回:这里是共享配置文件 1
访问 127.0.0.1:9984/getShare2, 返回:这里是共享配置文件 2 

再测试下 refreshable-dataids 配置的自动刷新是否生效

在 Nacos 控制台中修改共享配置文件 shareconfig2.yml 的值为:这里是共享配置文件 2 这里是共享配置文件 2

编辑保存后,重新请求 127.0.0.1:9984/getShare2,观察返回结果如下:

这里是共享配置文件 2 这里是共享配置文件 2

以上返回结果说明通过在配置文件中指定 shared-dataidsrefreshable-dataids是可以实现共享配置文件的读取和自动刷新的。

需求变更

假设现在要读取 shareconfig3.ymlshareconfig4.yml文件但是它的 Group 为 SHARE3_GROUPSHARE4_GROUP, 即共享配置文件与项目自身配置文件不在同一 Group 中(上边的例子是全都在 DEFAULT_GROUP 分组)那如果继续用上边的方法,就无法读取共享配置文件

这时可以使用另一个配置ext-config,它可以由用户自定义指定需要加载的配置DataID、Group 以及是否自动刷新

并且 ext-config 是一个集合(List),支持多个配置文件的指定。

新建共享配置文件

先创建配置配置文件 shareconfig3.ymlshareconfig4.yml,注意他们的 Group 属性

  • DataId:shareconfig3.yml
  • Group:SHARE3_GROUP
  • 配置格式:YAML
  • 配置内容:

    share: 
        config3: 这里是共享配置文件 3,Group:SHARE3_GROUP
  • DataId:shareconfig4.yml
  • Group:SHARE4_GROUP
  • 配置格式:YAML
  • 配置内容:

    share: 
        config4: 这里是共享配置文件 4,Group:SHARE4_GROUP

创建成功页面如下:

修改项目代码

1、在启动类 NacosConfigShareApplication.java 中新增如下代码

    @Value("${share.config3}")
    private String shareConfig3;

    @Value("${share.config4}")
    private String shareConfig4;


    @RequestMapping("/getShare3")
    public String getShare3() {return shareConfig3;}

    @RequestMapping("/getShare4")
    public String getShare4() {return shareConfig4;}

2、修改项目配置文件 bootstrap.yml, 增加ext-config 配置

spring:
  application:
    name: nacos-config-share
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848
      config:
        server-addr: 127.0.0.1:8848
        prefix: ${spring.application.name}
        file-extension: yml
        shared-dataids: shareconfig1.yml,shareconfig2.yml
        refreshable-dataids: shareconfig1.yml,shareconfig2.yml
        ext-config:
          - data-id: shareconfig3.yml
            group: SHARE3_GROUP
            refresh: true
          - data-id: shareconfig4.yml
            group: SHARE4_GROUP
            refresh: true

启动进行测试

项目经过修改后,可以看到

  1. 项目自身的 nacos 配置文件属于 DEFAULT_GROUP 下, 默认读取
  2. shareconfig1.yml,shareconfig2.yml 都属于 DEFAULT_GROUP 下,通过 shared-dataids 指定进行读取
  3. shareconfig3.yml,shareconfig4.yml 都属于 非 DEFAULT_GROUP下,通过 ext-config 配置属性进行自定义读取

启动项目,测试所有的配置文件是否可以正常读取

访问 127.0.0.1:9984/getValue, 返回:nacos-config-share
访问 127.0.0.1:9984/getShare1, 返回:这里是共享配置文件 1
访问 127.0.0.1:9984/getShare2, 返回:这里是共享配置文件 2 这里是共享配置文件 2
访问 127.0.0.1:9984/getShare3, 返回:这里是共享配置文件 3,Group:SHARE3_GROUP
访问 127.0.0.1:9984/getShare4, 返回:这里是共享配置文件 4,Group:SHARE4_GROUP

修改 shareconfig4.yml 的配置内容为:这里是共享配置文件 4,Group:SHARE4_GROUP, 支持自动刷新,保存后,再次调用 127.0.0.1:9984/getShare4,返回如下:

这里是共享配置文件 4,Group:SHARE4_GROUP, 支持自动刷新

调用接口后发现,两种共享配置的加载方式都可以正常读取,并且可以一起使用。ext-config的方式实现了用户自定义配置共享配置文件。

总结

上面的 demo 已经演示 Nacos 共享配置的两种实现方式,两种方式针对不同的场景,总结如下:

  • shared-dataids方式:

    • 适合于共享配置文件与项目默认配置文件处于相同 Group 时,直接两条命令就可以搞定
    • 优点:配置方便
    • 缺点:只能在同一 Group 中
  • ext-config方式:

    • 它可以由开发者自定义要读取的共享配置文件的 DataId、Group、refresh 属性,这样刚好解决了 shared-dataids 存在的局限性。
    • 优点:可以与 shared-dataids 方案结合使用,用户自定义配置。灵活性强
    • 缺点:配置容易出错,要熟悉 YAML 语法

可见两种方式各有长处,所以如果在开发中需要使用共享配置,大家可以是具体情况而定选择自己最合适的方案。

本文源码:https://github.com/larscheng/…


  • 文章作者: LarsCheng
  • 文章链接: 本文首发于个人博客:https://www.larscheng.com/nac…
  • 发布方式:OpenWrite 最懂你的科技自媒体管理平台
  • 版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 LarsCheng’s Blog!

正文完
 0