扫二维码与项目经理沟通
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流
本篇内容主要讲解“Nacos配置中心实际操作”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Nacos配置中心实际操作”吧!
成都创新互联坚持“要么做到,要么别承诺”的工作理念,服务领域包括:成都网站制作、成都做网站、企业官网、英文网站、手机端网站、网站推广等服务,满足客户于互联网时代的汝南网站设计、移动媒体设计的需求,帮助企业找到有效的互联网解决方案。努力成为您成熟可靠的网络建设合作伙伴!
一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。
通俗解释就是:Nacos是一个注册中心&配置中心
关于Nacos注册中心的功能,在Nacos注册中心实战篇中,阿鉴已经给大家详细介绍了,今天我们就来看看配置中心如何使用吧~
在介绍Nacos注册中心实战时,阿鉴已经介绍并搭建好了Nacos集群,这里就直接使用当时的Nacos集群了。
引入依赖
在my-goods
项目引入config
依赖
com.alibaba.cloud spring-cloud-starter-alibaba-nacos-config
编辑配置
spring: application: name: my-goods cloud: nacos: config: server-addr: 192.168.2.11:8850 username: nacos password: nacos
在nacos新建配置文件并编写配置
由于我们的配置中并未指定命名空间,所以默认使用
public
命名空间
Data ID: 在什么都没有配置的情况下,Data ID为「服务名」或者「服务名.文件扩展名」,也就是
my-goods
或者my-goods.properties
(我们也没有配置文件扩展名,默认为properties
)Group: 默认为
DEFAULT_GROUP
配置格式:即为文件格式,默认为
properties
配置内容:文件格式是
properties
, 配置内容即为properties
格式写法
编写代码
@RestController @RequestMapping("/goods") public class GoodsController { @Value("${goods}") public String goods; @GetMapping("/config") public String config(){ return "this goods is " + goods; } }
启动服务测试
此时已经读取到远程的配置
Nacos作为配置中心,将配置放在远端管理只是基础能力,更重要的是还提供了方便快捷的动态刷新配置功能。
修改代码
要想使得配置具有自动刷新的能力,只需要在对应的类加上@RefreshScope
注解即可
@RefreshScope @RestController @RequestMapping("/goods") public class GoodsController { @Value("${goods}") public String goods; @GetMapping("/config") public String config(){ return "this goods is " + goods; } }
修改Nacos上的配置
修改配置:apple -> banana
发布完之后可以看到控制台中出现监听到配置变更的输出
2021-05-09 22:45:13.103 INFO 5930 --- [168.1.11_8850] c.a.n.client.config.impl.ClientWorker : [fixed-114.116.212.76_8850] [polling-resp] config changed. dataId=my-goods, group=DEFAULT_GROUP 2021-05-09 22:45:13.104 INFO 5930 --- [168.1.11_8850] c.a.n.client.config.impl.ClientWorker : get changedGroupKeys:[my-goods+DEFAULT_GROUP]
再次调用接口
可以看到配置已经发生了变更
一般来说,在我们开发项目时,都会区分环境,比如开发环境、测试环境、生产环境,每个环境配置都会有些许不同,比如MySQL配置。那我们就会在配置文件中增加以下配置:
spring: profiles: active: dev
此时Nacos将增加新的Data ID: 服务名-环境名.文件扩展名
即为 my-goods-dev.properties
修改代码
@RefreshScope @RestController @RequestMapping("/goods") public class GoodsController { @Value("${goods}") public String goods; @Value("${price}") public String price; @GetMapping("/config") public String config(){ return "this goods is " + goods + ", and price is " + price; } }
新增配置
增加一个新的data id 为my-goods-dev.properties
配置
重启项目测试
如果在my-goods-dev.properties
配置中增加goods=lemon
的配置,那么此时my-goods
的和my-goods-dev.properties
的goods
配置哪个会生效呢?
在my-goods-dev.properties
中增加goods=lemon
的配置
直接测试,此时无须重启项目
从测试结果看出,Nacos的优先级和Spring的优先级相同,带环境名的配置优先
虽然本篇一直只用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配置中心实际操作”有了更深的了解,不妨来实际操作一番吧!这里是创新互联网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流