惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

T
Threat Research - Cisco Blogs
NISL@THU
NISL@THU
A
Arctic Wolf
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
S
Schneier on Security
T
Tenable Blog
I
Intezer
S
Securelist
Scott Helme
Scott Helme
V
Visual Studio Blog
Simon Willison's Weblog
Simon Willison's Weblog
Google DeepMind News
Google DeepMind News
T
The Blog of Author Tim Ferriss
D
Darknet – Hacking Tools, Hacker News & Cyber Security
AWS News Blog
AWS News Blog
H
Hackread – Cybersecurity News, Data Breaches, AI and More
MongoDB | Blog
MongoDB | Blog
L
LangChain Blog
F
Fortinet All Blogs
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
C
Cisco Blogs
L
Lohrmann on Cybersecurity
M
MIT News - Artificial intelligence
G
GRAHAM CLULEY
博客园 - 司徒正美
aimingoo的专栏
aimingoo的专栏
雷峰网
雷峰网
MyScale Blog
MyScale Blog
D
DataBreaches.Net
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
Recent Announcements
Recent Announcements
C
CXSECURITY Database RSS Feed - CXSecurity.com
量子位
博客园 - 三生石上(FineUI控件)
P
Proofpoint News Feed
Blog — PlanetScale
Blog — PlanetScale
云风的 BLOG
云风的 BLOG
大猫的无限游戏
大猫的无限游戏
GbyAI
GbyAI
Cisco Talos Blog
Cisco Talos Blog
Security Latest
Security Latest
Project Zero
Project Zero
K
Kaspersky official blog
罗磊的独立博客
Know Your Adversary
Know Your Adversary
T
The Exploit Database - CXSecurity.com
P
Privacy International News Feed
P
Privacy & Cybersecurity Law Blog
C
Cyber Attacks, Cyber Crime and Cyber Security
Apple Machine Learning Research
Apple Machine Learning Research

Java技术经验分享

生产故障处理SOP分享 | Java技术经验分享 系统稳定性建设实践总结【转载】 | Java技术经验分享 valine访问leancloud国际版异常,评论失效修复 | Java技术经验分享 匆匆忙忙的2021 | Java技术经验分享 聊一下换工作 | Java技术经验分享 IoT系列(2):WIFI设备常见配网方案介绍 | Java技术经验分享 IoT系列(1):什么是物联网 | Java技术经验分享 Java8特性2 - StreamApi | Java技术经验分享 Java8特性1 - lambda表达式&函数式接口 | Java技术经验分享 设计模式(5)-适配器模式 | Java技术经验分享 设计模式(4)-建造者模式 | Java技术经验分享 设计模式(3)-原型模式与浅拷贝和深拷贝 | Java技术经验分享 设计模式(2)-工厂模式图文介绍 | Java技术经验分享 设计模式(1)-带你了解3类8种单例模式 | Java技术经验分享 Java时间处理5---Java8中时区相关类库介绍 | Java技术经验分享 Java时间处理4---Java8中LocalDate、LocalTime、LocalDateTime介绍 | Java技术经验分享 Java时间处理3---Java8中Instant、Duration、Period、Clock介绍 | Java技术经验分享 一些有意思的问答 | Java技术经验分享 Nacos系列博客说明 | Java技术经验分享 菜鸡程序员的2019年度总结 | Java技术经验分享 Java中“附近的人”实现方案讨论及代码实现 | Java技术经验分享 Java时间处理2----时区TimeZone类方法探究(Java8以前) | Java技术经验分享 Java时间处理1----Date和Calendar方法探究(Java8以前) | Java技术经验分享 FastJson中JSONString、JavaBean、JSONObject、JSONArray的转换关系及API示例 | Java技术经验分享 2019.11软考软件设计师归来心得体会及复习备考指南 | Java技术经验分享 你还没用过“约定式提交”吗?那你赶紧来补补知识吧 | Java技术经验分享 教你如何看懂UML中的类图及类图中的关系 | Java技术经验分享 设计模式总览 | Java技术经验分享 萌新入门Github请看这里,学不会远程教 | Java技术经验分享 Hexo的工作原理探究 | Java技术经验分享 Hexo-theme-butterfly修改调整记录教程 | Java技术经验分享 排序8:基数排序 | Java技术经验分享 排序7:归并排序 | Java技术经验分享 排序6:快速排序 | Java技术经验分享 排序5:冒泡排序 | Java技术经验分享 排序4:堆排序 | Java技术经验分享 排序3:选择排序 | Java技术经验分享 排序2:希尔排序 | Java技术经验分享 排序1:直接插入排序 | Java技术经验分享 推荐一款博客一文多发的良心工具OpenWrite | Java技术经验分享 近期学习计划 | Java技术经验分享 Nacos(九):Nacos集群部署和遇到的问题 | Java技术经验分享 Nacos(八):Nacos持久化 | Java技术经验分享 Nacos(六):多环境下如何“管理”及“隔离”配置和服务 | Java技术经验分享 Nacos(五):多环境下如何“读取”Nacos中相应的配置 | Java技术经验分享 Nacos(四):SpringCloud项目中接入Nacos作为配置中心 | Java技术经验分享 Nacos(三):Nacos与OpenFeign的对接使用 | Java技术经验分享 Nacos(二):SpringCloud项目中接入Nacos作为注册中心 | Java技术经验分享 Nacos(一):Nacos介绍 | Java技术经验分享 20190719小组分享 | Java技术经验分享 Java中equals和HashCode方法的分析 | Java技术经验分享 Java中==和equals方法的分析 | Java技术经验分享 Java中的自动拆装箱、装箱缓存 | Java技术经验分享 About-blog | Java技术经验分享 Java中的编译、反编译和反编译工具全家桶分享 | Java技术经验分享 finalize()的生命周期(执行过程) | Java技术经验分享 Java关键字之final、finally与finalize方法 | Java技术经验分享 Java中重写、重载 | Java技术经验分享 Java中面向对象的三大特征:继承、封装、多态 | Java技术经验分享 DockerFile介绍 | Java技术经验分享 Docker环境下安装Gitlab | Java技术经验分享 Docker中私有仓库的搭建流程 | Java技术经验分享 Centos7下两种方式安装Docker-CE | Java技术经验分享 Vert.x创建一个Http服务 | Java技术经验分享 Vert.x创建TCP服务端及客户端 | Java技术经验分享 Vert.x Core(二)- Event Bus(事件总线) | Java技术经验分享 Vert.x-Core(一)- 基础篇 | Java技术经验分享 SpringBoot项目中实现国际化 | Java技术经验分享 Vert.x介绍 | Java技术经验分享 毕设选题项目本地运行环境搭建教程 | Java技术经验分享 Jupyter Notebooks的安装和使用介绍 | Java技术经验分享 算法笔试题:1元,5元,10元,20元,50元、100元面值人民币组合给定x元的问题 | Java技术经验分享 Quartz学习总结 | Java技术经验分享 SpringBoot2.x集成Redis | Java技术经验分享 SpringBoot2.x集成MongoDB | Java技术经验分享 [SpringCloud学习] - 浅谈微服务架构 | Java技术经验分享 基于hexo和coding免费搭建个人博客网站 | Java技术经验分享 Hello World | Java技术经验分享
Nacos(七):Nacos共享配置 | Java技术经验分享
文章作者: LarsCheng · 2019-08-07 · via Java技术经验分享

前言

前景回顾:

前几章已经基本介绍了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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
@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

1
2
3
4
5
6
7
8
9
10
11
12
13
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
  • 配置内容:
    1
    2
    3
    4
    server:
    port: 9984
    nacos:
    share: nacos-config-share

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

  • DataId:shareconfig1.yml
  • 配置格式:YAML
  • 配置内容:
    1
    2
    share: 
    config1: 这里是共享配置文件1

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

  • DataId:shareconfig2.yml
  • 配置格式:YAML
  • 配置内容:
    1
    2
    share: 
    config2: 这里是共享配置文件2

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

shareconfig

启动测试

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

startup

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

1
2
3
访问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

  • 配置内容:

    1
    2
    share: 
    config3: 这里是共享配置文件3,Group:SHARE3_GROUP
  • DataId:shareconfig4.yml

  • Group:SHARE4_GROUP

  • 配置格式:YAML

  • 配置内容:

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

创建成功页面如下:

shareconfig34

修改项目代码

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
@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配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
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配置属性进行自定义读取

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

1
2
3
4
5
访问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-learning-demo/tree/master/Nacos

参考

SpringCloud Alibaba - Nacos Config 自定义共享配置