51工具盒子

依楼听风雨
笑看云卷云舒,淡观潮起潮落

Spring Cloud Alibaba 系列之 Nacos 篇(配置中心)

一、前言 {#一、前言}

上一篇 Spring Cloud Alibaba 系列之 Nacos 篇(服务注册与发现) 介绍了 Nacos 的服务注册与发现,本篇接续介绍其另一个功能--配置中心。

二、简单介绍 {#二、简单介绍}

Nacos 提供用于存储配置和其他元数据功能,为分布式系统中的外部化配置提供服务器端和客户端支持,使用 Spring Cloud Alibaba Nacos Config 就可以在 Nacos Server 集中管理 Spring Cloud 应用的外部属性配置。

2.1 实现目的 {#2.1-实现目的}

不使用配置中心之前,我们在管理项目配置会遇到如下问题:

  1. 配置文件相对分散。在一个微服务架构下,配置文件会随着微服务的增多变的越来越多,而且分散在各个微服务中,不好统一配置和管理。
  2. 配置文件无法区分环境。微服务项目可能会有多个环境,例如:测试环境、预发布环境、生产环境。每一个环境所使用的配置理论上都是不同的,一旦需要修改,就需要我们去各个微服务下手动维护,这比较困难。
  3. 配置文件无法实时更新。我们修改了配置文件之后,必须重新启动微服务才能使配置生效,这对一个正在运行的项目来说是非常不友好的。

这些问题通过使用 Nacos 的配置中心功能快捷、简便的解决。

2.2 基础概念 {#2.2-基础概念}

为了区分环境或项目间的配置,我们需要了解 Nacos 给出的如下3个概念:

命名空间(Namespace)

|-----------|--------------------------------------------| | 1 | 命名空间可用于进行不同环境的配置隔离。一般一个环境划分到一个命名空间 |

配置分组(Group)

|-----------|----------------------------------------------| | 1 | 配置分组用于将不同的服务可以归类到同一分组。一般将一个项目的配置分到一组 |

配置集(Data ID)

|-----------|----------------------------------------------| | 1 | 在系统中,一个配置文件通常就是一个配置集。一般微服务的配置就是一个配置集 |

其中,这三者的关系如下图:

上边都是一堆定义和文字,无法真实感受到 Nacos 作为配置中心的功效,下边开始通过实战演练加深大家对 Nacos 的认知。

三、实战演练 {#三、实战演练}

首要条件就是启动 Nacos 的服务环境。我们使用上一篇文章搭建好的 Nacos 服务,不清楚的读者可以先移步至上一篇浏览前置内容。

3.1 基础配置 {#3.1-基础配置}

搭建名为 nacos-config-testSpring Boot 项目。
注意:Spring Boot、Spring Cloud 与 Spring Cloud Alibaba 版本依赖关系

第一步,添加依赖:

|---------------------------------------------------------------------------------------------------------------------------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 | <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency> </dependencies> <dependencyManagement> <dependencies> <!-- spring cloud 依赖 --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>Hoxton.SR3</version> <type>pom</type> <scope>import</scope> </dependency> <!-- spring cloud alibaba 依赖--> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-alibaba-dependencies</artifactId> <version>2.2.1.RELEASE</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> |

第二步,创建 bootstrap.propertiesbootstrap.yaml文件:

使用配置中心后,我们通常会把 application.propertiesapplication.yaml中的配置移植到 Nacos 服务上,但项目连接配置中心服务需要单独配置,因此需要用到 bootstrap.propertiesbootstrap.yml文件。

其中,这 4 种文件的加载顺序由高到低依次是:
bootstrap.properties -> bootstrap.yml -> application.properties -> application.yml

我们配置如下:

|-------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | 1 2 3 4 5 6 7 8 | spring.application.name=nacos-config spring.cloud.nacos.username=nacos spring.cloud.nacos.password=nacos spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848 spring.cloud.nacos.config.server-addr=127.0.0.1:8848 |

第三步,移植配置数据:

即将 application.propertiesapplication.yml 中的业务配置数据移植到配置中心服务上。

本次演练,我们使用如下配置数据进行测试:

|---------------|-------------------------------------------------------------------------| | 1 2 3 | database.url=xxx database.username=root database.password=riger |

登录Nacos管理后台,管理配置 -> 配置列表,,操作如下图:

新建配置 界面中,Data ID 通常对应 spring.application.name 的值 + (.properties 或 .yaml)。

数据配置格式,目前只支持 propertiesyaml

第三步,创建测试类:

用于封装上文在 Nacos 服务上配置的数据

|---------------------------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | 1 2 3 4 5 6 7 8 9 10 11 12 13 | @Data @Component @ConfigurationProperties(prefix = "database") public class DataBaseConfig { private String url; private String username; private String password; private String env; } |

用于测试获取配置数据

|------------------------------------------------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | @RestController @RefreshScope public class ConfigController { @Autowired private DataBaseConfig dataBaseConfig; @Value("${database.url}") private String url; @RequestMapping("/getConfig") public DataBaseConfig getConfig() { return dataBaseConfig; } @RequestMapping("/getUrl") public String getUrl() { return url; } } |

接下来进行接口请求测试,启动项目,请求 http://localhost:8080/getConfig 结果如下图:

成功请求获取配置中心的数据。

3.2 动态刷新 {#3.2-动态刷新}

所谓动态刷新就是在不重启项目的基础上,修改配置中心的数据,项目能立即获取最新数据,接下来我们操作一遍:

将配置数据改成:

|---------------|----------------------------------------------------------------------------------| | 1 2 3 | database.url=xxxyyy database.username=rootyyy database.password=rigeryyy |

修改配置后,不重启项目,再次请求接口,成功获取修改后的配置数据。

3.3 环境隔离 {#3.3-环境隔离}

项目开发一般分为,开发、测试、预发和生产这4个阶段,每个阶段都有对应的配置数据(数据库、redis、MQ 连接配置等),这些数据都各不相同,为了更好的区分和维护这些数据,环境隔离功能必不可少。

那配置中心如何做环境隔离呢?需要用到上文提到的命名空间,操作如下:

第一步,登录 Nacos 管理后台,命名空间菜单,新建一个名为 TEST 的命名空间:

该命名空间就作为测试环境的专属空间。

第二步,在新建的命名空间下,创建一个配置:

|-----------------|-------------------------------------------------------------------------------------------| | 1 2 3 4 | database.url=xxx database.username=root database.password=riger database.env=TEST |

第三步,修改项目中的 bootstrap.propertiesbootstrap.yml文件,新增:

|-----------|----------------------------------------------------------------------------------| | 1 | spring.cloud.nacos.config.namespace=fea20266-ae0e-4401-b686-de0fe63c1856 |

其中,spring.cloud.nacos.config.namespace的值就是创建 TEST 命名空间生成的 id 值。

最后,重启项目,请求接口,结果如下图:

成功请求 TEST 命名空间下的配置数据。

3.4 数据持久化 {#3.4-数据持久化}

Nacos 默认情况下是采用 apache derby 内嵌数据库进行数据存储,在单机模式时可以使用 Nacos 嵌入式数据库实现数据存储,但是 derby 数据库不方便观察数据存储的基本情况,从 Nacos 0.7 版本开始增加了支持 mysql 数据源能力。

接下来,我们实现持久化功能。

第一步,创建名为 nacos_config 的数据库,在 Nacos 的程序包下,有个 conf 目录,将里边的 nacos-mysql.sql 导入到新建的数据库中。

第二步,修改 conf/application.properties 的数据库连接配置:

将注释打开:

|-------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | 1 2 3 4 5 6 7 8 | spring.datasource.platform=mysql db.num=1 # 注意修改数据库名、账号和密码 db.url.0=jdbc:mysql://127.0.0.1:3306/nacos_config?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC db.user.0=root db.password.0=tiger |

第三步,重启 Nacos 服务,再次访问 http://localhost:8848/nacos ,如下图:

登录发现,之前配置的数据都消失,因为我们更换了存储源(MySQL)。现在数据库中的数据都是空的,在 Nacos 管理后台中,我们尝试新建一条配置:

|---------------|-------------------------------------------------------------------------| | 1 2 3 | database.url=abc database.username=root database.password=riger |

保存后,查看数据库信息,如下图:

配置数据成功持久化。

3.5 集群部署 {#3.5-集群部署}

为保证配置中心的高可用性,集群部署是必不可少的整合方案。

我们在本地测试,将 Nacos 安装包拷贝成 3 份,在持久化模式的基础上,操作步骤如下:

第一步,将 Nacos 程序包下的 conf/cluster.conf.example 改名为 conf/cluster.conf,修改内容:

|---------------|------------------------------------------------------| | 1 2 3 | 127.0.0.1:8801 127.0.0.1:8802 127.0.0.1:8803 |

第二步,修改 3 份 Nacos 安装包下的 conf/application.properties 文件,将 server.port 依次改成 880188028803

保存后,启动 3 份 Nacos 即可:

|-----------------------|------------------------------------------------------------------------------| | 1 2 3 4 5 6 7 | cd nacos/bin # windows 单机模式启动 ./startup.cmd # linux/mac ./startup.sh |

注意,启动命令无需加 -m standalone 参数

引申问题:Nacos 做了集群,有 3 个访问地址,客户端如何配置请求呢?有 2 种请求方案:

  1. 修改 spring.cloud.nacos.discovery.server-addr=127.0.0.1:8801,127.0.0.1:8802,127.0.0.1:8803
  2. 使用 Nginx 反向代理 Nacos 集群。

四、参考资料 {#四、参考资料}

Nacos 官方文档

赞(1)
未经允许不得转载:工具盒子 » Spring Cloud Alibaba 系列之 Nacos 篇(配置中心)