共享配置
虽然本篇一直只用my-goods
这一个服务做案例,但是大家不要忘了,我们这其实是一个微服务系统,在一个微服务系统里,总有些配置是会被许多服务共同使用的,比如Redis的配置。
如果每个服务都在自己的配置里单独维护同样的Redis配置,当Redis配置发生变更时,那么每个服务都要改一次,想想其实也是挺恶心的。
为了解决这个问题,Nacos同样贴心的给我们提供了另一种配置方式:共享配置
- 编辑配置文件
增加shared-configs
,并将data-id设置为redis.yaml
(可定义, 但必须要有文件扩展名)
spring: application: name: my-goods profiles: active: dev cloud: nacos: config: server-addr: 114.116.212.76:8850 username: nacos password: nacos shared-configs: - data-id: redis.yaml refresh: true
refresh: true表示动态刷新配置
此时文件扩展名即为data-id的后缀名
- 在nacos中增加配置
调皮的小伙伴可以试试这里「配置格式」配成
Properties
会发生什么
- 编写代码
@RefreshScope @RestController @RequestMapping("/goods") @RequiredArgsConstructor public class GoodsController { @Value("${redis}") public String redis; @GetMapping("/redis") public String redis(){ return "redis url is " + redis; } }
细心的小伙伴可能会说:哎呀呀,你这啥redis配置呀,假的吧!对,大家就假装认为我写了个redis配置就好啦~
- 重启项目测试
扩展配置
扩展配置和共享配置的使用方式相同,增加extension-configs
即可
spring: cloud: nacos: config: server-addr: 114.116.212.76:8850 username: nacos password: nacos shared-configs: - data-id: redis.yaml refresh: true extension-configs: - data-id: extension.yaml refresh: true
扩展配置的优先级比共享配置优先级高一些
命名空间
Nacos中还有一个命名空间的概念,不同命名空间的配置相互隔离,相信大家也发现了,在测试案例中,我们一直使用的是一个public
的命名空间,这是Nacos的默认命名空间。
通常我们会以项目名做命名空间进行区分,来试试吧~
- 假设我们现在做一个商城项目,新建命名空间
mall
- 将
public
命名空间的配置克隆到mall
中 - 修改配置
spring: application: name: my-goods profiles: active: dev cloud: nacos: config: server-addr: 114.116.212.76:8850 username: nacos password: nacos namespace: mall shared-configs: - data-id: redis.yaml refresh: true extension-configs: - data-id: extension.yaml refresh: true
此时就只会读取mall命名空间下的配置啦
文件扩展名与配置文件名
讲到现在,我们用的文件扩展名和配置文件名(data id)依旧是默认的properties
和服务名
,如果小伙伴想要修改的话可以修改file-extension
和prefix
file-extension
: 文件扩展名
prefix
: data-id的前缀,默认为服务名
优雅使用
我们现在已经学会了如何使用@Value加@RefreshScope实现动态刷新配置,但是不得不说这种方式并不优雅。
可以设想一下,凡是在@Value的地方都要加一个@RefreshScope注解,而且平常一个配置可能在多个地方使用,最后就会变成到处都是@RefreshScope, 要多难看就难看。
当然,Nacos也提供了一个@NacosValue加@NacosConfigurationProperties方式让我们可以不需要再使用@RefreshScope注解,但阿鉴觉得这种方式对系统侵入性太强了。
所以,阿鉴推荐使用@ConfigurationProperties方式管理配置进行使用。
- 新建配置类, 在配置类上加上@RefreshScope注解
@Data @RefreshScope @ConfigurationProperties(prefix = "fruit") public class GoodsProperties { private String name; private double price; private int number; }
- 使用
@RestController @RequestMapping("/goods") public class GoodsController { @Autowired private GoodsProperties goodsProperties; @GetMapping("/all") public String all(){ String result = "name: %s, price: %s, number: %s"; return String.format(result, goodsProperties.getName(), goodsProperties.getPrice(), goodsProperties.getNumber()); } }
- 此时
GoodsController
可以不再加@RefreshScope注解了
优先级全测试
到现在,我们已经认识了许多的配置格式了,先来总结一下有哪些吧
- 服务名
- 服务名.文件扩展名
- 服务名-环境.文件扩展名
- 扩展配置
- 共享配置
那么,它们的优先级是如何的呢?
这里,为了方便展示效果,阿鉴先告诉大家优先级是怎样的:
共享配置 < 扩展配置 < 服务名 < 服务名.文件扩展名 < 服务名-环境.文件扩展名
- 修改配置
spring: application: name: my-goods profiles: active: dev cloud: config: server-addr: 114.116.212.76:8850 username: nacos password: nacos namespace: mall shared-configs: - data-id: redis.yaml refresh: true - data-id: share.properties refresh: true extension-configs: - data-id: extension.properties refresh: true
- 编写代码
@RefreshScope @RestController @RequestMapping("/goods") @RequiredArgsConstructor public class GoodsController { /** * 测试配置优先级 */ @Value("${filename}") public String filename; @GetMapping("/filename") public String filename(){ return "now filename is " + filename; } }
- 在Nacos中建出以下配置文件
nacos中不允许文件为空,所以随便在里面写点什么就行
- 先在共享配置
share.properties
文件中增加配置filename=share.properties
- 开始测试
紧接在,分别依次在extension.properties
文件中增加filename=extension.properties
配置,my-goods
文件中增加filename=my-goods
配置,my-goods.properties
文件中增加filename=my-goods.properties
配置,my-goods-dev.properties
文件中增加filename=my-goods-dev
配置
效果图如下:
小结
今天阿鉴给大家介绍了Nacos配置中心的功能,关于Nacos的动态配置刷新,多种配置方式,以及如何优雅的使用它,最后还给大家测试了所有配置的优先级:共享配置 < 扩展配置 < 服务名 < 服务名.文件扩展名 < 服务名-环境.文件扩展名。希望小伙伴们有所收获。
那么,Nacos的基本功能到这里就介绍完啦,我们下篇再见~