Nacos 提供用于存储配置和其他元数据的 key/value 存储,为分布式系统中的外部化配置提供服务器端和客户端支持。使用 Spring Cloud Alibaba Nacos Config,您可以在 Nacos Server 集中管理你 Spring Cloud 应用的外部属性配置。
Spring Cloud Alibaba Nacos Config 是 Config Server 和 Client 的替代方案,客户端和服务器上的概念与 Spring Environment 和 PropertySource 有着一致的抽象,在特殊的 bootstrap 阶段,配置被加载到 Spring 环境中。当应用程序从开发到测试再到生产时,您可以管理这些环境之间的配置,并确保应用程序具有迁移时需要运行的所有内容。
1. Nacos配置中心搭建的基本流程
前置条件:已经下载 Nacos 并启动 Nacos server。
1.1. 新建module:cloudalibaba-config-nacos-client3377
1. 引入nacos-config配置中心的核心依赖
<dependencies>
<!-- nacos注册中心核心依赖-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
<!--web开发核心依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--服务监控-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
</dependencies>
2. 配置bootstrap.yaml文件。注:因为配置中心需要从外部加载文件信息,所以需要使用加载优先级更高的bootstrap文件
server:
port: 3377
spring:
application:
name: nacos-config-client
cloud:
nacos:
config:
server-addr: localhost:8848 #nacos-server的服务器地址
file-extension: yaml #指定配置文件的后缀。目前只支持properties、yaml。
说明:之所以需要配置 spring.application.name ,是因为它是构成 Nacos 配置管理 dataId字段的一部分。
3. 配置application.yaml文件,指定当前环境对应的 profile
spring:
profiles:
active: dev
在nacos spring cloud中,dataId 的完整格式为:${prefix}-${spring.profiles.active}.${file-extension}
,即就是当我们在业务代码中获取配置信息时,nacos-config会自动通过上面的公式进行拼接,在nacos的配置文件中进行匹配,将我们需要的配置信息返回。
- prefix 默认为 spring.application.name 的值,也可以通过配置项 spring.cloud.nacos.config.prefix来配置。
- spring.profiles.active 即为当前环境对应的 profile,详情可以参考 Spring Boot文档。 注:当不配置spring.profiles.active属性时,对应的连接符 -也将不存在,dataId 的拼接格式变成
${prefix}.${file-extension}
- file-exetension 为配置内容的数据格式,可以通过配置项 spring.cloud.nacos.config.file-extension 来配置。目前只支持 properties 和 yaml 类型。
例如:上面的根据上面的配置信息,可以知道,在匹配配置中心的配置文件时,使用的配置名称(dataId)为 nacos-config-client-dev.yaml,这就要求在配置中心中存在这个文件才行。
4. 创建主启动类:
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class NacosConfigClientMain3377
{
public static void main(String[] args) {
SpringApplication.run(NacosConfigClientMain3377.class, args);
}
}
5. 创建业务类:通过 Spring Cloud 原生注解 @RefreshScope 实现配置自动更新
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RefreshScope //启用Nacos的动态刷新功能。
public class ConfigClientController
{
@Value("${config.info}")
private String configInfo;
@GetMapping("/config/info")
public String getConfigInfo() {
return configInfo;
}
}
1.2. 在Nacos中发布配置文件信息
有两种方式可以在nacos中发布配置信息:通过调用 Nacos Open API 向 Nacos Server 发布配置,或者直接在nacos的控制台中新建配置文件。Open API 官方文档:https://nacos.io/zh-cn/docs/v2/guide/user/open-api.html
1. 在Nacos控制台中新建配置文件:nacos-config-client-dev.yaml
2. 设置DataId、Group(分组)、文件格式,并编写配置文件内容。全部填写完成,确认无误后点击最下方发布按钮即可。
3. 测试配置信息的获取:
- 启动前需要在nacos客户端-配置管理-配置管理栏目下有对应的yaml配置文件
- 运行cloud-config-nacos-client3377的主启动类
- 调用接口查看配置信息 - http://localhost:3377/config/info
4. 自带动态刷新
修改下Nacos中的yaml配置文件,再次调用查看配置的接口,就会发现配置已经刷新。
2. Nacos中部分重要概念及简单使用
2.1. Nacos 概念
1. 配置:也就是配置中心主要的管理对象
在系统开发过程中,开发者通常会将一些需要变更的参数、变量等从代码中分离出来独立管理,以独立的配置文件的形式存在。目的是让静态的系统工件或者交付物(如 WAR,JAR 包等)更好地和实际的物理运行环境进行适配。配置管理一般包含在系统部署的过程中,由系统管理员或者运维人员完成。配置变更是调整系统运行时的行为的有效手段。
2. 配置管理:配置中心的主要功能
系统配置的编辑、存储、分发、变更管理、历史版本管理、变更审计等所有与配置相关的活动。
3. 配置项:配置文件中的一个键值对就是一个配置项
一个具体的可配置的参数及其值域,通常以 key=value 的形式存在。例如我们常配置系统的日志输出级别(logLevel=INFO|WARN|ERROR) 就是一个配置项。
4. 配置集:配置项的集合,一般一个配置文件就是一个配置集
一组相关或者不相关的配置项的集合称为配置集。在系统中,一个配置文件通常就是一个配置集,包含了系统各个方面的配置。例如,一个配置集可能包含了数据源、线程池、日志级别等配置项。
5. 配置集 ID:也就是dataId,是配置集的唯一标识(多个namespace中可以重复)
Nacos 中的某个配置集的 ID。配置集 ID 是组织划分配置的维度之一。Data ID 通常用于组织划分系统的配置集。一个系统或者应用可以包含多个配置集,每个配置集都可以被一个有意义的名称标识。Data ID 通常采用类 Java 包(如 com.taobao.tc.refund.log.level)的命名规则保证全局唯一性。此命名规则非强制。
6. 命名空间:用来划分一个新的独立工作区域,各个命名空间之间互不影响
用于进行租户粒度的配置隔离。在不同的命名空间下,可以存在多个相同的 Group 或 Data ID 的配置。Namespace 的常用场景之一是不同环境下配置的区分隔离,例如开发测试环境和生产环境的资源(如配置、服务)隔离等。
7. 配置分组:用来在某个命名空间下划分一个独立的工作空间,这样在同一个命名空间下也可以存在 Data ID 相同的配置集。
Nacos 中的一组配置集,是组织配置的维度之一。通过一个有意义的字符串(如 Buy 或 Trade )对配置集进行分组,从而区分 Data ID 相同的配置集。当您在 Nacos 上创建一个配置时,如果未填写配置分组的名称,则配置分组的名称默认采用 DEFAULT_GROUP 。配置分组的常见场景:不同的应用或组件使用了相同的配置类型,如 database_url 配置和 MQ_topic 配置。
2.2. namespace、group、dataId的配置和使用
2.2.1. group - 配置分组的使用
1. 创建配置文件时给文件设置一个分组即可,分组名为自定义,有意义即可
2. 在bootstrap.yaml中添加group配置
server:
port: 3377
spring:
application:
name: nacos-config-client
cloud:
nacos:
config:
server-addr: localhost:8848
file-extension: yaml
group: TEST_GROUP # 新增group配置项
3. 发送请求:http://localhost:3377/config/info,可以看到在同个namespace下,同时存在同名的配置集的情况下,只需要通过配置group就可以进行配置文件的切换
2.2.2. namespace -命名空间的使用
1. 在nacos中新建一个命名空间
2. 然后在新的命名空间下创建配置集即可,创建方法同上
3. 发送请求:http://localhost:3377/config/info,可以看到在不同namespace下,同时存在同名的配置集的情况下,只需要通过配置namespace和group就可以进行配置文件的切换
2.3. Namespace+Group+Data lD三者关系?为什么这么设计?
Namespace+Group+Data lD三者的包含关系:
默认情况:Namespace=public,Group=DEFAULT_GROUP,默认Cluster是DEFAULT
- Nacos默认的Namespace是public,Namespace主要用来实现隔离。
- 比方说我们现在有三个环境:开发、测试、生产环境,我们就可以创建三个Namespace,不同的Namespace之间是隔离的。
- Group默认是DEFAULT_GROUP,Group可以把不同的微服务划分到同一个分组里面去
- Service就是微服务:一个Service可以包含多个Cluster (集群),Nacos默认Cluster是DEFAULT,Cluster是对指定微服务的一个虚拟划分。
- 比方说为了容灾,将Service微服务分别部署在了杭州机房和广州机房,这时就可以给杭州机房的Service微服务起一个集群名称(HZ) ,给广州机房的Service微服务起一个集群名称(GZ),还可以尽量让同一个机房的微服务互相调用,以提升性能。
- 最后是Instance,就是微服务的实例。
Namespace相当于java中的项目名,Group 相当于java项目中的包名,Data lD相当于是类名。
- namespace: 是可以用于区分部署环境的
- Group和DatalD: 逻辑上区分两个目标对象