Nacos - 配置管理(4.2)

5.2.3 支持配置的动态更新

基于上面快速上手的例子,若要实现配置的动态更新,只需要进行如下改造:

// 注入配置文件上下文
@Autowired
private ConfigurableApplicationContext applicationContext;
@GetMapping(value = "/configs")
public String getConfigs(){
return applicationContext.getEnvironment().getProperty("common.name");
}

我们通过nacos控制台更新common.name的配置值,再次访问web端点/configs,发现应用程序能够获取到最新的配置值,说明spring-cloud-starter-alibaba-nacos-config 支持配置的动态更新。
Note 可以通过配置spring.cloud.nacos.config.refresh.enabled=false来关闭动态刷新

5.2.4 自定义 namespace与group配置

支持自定义 namespace的配置
在没有明确指定 ${spring.cloud.nacos.config.namespace} 配置的情况下, 默认使用的是 Nacos 上 Public 这个namespace。如果需要使用自定义的命名空间,可以通过以下配置来实现:

spring:
  cloud:
    nacos:
      config:
        namespace: b3404bc0‐d7dc‐4855‐b519‐570ed34b62d7

Note:该配置必须放在 bootstrap.yml文件中。此外 spring.cloud.nacos.config.namespace 的值是 namespace对应的 id,id 值可以在 Nacos 的控制台获取。并且在添加配置时注意不要选择其他的 namespae,否则将会导致读取不到正确的配置。

支持自定义 Group 的配置
在没有明确指定 ${spring.cloud.nacos.config.group} 配置的情况下, 默认使用的是 DEFAULT_GROUP 。如果需要自定义自己的 Group,可以通过以下配置来实现:

spring:
  cloud:
    nacos:
      config:
        group: DEVELOP_GROUP

Note:该配置必须放在 bootstrap.properties 文件中。并且在添加配置时 Group 的值一定要和spring.cloud.nacos.config.group 的配置值一致。

5.2.5 自定义扩展的 Data Id 配置

Spring Cloud Alibaba Nacos Config可支持自定义 Data Id 的配置。 一个完整的配置案例如下所示:
下边我们在service2微服务下配置扩展。

spring:
  application:
    name: service2
  cloud:
    nacos:
      config:
        server‐addr: 127.0.0.1:8848
# config external configuration
# 1、Data Id 在默认的组 DEFAULT_GROUP,不支持配置的动态刷新
        ext‐config[0]:
          data‐id: ext‐config‐common01.properties
# 2、Data Id 不在默认的组,不支持动态刷新
        ext‐config[1]:
          data‐id: ext‐config‐common02.properties
          group: GLOBALE_GROUP
# 3、Data Id 既不在默认的组,也支持动态刷新
        ext‐config[2]:
          data‐id: ext‐config‐common03.properties
          group: REFRESH_GROUP

          refresh: true

可以看到:

  • 通过 spring.cloud.nacos.config.ext-config[n].data-id 的配置方式来支持多个 Data Id 的配置。
  • 通过 spring.cloud.nacos.config.ext-config[n].group 的配置方式自定义 Data Id 所在的组,不明确配置的话,默认是 DEFAULT_GROUP。
  • 通过 spring.cloud.nacos.config.ext-config[n].refresh 的配置方式来控制该 Data Id 在配置变更时,是否支持应用中可动态刷新, 感知到最新的配置值。默认是不支持的。

Note : spring.cloud.nacos.config.ext-config[n].data-id 的值必须带文件扩展名,文件扩展名既可支持properties,又可以支持 yaml/yml。 此时spring.cloud.nacos.config.file-extension 的配置对自定义扩展配置的 Data Id 文件扩展名没有影响。

通过自定义扩展的 Data Id 配置,既可以解决多个应用间配置共享的问题,又可以支持一个应用有多个配置文件。

测试:
配置ext-config-common01.properties:


QQ截图20191230134435.png

配置ext-config-common02.properties


QQ截图20191230134813.png

配置ext-config-common03.properties
QQ截图20191230134836.png

编写测试代码:
@GetMapping(value = "/configs2")
public String getConfigs2(){
String name = applicationContext.getEnvironment().getProperty("common.name");
String age = applicationContext.getEnvironment().getProperty("common.age");
String address = applicationContext.getEnvironment().getProperty("common.address");
String birthday= applicationContext.getEnvironment().getProperty("common.birthday");
String fullname = applicationContext.getEnvironment().getProperty("common.fullname");
return name+"+"+ age+"+"+address+"+"+ birthday+"+"+ fullname;
}

重启应用,访问http://localhost:56011/configs2,观察配置是否成功获取。
输出:

service2 config+12+beijing+1990‐1‐1+zhangsansanff
5.2.6 自定义共享 Data Id 配置

为了更加清晰的在多个应用间配置共享的 Data Id ,你可以通过以下的方式来配置:

spring:
  cloud:
    nacos:
      config:
        shared‐dataids: ext‐config‐common01.properties,ext‐config‐common02.properties
          refreshable‐dataids: ext‐config‐common01.properties

可以看到:

  • 通过spring.cloud.nacos.config.shared-dataids 来支持多个共享 Data Id 的配置,多个之间用逗号隔开。
  • 通过 spring.cloud.nacos.config.refreshable-dataids 来支持哪些共享配置的 Data Id 在配置变化时,应用中是否可动态刷新, 感知到最新的配置值,多个 Data Id 之间用逗号隔开。如果没有明确配置,默认情况下所有共享配置的 Data Id 都不支持动态刷新。

Note:通过 spring.cloud.nacos.config.shared-dataids 来支持多个共享配置的 Data Id 时, 多个共享配置间的一个优先级的关系我们约定:按照配置出现的先后顺序,即后面的优先级要高于前面。
Note:通过 spring.cloud.nacos.config.shared-dataids 来配置时,Data Id 必须带文件扩展名,文件扩展名既可支持 properties,也可以支持 yaml/yml。 此时 spring.cloud.nacos.config.file-extension 的配置对自定义扩展配置的 Data Id 文件扩展名没有影响。
Note: spring.cloud.nacos.config.refreshable-dataids 给出哪些需要支持动态刷新时,Data Id 的值也必须明确给出文件扩展名。

测试输出:

service2 config+12+beijing+null+null

为什么后边两个值为null?

共享DataId的配置使用默认的group即DEFAULT_GROUP,ext-config-common02.properties不属于DEFAULT_GROUP。
共享DataId的配置相比扩展的 Data Id 配置,它把group固定为DEFAULT_GROUP,建议使用扩展的 Data Id 配置,因为扩展的 Data Id 配置也可以实现共享DataId配置。

5.2.7 配置的优先级

Spring Cloud Alibaba Nacos Config 目前提供了三种配置能力从 Nacos 拉取相关的配置。

  • A: 通过 spring.cloud.nacos.config.shared-dataids支持多个共享 Data Id 的配置
  • B: 通过 spring.cloud.nacos.config.ext-config[n].data-id 的方式支持多个扩展 Data Id 的配置,多个Data Id 同时配置时,他的优先级关系是spring.cloud.nacos.config.ext-config[n].data-id 其中 n 的值越大,优先级越高。
  • C: 通过内部相关规则(应用名、扩展名 )自动生成相关的 Data Id 配置
    当三种方式共同使用时,他们的一个优先级关系是:C > B >A

测试,屏蔽共享dataId,放开ext-config,如下:

spring:
  application:
    name: service2
  cloud:
    nacos:
      config:
        server‐addr: 127.0.0.1:8848 # 配置中心地址
        file‐extension: yaml
        namespace: c67e4a97‐a698‐4d6d‐9bb1‐cfac5f5b51c4 # 开发环境
        group: TEST_GROUP
# shared‐dataids: ext‐config‐common01.properties,ext‐config‐common02.properties
# config external configuration
# 1、Data Id 在默认的组 DEFAULT_GROUP,不支持配置的动态刷新
        ext‐config[0]:
          data‐id: ext‐config‐common01.properties
# 2、Data Id 不在默认的组,不支持动态刷新
        ext‐config[1]:
          data‐id: ext‐config‐common02.properties
          group: GLOBALE_GROUP
# 3、Data Id 既不在默认的组,也支持动态刷新
        ext‐config[2]:
          data‐id: ext‐config‐common03.properties
          group: REFRESH_GROUP
          refresh: true

修改ext-config-common03.properties:


QQ截图20191230140249.png

输出:

service2 config aaa+15+beijing+1990‐1‐1+zhangsansanff

通过测试发现多个 Data Id 同时配置时,他的优先级关系是spring.cloud.nacos.config.ext-config[n].data-id其中 n 的值越大,优先级越高。

修改:service1.yaml


QQ截图20191230140358.png

输出:

service2 config aaa+25+beijing+1990‐1‐1+zhangsansanff

通过测试发现:B和C同时存在,C优先级高。

5.2.8 完全关闭配置

通过设置 spring.cloud.nacos.config.enabled = false 来完全关闭 Spring Cloud Nacos Config

5.3 Nacos集群部署

5.3.1 集群部署

3个或3个以上Nacos节点才能构成集群
(1)安装3个以上Nacos
我们可以复制之前已经解压好的nacos文件夹,分别命名为nacos、nacos1、nacos2
(2)配置集群配置文件
在所有nacos目录的conf目录下,有文件 cluster.conf.example ,将其命名为 cluster.conf ,并将每行配置成ip:port。(请配置3个或3个以上节点)

# ip:port
127.0.0.1:8848
127.0.0.1:8849
127.0.0.1:8850

由于是单机演示,需要更改nacos/的conf目录下application.properties中server.port,防止端口冲突。如果服务器有多个ip也要指定具体的ip地址,如:nacos.inetutils.ip-address=127.0.0.1
例如:

server.port=8850
nacos.inetutils.ip‐address=127.0.0.1

(3)集群模式启动
分别执行nacos目录的bin目录下的startup:

startup ‐m cluster
QQ截图20191230140709.png

在任意一个nacos的控制台中,可以看到如下内容:


QQ截图20191230140735.png
5.3.2 客户端配置

所有客户端,分别指定nacos集群中的若干节点:

spring:
  application:
    name: xxxx
  cloud:
    nacos:
      config:
        server‐addr: 127.0.0.1:8848,127.0.0.1:8849,127.0.0.1:8850

测试,使用快速上手的例子:
(1)关掉127.0.0.1:8848 nacos Leader实例,发现Leader被成功选举至127.0.0.1:8850
(2)紧接着重新启动Provider,这时马上请求consumer的/service出现错误,发现consumer与provider通信已经出现问题。但经过短暂的时间后,通信恢复。

通过测试,我们可以看到,通过以上的集群部署已经达到了高可用的效果。

5.3.3 生产环境部署建议

下图是官方推荐的集群方案,通过域名 + VIP模式的方式来实现。客户端配置的nacos,当Nacos集群迁移时,客户端配置无需修改。


QQ截图20191230141017.png

至于数据库,生产环境下建议至少主备模式。通过修改${nacoshome}/conf/application.properties文件,能够使nacos拥有多个数据源。

spring.datasource.platform=mysql
db.num=2
db.url.0=jdbc:mysql://127.0.0.1:3306/nacos_config?characterEncoding=utf8&autoReconnect=true
db.url.1=jdbc:mysql://127.0.0.1:3306/nacos_config?characterEncoding=utf8&autoReconnect=true
db.user=root
db.password=root
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,874评论 6 479
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,151评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,270评论 0 342
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,137评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,116评论 5 370
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,935评论 1 283
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,261评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,895评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,342评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,854评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,978评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,609评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,181评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,182评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,402评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,376评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,677评论 2 344

推荐阅读更多精彩内容