微服务系列:nacos配置中心实战

水深无声 2022-10-22 11:58 471阅读 0赞

文章目录

  • 前言
  • 一、官方文档
  • 二、nacos环境说明
  • 三、作为配置中心使用
    • 1.添加依赖:
    • 2、bootstrap.properties配置
    • 3、在命名空间bank1下添加配置文件
  • 四、效果测试
    • 1、项目启动
    • 2、获取配置
    • 3、刷新配置
  • 五、思考
  • 总结

前言

上一篇文章对nacos的功能和安装部署做了些简单介绍,今天介绍下nacos作为配置中心,如何在spring cloud中使用。


一、官方文档

官方文档:https://nacos.io/zh-cn/docs/quick-start-spring-cloud.html

二、nacos环境说明

安装的nacos版本为NACOS2.0.0-BETA
没有采用默认的public命名空间。
新建命名空间bank1,并新建用户nacos_bank1,新建角色bank1_admin,在权限管理界面中,给角色bank1_admin绑定bank1命名空间的读写权限。
在这里插入图片描述
在这里插入图片描述

三、作为配置中心使用

新建spring boot工程bank1,测试Nacos作为配置中心的使用。
通过 Nacos Server 和 spring-cloud-starter-alibaba-nacos-config 实现配置的动态变更。

1.添加依赖:

  1. <dependency>
  2. <groupId>com.alibaba.cloud</groupId>
  3. <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
  4. <version>${latest.version}</version>
  5. </dependency>

注意:版本 2.1.x.RELEASE 对应的是 Spring Boot 2.1.x 版本。版本 2.0.x.RELEASE 对应的是 Spring Boot 2.0.x 版本,版本 1.5.x.RELEASE 对应的是 Spring Boot 1.5.x 版本。

更多版本对应关系参考:版本说明 Wiki

spring-cloud-starter-alibaba-nacos-config和spring boot的版本对应关系,我更推荐直接通过maven仓库查看,更加直接明了。
在maven仓库官网搜索spring-cloud-starter-alibaba-nacos-config。
这里我选择了下载次数最多的版本2.2.1.RELEASE。然后查看下面的依赖。
在这里插入图片描述
spring-cloud-starter-alibaba-nacos-config 2.2.1.RELEASE的版本依赖。
在这里插入图片描述
所以spring-boot-starter-parent版本,我选择了2.2.5.RELEASE。
完整的依赖为:

  1. <parent>
  2. <groupId>org.springframework.boot</groupId>
  3. <artifactId>spring-boot-starter-parent</artifactId>
  4. <version>2.2.5.RELEASE</version>
  5. <relativePath/> <!-- lookup parent from repository -->
  6. </parent>
  7. <groupId>com.laowan</groupId>
  8. <artifactId>spring-cloud</artifactId>
  9. <version>0.0.1-SNAPSHOT</version>
  10. <name>bank1</name>
  11. <description>实战spring cloud</description>
  12. <properties>
  13. <java.version>1.8</java.version>
  14. <skipTests>true</skipTests>
  15. </properties>
  16. <dependencies>
  17. <!--nacos配置中心-->
  18. <dependency>
  19. <groupId>com.alibaba.cloud</groupId>
  20. <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
  21. <version>2.2.1.RELEASE</version>
  22. </dependency>
  23. <dependency>
  24. <groupId>org.springframework.boot</groupId>
  25. <artifactId>spring-boot-starter</artifactId>
  26. </dependency>
  27. <dependency>
  28. <groupId>org.springframework.boot</groupId>
  29. <artifactId>spring-boot-starter-web</artifactId>
  30. </dependency>
  31. <dependency>
  32. <groupId>org.projectlombok</groupId>
  33. <artifactId>lombok</artifactId>
  34. <optional>true</optional>
  35. </dependency>
  36. <dependency>
  37. <groupId>org.springframework.boot</groupId>
  38. <artifactId>spring-boot-starter-test</artifactId>
  39. <scope>test</scope>
  40. </dependency>
  41. </dependencies>

注意:这里的版本依赖关系非常重要,不然项目启动会直接出现jar包冲突的异常,导致启动失败。

2、bootstrap.properties配置

bootstrap.properties 中配置 Nacos server 的地址和应用名

  1. spring.application.name=bank1
  2. server.port=8010
  3. spring.profiles.active=dev
  4. spring.cloud.nacos.username=nacos_bank1
  5. spring.cloud.nacos.password=123456
  6. spring.cloud.nacos.config.server-addr=localhost:8848
  7. spring.cloud.nacos.config.namespace=a284481e-b623-4c7d-a65a-e9009cba5f57

说明:之所以需要配置 spring.application.name ,是因为它是构成 Nacos 配置管理 dataId字段的一部分。
这里的spring.cloud.nacos.config.namespace指定的属性就是对应Nacos 配置管理 中的命名空间bank1的id值:a284481e-b623-4c7d-a65a-e9009cba5f57。

注意:
这里一定要在bootstrap.properties中配置配置中心的相关属性,而不能直接在application.properties中配置。原因是bootstrap.properties会在application.properties之前加载。具体bootstrap和application的区别自己可以网上找资料查看下。

这里用户命和密码需要配置在bootstrap.properties中才能生效,如果配置在application.properties中,启动时读取不到对应的属性。
这样因为这里的认证类SecurityProxy中读取的属性是BootstrapPropertySource 。根据名称就知道,这里加载的是Bootstrap中的属性。

  1. spring.cloud.nacos.username
  2. spring.cloud.nacos.password

在这里插入图片描述
在这里插入图片描述

3、在命名空间bank1下添加配置文件

在 Nacos Spring Cloud 中,dataId 的完整格式如下:

  1. ${prefix}-${spring.profiles.active}.${file-extension}

说明:
1、prefix 默认为 spring.application.name 的值,也可以通过配置项spring.cloud.nacos.config.prefix来配置。
2、spring.profiles.active 即为当前环境对应的 profile,详情可以参考 Spring Boot文档。 注意:当 spring.profiles.active 为空时,对应的连接符 - 也将不存在,dataId 的拼接格式变成 p r e f i x . {prefix}. prefix.{file-extension}
3、file-exetension 为配置内容的数据格式,可以通过配置项 spring.cloud.nacos.config.file-extension 来配置。目前只支持 properties 和 yaml 类型。

选择bank1命名空间,点击加号➕
在这里插入图片描述

新建配置文件:
其中Data ID为bank1-dev.properties 需要注意Data ID的命名规则。
Group一般都是采用默认值。
配置格式采用Properties。个人习惯,不是太喜欢使用YAML,格式比较难调整,格式错误难发现,属性搜索也不是很方便。
配置内容:bank.name=bank1 dev
在这里插入图片描述

4、通过@Value使用属性

  1. @RestController
  2. @RequestMapping("/config")
  3. public class ConfigController {
  4. @Value("${bank.name}")
  5. private String bankName;
  6. @RequestMapping("/get")
  7. public String get() {
  8. return bankName;
  9. }
  10. }

5、添加@RefreshScope注解

  1. @Slf4j
  2. @SpringBootApplication
  3. @RefreshScope
  4. public class Bank1Application {
  5. public static void main(String[] args) {
  6. SpringApplication.run(Bank1Application.class, args);
  7. log.info("bank1服务启动成功");
  8. }
  9. }

四、效果测试

1、项目启动

  1. 2021-03-19 17:31:29.285 INFO 45872 --- [ main] b.c.PropertySourceBootstrapConfiguration : Located property source: [BootstrapPropertySource {name='bootstrapProperties-bank1-dev.properties,DEFAULT_GROUP'}, BootstrapPropertySource {name='bootstrapProperties-bank1.properties,DEFAULT_GROUP'}, BootstrapPropertySource {name='bootstrapProperties-bank1,DEFAULT_GROUP'}]
  2. 2021-03-19 17:31:29.305 INFO 45872 --- [ main] com.laowan.bank1.Bank1Application : The following profiles are active: dev

在这里插入图片描述
在启动日志中发现,同时加载了bootstrapProperties-bank1-dev.properties和bootstrapProperties-bank1.properties的文件。

注意:
bank1.properties会先于bank1-dev.properties被程序加载,后加载的属性会覆盖先加载的属性。所以2个文件中如果有相同的属性,最终bank1-dev.properties中的才会生效。
利用这个特性,我们一般会存放一些通用的公共属性放在bank1.properties文件中。

示例:
在这里插入图片描述
bank1.properties 公共属性
bank1-dev.properties 开发环境属性
bank1-test.properties 测试环境属性
bank1-pro.properties 生产环境属性

2、获取配置

请求链接:http://localhost:8010/config/get
在这里插入图片描述
成功获取到配置。

3、刷新配置

在nacos中修改配置:

  1. bank.name=bank1 dev update

不重启项目,直接重新请求http://localhost:8010/config/get获取配置。发现配置刷新成功。
在这里插入图片描述

五、思考

1、多环境如何共用一个nacos服务?

  • 相同命名空间:

简单的使用,只需在相同命名空间下利用Data ID中的spring.profiles.active属性来区分即可。
缺点主要是访问权限不能放开控制。多个环境的文件在同一个命名空间,容易出现误操作。

  • 不同命名空间:
    可以如下,分别建立名称为dev,test,pro的命名空间。这种情况下,可以忽略spring.profiles.active属性的作用,利用命名空间来区分不同的属性环境。
    在这里插入图片描述
    项目中bootstrap.properties的配置文件对应关系:
    公共属性配置:
    在这里插入图片描述
    dev属性配置:
    在这里插入图片描述
    bootstrap-dev.properties的配置说明:

    spring.cloud.nacos.username=nacos-dev(dev环境对应的用户)
    spring.cloud.nacos.password=123456
    spring.cloud.nacos.config.server-addr=localhost:8848(dev对应访问地址)
    spring.cloud.nacos.config.namespace=dev对应命名空间id

2、多环境下怎么独立使用各自的nacos服务?
实际项目中,开发环境,测试环境,生产环境一般都有比较严格的网络隔离和访问权限控制,同时为了避免属性误操作,不可能共用同一个nacos服务。
可以参考上面不同命名空间的处理:
在这里插入图片描述
3、nacos的命名空间是以项目为纬度,还是以开发环境、测试环境等环境为纬度控制好?
由于考虑到真实环境下,开发环境,生产环境等不同配置环境一般不会使用同一套nacos服务,往往都是各自独立部署。
所以同一个项目,利用命名空间来分环境控制配置属性这样的使用场景非常有限,意义不是很大。所以建议命名空间以项目为纬度就可以了。

总结

本文主要介绍了Nacos作为配置中心在Spring boot项目中的使用。
主要需要注意一下几点:
1、spring-cloud-starter-alibaba-nacos-config和Spring boot的版本依赖关系。如果版本对应出错,会出现依赖冲突问题。
2、注意在Nacos控制台添加配置时,Data ID的命名规则: p r e f i x − {prefix}- prefix−{spring.profiles.active}.${file-extension}
3、Nacos的权限管理的粒度是命名空间级别。一定要注意配置的用户具有对应命名空间的读写权限。
4、在拓展思考中,说明了多环境下Nacos作为配置中心的使用方式。

发表评论

表情:
评论列表 (有 0 条评论,471人围观)

还没有评论,来说两句吧...

相关阅读

    相关 Nacos配置中心实战

    > 大家好,我是邵奈一,一个不务正业的程序猿、正儿八经的斜杠青年。 > 1、世人称我为:被代码耽误的诗人、没天赋的书法家、五音不全的歌手、专业跑龙套演员、不合格的运动员…