一、背景介绍
nacos 作为服务注册中心的使用方式,同时 nacos 还可以作为服务配置中心,用于集中式维护各个业务微服务的配置资源。
作为服务配置中心的交互流程图如下。

这样设计的目的,有一个明显的好处就是:有利于对各个微服务的配置资源进行统一维护和管理,尤其是要更新某个配置参数时,能避免大量人肉运维工作。
今天通过一些案例我们一起来了解一下,如何使用 nacos 来实现服务配置中心的管理。
二、方案实践
2.1、创建配置
nacos 安装过程与之前介绍的一样,nacos 服务端启动后,进入到服务端管理页面,在“配置列表”功能页面中,点击右上角的“+”按钮,进入“新建配置”页面,创建配置内容,示例如下:


为了便于演示,在上文中我们创建了一个 dataid 为nacos-config-client.properties,group 为default_group,内容为blog.name=张三的配置信息。
在下文中,我们将会用到它。
2.2、创建客户端应用
首先,创建一个 maven 工程,命名为nacos-config-client,并在pom.xml中引入相关的依赖内容,示例如下:
<properties>
<spring-boot.version>2.2.5.release</spring-boot.version>
<spring-cloud.version>hoxton.sr3</spring-cloud.version>
<spring-cloud-alibaba.version>2.2.1.release</spring-cloud-alibaba.version>
</properties>
<dependencies>
<!-- springboot web -->
<dependency>
<groupid>org.springframework.boot</groupid>
<artifactid>spring-boot-starter-web</artifactid>
</dependency>
<!-- nacos 配置中心 -->
<dependency>
<groupid>com.alibaba.cloud</groupid>
<artifactid>spring-cloud-starter-alibaba-nacos-config</artifactid>
</dependency>
</dependencies>
<dependencymanagement>
<dependencies>
<!-- 引入 springboot 版本号 -->
<dependency>
<groupid>org.springframework.boot</groupid>
<artifactid>spring-boot-dependencies</artifactid>
<version>${spring-boot.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!-- 引入 spring cloud 版本号 -->
<dependency>
<groupid>org.springframework.cloud</groupid>
<artifactid>spring-cloud-dependencies</artifactid>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!-- 引入 spring cloud alibaba 适配的版本号 -->
<dependency>
<groupid>com.alibaba.cloud</groupid>
<artifactid>spring-cloud-alibaba-dependencies</artifactid>
<version>${spring-cloud-alibaba.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencymanagement>接着,创建一个服务启动类。
@springbootapplication
public class application {
public static void main(string[] args) {
springapplication.run(application.class,args);
}
}然后,创建一个 web 接口,以便测试上文创建的配置变量是否能生效。
@restcontroller
@refreshscope
public class hellocontroller {
@value("${blog.name}")
private string name;
@requestmapping("/hello")
public string hello() {
return name;
}
}最后,在application.properties配置文件中,添加 nacos 服务配置中心地址,示例如下:
spring.application.name=nacos-config-client server.port=9012 # 设置nacos配置中心地址 spring.cloud.nacos.config.server-addr=127.0.0.1:8848
2.3、服务测试
将nacos-config-client客户端服务启动起来,在浏览器中访问http://127.0.0.1:9012/hello,如果不出意外的话,会返回如下结果。

此时说明 springboot 已成功从 nacos 服务端获取到相关的配置变量。
下面我们在 nacos 中将blog.name配置内容稍微修改一下,验证一下客户端的配置变量是否能动态刷新。

再次访问http://127.0.0.1:9012/hello,返回结果如下图。

说明在 nacos 中修改配置变量后,springboot 也会自动刷新这个配置信息。
之所以能实现这种效果,主要得益于@refreshscope注解,它可以动态的从 nacos 服务端获取最新的配置信息,并将其注入到 springboot 中。
三、配置规则介绍
在上文中,我们简单的介绍了 nacos 作为配置中心的使用方式。
例子中我们只配置了 nacos 的配置中心地址信息,并没有配置任何其他规则就能成功的使用 nacos 配置中心,它是如何做到的呢?
在 nacos spring cloud 中有 5 个核心配置项,下面我们一起来看看它的作用。
spring.cloud.nacos.config.server-addr:对应 nacos 服务端地址spring.cloud.nacos.config.prefix:对应 dataid 的前缀,默认值为应用名称,即spring.application.name变量值spring.cloud.nacos.config.file-extension:对应 dataid 的后缀,同时也是配置内容的文件格式,默认值为propertiesspring.cloud.nacos.config.group:对应 group 参数,默认值为default_groupspring.cloud.nacos.config.namespace:对应配置的命名空间,默认为空;常用于不同环境的配置隔离,如开发测试环境和生产环境的资源隔离等
默认情况下,nacos spring cloud 加载出来的 dataid 完整格式如下:
${spring.application.name}-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}因此,在不做任何配置项目的情况下,当 dataid 的前缀和 spring boot 应用名称一致,就可以成功加载对应的配置项。
如果我们不想通过应用服务名称来加载 dataid,可以借助spring.cloud.nacos.config.prefix相关规则来实现指定配置项的加载。
需要特别注意的是:由于 spring boot 加载顺序的缘故,自定义的配置项参数必须放在bootstrap.properties文件或者bootstrap.yaml文件中才能生效。
下面我们还是通过一个例子,来快速了解 nacos spring cloud 相关配置规则的应用。
3.1、应用实践
下面我们以加载myconfig-dev.yaml配置项为例,具体实现如下。
首先,创建一个myconfig-dev配置项。

接着,创建一个bootstrap.properties文件,并指定相关配置项,内容如下:
spring.application.name=nacos-config-client server.port=9012 # 指定运行环境 spring.profiles.active=dev # 设置nacos配置中心地址 spring.cloud.nacos.config.server-addr=127.0.0.1:8848 # 对应 dataid 的前缀,如果不设置默认取【spring.application.name】 spring.cloud.nacos.config.prefix=myconfig # 对应 dataid 的后缀,同时也是配置内容的文件格式,默认值为properties spring.cloud.nacos.config.file-extension=yaml # 对应 group 参数,默认值为default_group spring.cloud.nacos.config.group=default_group # 对应配置的命名空间,默认为空 spring.cloud.nacos.config.namespace=
然后,创建一个 web 接口,以便验证配置变量是否能生效。
@restcontroller
@refreshscope
public class hellocontroller {
@value("${user.id}")
private string id;
@value("${user.name}")
private string name;
@requestmapping("/test")
public string test() {
return "id" + id + ",name:" + name;
}
}最后,再次启动服务,在浏览器中访问http://127.0.0.1:9012/hello,如果不出意外的话,会返回如下内容。

说明,spring boot 已成功加载了指定配置项。
四、高级特性介绍
4.1、多环境配置介绍
在 nacos 服务端,其实还隐含有三个核心的参数,分别是:data id、group、namespace,我们可以利用它来实现更高级的功能。
这三个参数的层级关系,可以用如下图来概括。

每个参数的作用如下:
namespace:表示命名空间,通常用于不同环境的配置隔离,如开发测试环境和生产环境的资源隔离等group:表示分组管理data id:也就是我们常说的配置项,也可以简单理解为我们所说的配置文件
实际上,我们可以利用这些层级概念的关系,根据自己的需要来实现多环境的管理。
下面我们一起来看看,几种常见的环境隔离配置实现。
4.1.1、profiles 隔离实现
在上文中我们也提到了 dataid 完整格式生成规则。
${spring.application.name}-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}因此,我们可以借助spring.profiles.active来实现配置资源的隔离。

同时,profiles 隔离实现也在一种最常见的做法。
4.1.2、group 隔离实现
group 隔离实现就比较简单了,在 nacos 服务管理平台新建配置的时候,填写所属分组。

最后,在客户端应用下填写对应的 group 参数即可。
# 对应 group 参数 spring.cloud.nacos.config.group=default_group
4.1.3、namespace 隔离实现
namespace 隔离实现主要通过命名空间来完成,在 nacos 服务管理平台的命令空间下创建。

创建完成之后,在配置列表的最上方可以看到除了 public 之外,多了一个刚才创建的 namepsace。

点击test就可以切换到对应的命名空间,然后新建相关的配置项。
最后,在客户端应用下填写对应的 namespace 参数即可。
# 对应配置的命名空间 spring.cloud.nacos.config.namespace=0c85c5cf-4421-4839-9998-ace7d8ecf5a8
需要注意的是,这里填写不是命名空间的名称,而是命名空间id。
4.2、多文件加载介绍
在上文中我们介绍的都是单个配置文件的加载,而在实际的业务开发中,我们常常会碰到多个配置文件一起加载的场景,例如加载 redis、rabbitmq 等配置资源。
下面我们一起来看看相关的实现方式。
4.2.1、多个配置加载介绍
对于多个配置的加载,我们只需要做以下两步,就可以实现这个需求。
第一步:在 nacos 中创建data id=redis.properties和data id=rabbitmq.properties的配置内容。

第二步:在 spring cloud 应用bootstrap.properties文件中,通过spring.cloud.nacos.config.extension-configs参数配置需要加载的文件,具体如下。
# 设置多文件加载,并支持动态刷新 spring.cloud.nacos.config.extension-configs[0].data-id=redis.properties spring.cloud.nacos.config.extension-configs[0].group=default_group spring.cloud.nacos.config.extension-configs[0].refresh=true spring.cloud.nacos.config.extension-configs[1].data-id=rabbitmq.properties spring.cloud.nacos.config.extension-configs[1].group=default_group spring.cloud.nacos.config.extension-configs[1].refresh=true
当服务启动的时候,nacos 客户端会自动从服务端获取相关的配置资源加载到 spring boot 应用中。
4.2.2、共享配置加载介绍
通过上面加载多个配置文件的例子,我们已经可以实现不同的应用共享配置的需求了。
对于共享配置使用,nacos 还提供了另一种更便捷的配置方式,比如下面的配置与上面使用的多文件加载配置,作用是等价的。
# 设置多个共享配置文件加载,并支持动态刷新 spring.cloud.nacos.config.shared-configs[0].data-id=redis.properties spring.cloud.nacos.config.shared-configs[0].group=default_group spring.cloud.nacos.config.shared-configs[0].refresh=true spring.cloud.nacos.config.shared-configs[1].data-id=rabbitmq.properties spring.cloud.nacos.config.shared-configs[1].group=default_group spring.cloud.nacos.config.shared-configs[1].refresh=true
4.2.3、配置加载的优先级介绍
当我们加载多个配置的时候,如果存在相同的 key,配置加载的优先级是怎样的呢?
nacos config 目前提供了三种配置能力从 nacos 拉取相关的配置,分别如下:
- a:通过
spring.cloud.nacos.config.shared-dataids定义的共享配置 - b:通过
spring.cloud.nacos.config.ext-config[n].data-id定义的扩展配置 - c:通过内部相关规则(
应用名、应用名+ profile)生成的配置
当三种方式同时存在的时候,他们的优先级关系为a < b < c,也就是说优先级高的会覆盖优先级底的配置。
最后总结一下:
nacos 是 spring cloud alibaba 体系中最重要的组件之一,既可以用于服务注册中心,也可以用于服务配置中心。
在微服务技术体系中,应用非常广泛,因此掌握 nacos 相关技术的使用,对我们项目的开发会有显著的帮助。
五、实战
1. 安装与启动 nacos
下载 nacos
从 nacos 的 github 仓库(https://github.com/alibaba/nacos/releases)下载适合你系统的版本,解压下载好的压缩包。
启动 nacos
- windows 系统:打开命令提示符,进入 nacos 的
bin目录,执行以下命令启动 nacos:
startup.cmd -m standalone
- linux/mac 系统:打开终端,进入 nacos 的
bin目录,执行以下命令启动 nacos:
这里的 -m standalone 表示以单机模式启动。启动成功后,在浏览器中访问 http://localhost:8848/nacos,使用默认用户名 nacos 和密码 nacos 登录 nacos 控制台。
2. 创建配置
登录 nacos 控制台
打开浏览器,访问 http://localhost:8848/nacos,输入用户名 nacos 和密码 nacos 登录。
创建配置文件
在控制台左侧导航栏中选择 “配置管理” -> “配置列表”,点击 “+” 号创建新的配置。填写以下信息
- data id:配置文件的唯一标识,通常采用
应用名.properties或应用名.yml的格式,例如example-service.properties。 - group:配置分组,默认为
default_group。 - 配置格式:根据实际情况选择
properties或yaml。 - 配置内容:输入具体的配置信息,例如在
example-service.properties中可以添加如下内容:
properties
server.port=8081 spring.datasource.url=jdbc:mysql://localhost:3306/example_db spring.datasource.username=root spring.datasource.password=123456
3. 在微服务中集成 nacos 配置中心
添加依赖
以 spring boot 项目为例,在 pom.xml 中添加 nacos 配置中心的依赖:
<dependency>
<groupid>com.alibaba.cloud</groupid>
<artifactid>spring-cloud-starter-alibaba-nacos-config</artifactid>
</dependency>配置 nacos 客户端
在 src/main/resources 目录下创建 bootstrap.properties 或 bootstrap.yml 文件,添加以下配置:
spring.application.name=example-service spring.cloud.nacos.config.server-addr=localhost:8848 spring.cloud.nacos.config.file-extension=properties
这里的 spring.application.name 要与在 nacos 控制台创建的配置文件的 data id 中的应用名一致,spring.cloud.nacos.config.server-addr 是 nacos 服务器的地址,spring.cloud.nacos.config.file-extension 是配置文件的格式。
获取配置信息
在 spring boot 项目中,可以使用 @value 注解或 @configurationproperties 注解来获取配置信息。
以下是使用 @value 注解的示例:
import org.springframework.beans.factory.annotation.value;
import org.springframework.web.bind.annotation.getmapping;
import org.springframework.web.bind.annotation.restcontroller;
@restcontroller
public class configcontroller {
@value("${server.port}")
private string serverport;
@getmapping("/config")
public string getconfig() {
return "server port: " + serverport;
}
}4. 动态刷新配置
开启动态刷新
在需要动态刷新配置的类上添加 @refreshscope 注解,例如:
import org.springframework.beans.factory.annotation.value;
import org.springframework.boot.context.properties.configurationproperties;
import org.springframework.cloud.context.config.annotation.refreshscope;
import org.springframework.web.bind.annotation.getmapping;
import org.springframework.web.bind.annotation.restcontroller;
@restcontroller
@refreshscope
public class configcontroller {
@value("${server.port}")
private string serverport;
@getmapping("/config")
public string getconfig() {
return "server port: " + serverport;
}
}测试动态刷新
当在 nacos 控制台修改配置信息并发布后,无需重启微服务,调用 /config 接口即可获取到最新的配置信息。
5. 多环境配置管理
创建不同环境的配置文件
在 nacos 控制台分别创建不同环境(如开发、测试、生产)的配置文件,
例如 example-service-dev.properties、example-service-test.properties、example-service-prod.properties。
根据环境加载配置
在 bootstrap.properties 中添加 spring.profiles.active 属性来指定当前环境,例如:
spring.application.name=example-service spring.cloud.nacos.config.server-addr=localhost:8848 spring.cloud.nacos.config.file-extension=properties spring.profiles.active=dev
这样,微服务将加载 example-service-dev.properties 中的配置信息。
通过以上步骤,你就可以使用 nacos 打造一个功能完善的微服务配置中心,实现配置的集中管理和动态刷新。
六、总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。
发表评论