飞道的博客

SpringCloud:使用Nacos作为配置中心

282人阅读  评论(0)

目录

一、nacos配置中心简介

二、nacos配置实时更新及同一个微服务不同环境的差异化配置

准备工作

 针对商品微服务实现实时更新(以商品微服务为例)

三、nacos同一个微服务不同环境的共享配置

同一个微服务修改配置才能访问不同环境

四、nacos不同微服务的共享配置

bootstrap.yml

五、nacos的命名空间&组


一、nacos配置中心简介

作用:nacos配置中心为了帮助解决配置文件反复修改的问题

首先我们来看一下,微服务架构下关于配置文件的一些问题:

  1. 配置文件相对分散。在一个微服务架构下,配置文件会随着微服务的增多变的越来越多,而且分散 在各个微服务中,不好统一配置和管理。

  2. 配置文件无法区分环境。微服务项目可能会有多个环境,例如:测试环境、预发布环境、生产环 境。每一个环境所使用的配置理论上都是不同的,一旦需要修改,就需要我们去各个微服务下手动 维护,这比较困难。

  3. 配置文件无法实时更新。我们修改了配置文件之后,必须重新启动微服务才能使配置生效,这对一 个正在运行的项目来说是非常不友好的。 基于上面这些问题,我们就需要配置中心的加入来解决这些问题。

配置中心的思路是:

  • 首先把项目中各种配置全部都放到一个集中的地方进行统一管理,并提供一套标准的接口。

  • 当各个服务需要获取配置的时候,就来配置中心的接口拉取自己的配置。

  • 当配置中心中的各种参数有更新的时候,也能通知到各个服务实时的过来同步最新的信息,使之动 态更新。

二、nacos配置实时更新及同一个微服务不同环境的差异化配置

准备工作

启动nacos

 在微服务公共模块中引入nacos的依赖

注:由于配置中心的依赖在多个微服务中都需要引入,所以此处建议将其加入到common公共模块中。

<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>


  
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0"
  3. xmlns:xsi= "http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation= "http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  5. <parent>
  6. <artifactId>spcloud-shop </artifactId>
  7. <groupId>com.cdl </groupId>
  8. <version>1.0-SNAPSHOT </version>
  9. </parent>
  10. <modelVersion>4.0.0 </modelVersion>
  11. <artifactId>shop-common </artifactId>
  12. <!--依赖-->
  13. <dependencies>
  14. <!-- 用于连接数据库-->
  15. <!-- <dependency>-->
  16. <!-- <groupId>org.springframework.boot</groupId>-->
  17. <!-- <artifactId>spring-boot-starter-data-jpa</artifactId>-->
  18. <!-- </dependency>-->
  19. <dependency>
  20. <groupId>org.projectlombok </groupId>
  21. <artifactId>lombok </artifactId>
  22. </dependency>
  23. <dependency>
  24. <groupId>com.alibaba </groupId>
  25. <artifactId>fastjson </artifactId>
  26. <version>1.2.56 </version>
  27. </dependency>
  28. <dependency>
  29. <groupId>mysql </groupId>
  30. <artifactId>mysql-connector-java </artifactId>
  31. <version>5.1.44 </version>
  32. </dependency>
  33. <!--nacos客户端:注册中心的依赖-->
  34. <dependency>
  35. <groupId>com.alibaba.cloud </groupId>
  36. <artifactId>spring-cloud-starter-alibaba-nacos-discovery </artifactId>
  37. </dependency>
  38. <!--nacos的配置中心-->
  39. <dependency>
  40. <groupId>com.alibaba.cloud </groupId>
  41. <artifactId>spring-cloud-starter-alibaba-nacos-config </artifactId>
  42. </dependency>
  43. <!--fegin组件-->
  44. <dependency>
  45. <groupId>org.springframework.cloud </groupId>
  46. <artifactId>spring-cloud-starter-openfeign </artifactId>
  47. </dependency>
  48. </dependencies>
  49. </project>

访问一下nacos

 针对商品微服务实现实时更新(以商品微服务为例)

不能使用原来的application.yml作为配置文件,而是新建一个bootstrap.yml作为配置文件

配置文件优先级(由高到低):

bootstrap.properties -> bootstrap.yml -> application.properties -> application.ym

bootstrap.yml


  
  1. spring:
  2. application:
  3. name: shop-product
  4. cloud:
  5. nacos:
  6. config:
  7. server-addr: localhost:8848 # nacos的服务端地址
  8. file-extension: yml # 配置文件格式
  9. profiles:
  10. active: dev # 环境标识

在nacos中添加配置

示例:

 实操:

 新建配置成功

我们实现了配置的远程存放,但是此时如果修改了配置,我们的程序是无法读取到 的,因此,我们需要开启配置的动态刷新功能。 

方式一:硬编码方式

NacosConfigController 


  
  1. package com.cdl.shopproduct.Controller;
  2. import org.springframework.beans.factory.annotation.Autowired;
  3. import org.springframework.context.ConfigurableApplicationContext;
  4. import org.springframework.web.bind.annotation.GetMapping;
  5. import org.springframework.web.bind.annotation.RequestMapping;
  6. import org.springframework.web.bind.annotation.RestController;
  7. @RestController
  8. @RequestMapping("/nacos-config")
  9. public class NacosConfigController {
  10. @Autowired
  11. private ConfigurableApplicationContext applicationContext;
  12. //1 硬编码方式
  13. @GetMapping("/test1")
  14. public String nacosConfingTest1 () {
  15. return applicationContext.getEnvironment().getProperty( "config.appName");
  16. }
  17. }

运行项目 访问测试代码

 读的内容是配置中心的

测试一下实时效果,修改配置中心

 访问页面刷新

 由此可见,实现了可实时更新(不需要重启项目就能更新)

方式二: 注解方式(推荐)

NacosConfigController 

@RefreshScope//只需要在需要动态读取配置的类上添加此注解就可以


  
  1. package com.cdl.shopproduct.Controller;
  2. import org.springframework.beans.factory.annotation.Autowired;
  3. import org.springframework.beans.factory.annotation.Value;
  4. import org.springframework.cloud.context.config.annotation.RefreshScope;
  5. import org.springframework.context.ConfigurableApplicationContext;
  6. import org.springframework.web.bind.annotation.GetMapping;
  7. import org.springframework.web.bind.annotation.RequestMapping;
  8. import org.springframework.web.bind.annotation.RestController;
  9. @RestController
  10. @RequestMapping("/nacos-config")
  11. @RefreshScope
  12. public class NacosConfigController {
  13. @Autowired
  14. private ConfigurableApplicationContext applicationContext;
  15. //1 硬编码方式
  16. @GetMapping("/test1")
  17. public String nacosConfingTest1 () {
  18. return applicationContext.getEnvironment().getProperty( "config.appName");
  19. }
  20. @Value("${config.appName}")
  21. private String appName;
  22. //2 注解方式
  23. @GetMapping("/test2")
  24. public String nacosConfingTest2 () {
  25. return appName;
  26. }
  27. }

三、nacos同一个微服务不同环境的共享配置

同一个微服务修改配置才能访问不同环境

 修改bootstrap.yml

 

 同一个微服务的不同环境之间共享配置

不管切哪个环境访问的都是一个配置

可对应这种情况

 共享配置文件的名字必须和spring的应用名(bootstrap.yml 中的名字)一致

新建一个共享配置

 增加测试的代码

NacosConfigController 


  
  1. package com.cdl.shopproduct.Controller;
  2. import org.springframework.beans.factory.annotation.Autowired;
  3. import org.springframework.beans.factory.annotation.Value;
  4. import org.springframework.cloud.context.config.annotation.RefreshScope;
  5. import org.springframework.context.ConfigurableApplicationContext;
  6. import org.springframework.web.bind.annotation.GetMapping;
  7. import org.springframework.web.bind.annotation.RequestMapping;
  8. import org.springframework.web.bind.annotation.RestController;
  9. @RestController
  10. @RequestMapping("/nacos-config")
  11. @RefreshScope
  12. public class NacosConfigController {
  13. @Autowired
  14. private ConfigurableApplicationContext applicationContext;
  15. //1 硬编码方式
  16. @GetMapping("/test1")
  17. public String nacosConfingTest1 () {
  18. return applicationContext.getEnvironment().getProperty( "config.appName");
  19. }
  20. @Value("${config.appName}")
  21. private String appName;
  22. //2 注解方式
  23. @GetMapping("/test2")
  24. public String nacosConfingTest2 () {
  25. return appName;
  26. }
  27. //3 读取shop-product所有环境共享配置
  28. @Value("${config.os}")
  29. private String os;
  30. @RequestMapping("/test3")
  31. public String nacosConfingTest3 () {
  32. return os;
  33. }
  34. }

此时

 修改bootstrap.yml为dev

 读取bootstrap.yml的信息

 读取共享配置

 覆盖配置:

 

注意:此时的共享配置只针对于商品微服务

四、nacos不同微服务的共享配置

对应这种情况

 将三个微服务共有的配置信息加到公有的配置文件中去

这个共享配置的文件名可以随便取

还是以商品微服务为例子,读取公共微服务的配置信息,此时修改bootstrap.yml

以前是这样子加的

 显示已经过期了的,不推荐使用

bootstrap.yml


  
  1. spring:
  2. application:
  3. name: shop-product
  4. cloud:
  5. nacos:
  6. config:
  7. server-addr: localhost:8848 # nacos的服务端地址
  8. file-extension: yml # 配置文件格式
  9. # shared-dataids: all-service.yml # 配置要引入的配置
  10. # refreshable-dataids: all-service.yml # 配置要实现动态配置刷新的配置
  11. extension-configs[0]:
  12. data-id: all-service.yml
  13. group: DEFAULT_GROUP
  14. refresh: true
  15. shared-configs[0]:
  16. data-id: all-service.yml
  17. group: DEFAULT_GROUP
  18. refresh: true
  19. profiles:
  20. active: dev # 环境标识

写测试代码

NacosConfigController 


  
  1. package com.cdl.shopproduct.Controller;
  2. import org.springframework.beans.factory.annotation.Autowired;
  3. import org.springframework.beans.factory.annotation.Value;
  4. import org.springframework.cloud.context.config.annotation.RefreshScope;
  5. import org.springframework.context.ConfigurableApplicationContext;
  6. import org.springframework.web.bind.annotation.GetMapping;
  7. import org.springframework.web.bind.annotation.RequestMapping;
  8. import org.springframework.web.bind.annotation.RestController;
  9. @RestController
  10. @RequestMapping("/nacos-config")
  11. @RefreshScope
  12. public class NacosConfigController {
  13. @Autowired
  14. private ConfigurableApplicationContext applicationContext;
  15. //1 硬编码方式
  16. @GetMapping("/test1")
  17. public String nacosConfingTest1 () {
  18. return applicationContext.getEnvironment().getProperty( "config.appName");
  19. }
  20. @Value("${config.appName}")
  21. private String appName;
  22. //2 注解方式
  23. @GetMapping("/test2")
  24. public String nacosConfingTest2 () {
  25. return appName;
  26. }
  27. //3 读取shop-product所有环境共享配置
  28. @Value("${config.os}")
  29. private String os;
  30. @RequestMapping("/test3")
  31. public String nacosConfingTest3 () {
  32. return os;
  33. }
  34. //4 读取不同环境共享配置
  35. @Value("${config.rabbitMQ}")
  36. private String ip;
  37. @RequestMapping("/test4")
  38. public String nacosConfingTest4 () {
  39. return ip;
  40. }
  41. }

五、nacos的命名空间&组

nacos的几个概念

  • 命名空间(Namespace) 命名空间可用于进行不同环境的配置隔离。一般一个环境划分到一个命名空间

  • 配置分组(Group) 配置分组用于将不同的服务可以归类到同一分组。一般将一个项目的配置分到一组

  • 配置集(Data ID) 在系统中,一个配置文件通常就是一个配置集。一般微服务的配置就是一个配置集

 

 新建命名空间

 新建成功

 将public中的克隆一份到test中

 克隆成功

 

 要访问到修改后的166的 修改bootstrap.yml文件

 

 重启项目

进行分组

 成功

 修改bootstap.yml

 启动项目

此时会报错

 只需补全

 成功

 


转载:https://blog.csdn.net/weixin_62735525/article/details/128111564
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场