Nacos配置管理

什么是配置

我们应用程序在运行过程中需要读取一切配置信息,这些信息会伴随程序的整个生命周期。例如:数据库的配置

什么是配置中心

随着微服务的兴起,配置文件也随之增加并且分散冗余,配置中心就是将配置文件从应用中剥离出来进行统一的管理,不需要我们的服务自己去管理配置。
在这里插入图片描述

配置中心流程
  1. 用户在配置中心更新配置信息。
  2. 服务A和服务B得到配置更新的通知,从配置中心获取配置。
Nacos介绍
主流配置中心对比

目前市面上用的比较多的配置中心有:Spring Cloud Config、Apollo(携程)和Nacos(阿里)等。

对比项目Spring Could ConfiApolloNacos
配置实时推送支持(Spring Cloud Bus)支持(HTTP长轮询1s内)支持(HTTP长轮询1s内)
版本管理支持(Git)支持支持
配置回滚支持(Git)支持支持
灰度发布支持支持不支持
权限管理支持(依赖Git)支持不支持
多集群支持支持支持
多环境支持支持支持
监听查询支持支持支持
多语言只支持Java主流语言,提供了Open API主流语言,提供了Open API
配置格式校验不支持支持支持
单机读(QPS)7(限流所致)900015000
单击写(QPS)5(限流所致)11001800
3节点读 (QPS)21(限流所致)2700045000
3节点写 (QPS)5(限流所致)33005600
  1. 从配置中心角度来看,性能方面Nacos的读写性能最高,Apollo次之,Spring Cloud Config依赖Git场景不适合开 放的大规模自动化运维API。
  2. 功能方面Apollo最为完善,nacos具有Apollo大部分配置管理功能,而Spring Cloud Config不带运维管理界面,需要自行开发。Nacos的一大优势是整合了注册中心、配置中心功能,部署和操作相比 Apollo都要直观简单,因此它简化了架构复杂度,并减轻运维及部署工作。
Nacos简介

Nacos是由阿里开发的开源产品,具有服务注册发现、治理和配置管理的功能。

下面为官方简介

欢迎来到 Nacos 的世界!

Nacos 致力于帮助您发现、配置和管理微服务。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据及流量管理。

Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。 Nacos 是构建以“服务”为中心的现代应用架构 (例如微服务范式、云原生范式) 的服务基础设施。

更多了解Nacos官网:https://nacos.io/zh-cn/docs/what-is-nacos.html

Nacos安装
下载地址:

https://github.com/alibaba/nacos/releases

下载后解压:
unzip nacos‐server‐$version.zip 或者 tar ‐xvf nacos‐server‐$version.tar.gz
启动
  • windows启动

    • 启动命令:

      • cmd startup.cmd 
        
    • 进入安装目录中的bin目录,双击startup.cmd运行文件。

  • Linux/Unix/Mac启动

    • 启动命令(standalone代表着单机模式运行,非集群模式):

      • sh startup.sh -m standalone
        
    • 如果是ubuntu系统,或者运行脚本报错提示[[符号找不到,可尝试如下运行:

      • bash startup.sh -m standalone
        

启动成功,可通过浏览器访问 http://127.0.0.1:8848/nacos/index.html ,打开如下nacos控制台登录页面,默认的用户名密码为:nacos / nacos

登陆成功页面如下:
在这里插入图片描述

关闭
  • Windows方式:

    • cmd shutdown.cmd 
      
    • 双击shutdown.cmd运行文件。

  • Linux/Unix/Mac方式:

    • sh shutdown.sh
      
OPEN API 配置管理测试
发布配置
curl -X POST "http://127.0.0.1:8848/nacos/v1/cs/configs?dataId=nacos.cfg.dataId&group=test&content=HelloWorld"
获取配置
curl -X GET "http://127.0.0.1:8848/nacos/v1/cs/configs?dataId=nacos.cfg.dataId&group=test"
Nacos配置入门
发布配置
  1. 在nacos控制台点击菜单的配置管理中的配置列表中添加

    1. 在这里插入图片描述
  2. 新建配置,配置如下:

    1. 在这里插入图片描述

    2. spring:
          server: 8080
      
  3. 配置成功

    1. 在这里插入图片描述
    2. 在这里插入图片描述
    Nacos客户端获取配置
    1. 新建一个项目,并且引入nacos客户端的坐标

      <!-- https://mvnrepository.com/artifact/com.alibaba.nacos/nacos-client -->
              <dependency>
                  <groupId>com.alibaba.nacos</groupId>
                  <artifactId>nacos-client</artifactId>
                  <version>1.1.4</version>
              </dependency>
      
    2. 获取配置,这里以main方法作为示例

      package com.ag.demo;
      
      import com.alibaba.nacos.api.NacosFactory;
      import com.alibaba.nacos.api.config.ConfigService;
      import com.alibaba.nacos.api.exception.NacosException;
      
      import java.util.Properties;
      
      public class SimpleDemoMain {
      
          public static void main(String[] args) throws NacosException {
              // 使用nacos client获取远程nacos服务器上的配置信息
              // 地址
              String serverAddr = "127.0.0.1:8848";
              // dataId
              String dataId = "nacos.yum";
              // groupId
              String groupId = "DEFAULT_GROUP";
              Properties properties = new Properties();
              properties.put("serverAddr", serverAddr);
              // nacos工厂获取配置
              ConfigService configService = NacosFactory.createConfigService(properties);
              // dataId, groupId, 超时时间
              String config = configService.getConfig(dataId, groupId, 5000);
              System.out.println(config);
          }
      }
      
    3. 运行获取结果:

      spring:
          server: 8080
      
Nacos配置管理
Nacos配置管理模型

在Nacos中它能通过namespace、group、dataId定位一个配置集
在这里插入图片描述

  1. 配置集(dataId)
    • 一个配置文件通常可以看作一个配置集。
  2. 配置项
    • 配置文件中的配置称为配置项
  3. 配置组(groupId)
    • 配置组就是对配置进行分组。如果配有填写配置分组,则默认为用 DEFAULT_GROUP。配置分组一般是用于区分项目,如:电商项目,旅游项目等。
  4. 命名空间(nameSpace)
    • 命名空间对不同的环境配置进行区分,一般会分为:开发环境、测试环境、生产环境
命名控件管理
命名空间简介

命名空间用于隔离多个环境,如:开发、测试、生产,对每个环境进行隔离。

新建命名空间

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

如果没有指定命名空间,那会会使用默认的命名空间public

获取指定命名空间的配置
public static void main(String[] args) throws NacosException {
        // 使用nacos client获取远程nacos服务器上的配置信息
        // 地址
        String serverAddr = "127.0.0.1:8848";
        // namespace 的 id
        String namespace = "6e7c3762-3bd7-44b6-aee9-4db3fb0fc9a9";
        // dataId
        String dataId = "nacos.yum";
        // groupId
        String groupId = "DEFAULT_GROUP";
        Properties properties = new Properties();
        properties.put("serverAddr", serverAddr);
        properties.put("namespace", namespace);
        // nacos工厂获取配置
        ConfigService configService = NacosFactory.createConfigService(properties);
        // dataId, groupId, 超时时间
        String config = configService.getConfig(dataId, groupId, 5000);
        System.out.println(config);
    }
配置管理

Nacos支持namespace和group的配置分组管理,一边我们更灵活的选择适合自己的应用和环境,在配置管理中提供了配置历史版本、回滚、订阅者查询等核心管理能力。

配置监听
public static void main(String[] args) throws NacosException, InterruptedException {
        // 使用nacos client获取远程nacos服务器上的配置信息
        // 地址
        String serverAddr = "127.0.0.1:8848";
        // namespace 的 id
        String namespace = "6e7c3762-3bd7-44b6-aee9-4db3fb0fc9a9";
        // dataId
        String dataId = "nacos.yum";
        // groupId
        String groupId = "DEFAULT_GROUP";
        Properties properties = new Properties();
        properties.put("serverAddr", serverAddr);
        properties.put("namespace", namespace);
        // nacos工厂获取配置
        ConfigService configService = NacosFactory.createConfigService(properties);
        // dataId, groupId, 超时时间
        final String config = configService.getConfig(dataId, groupId, 5000);
        System.out.println(config);
        // String dataId, String group, Listener listener
        configService.addListener(dataId, groupId, new Listener() {
            public Executor getExecutor() {
                return null;
            }
            // 当配置文件有变化的时候,进行通知
            public void receiveConfigInfo(String configInfo) {
                System.out.println(configInfo);
            }
        });


        // 强行不让程序结束
        while (true) {
            Thread.sleep(2000);
        }
    }
Nacos配置管理应用于分布式系统
分布式应用配置管理

在这里插入图片描述

  • 用户通过Nacos server的控制台集中对多个服务的配置进行管理
  • 各个服务从Nacos server中获取各自的配置,并且监听配置的变化
动态更新配置

可以通过配置spring.cloud.nacos.config.refresh.enabled=false来关闭动态刷新

自定义namespace配置

在没有指定namespace的配置下,默认使用的是Nacos上public这个namespace。如果需要使用自定义的命名空间,可以通过一下的配置

spring:
	cloud:
		nacos:
			config:
				namespace: b3404bc0‐d7dc‐4855‐b519‐570ed34b62d7

注意:

  1. 该配置必须放在bootstrap.yml文件中,。
  2. 我们使用的是namespace的id值,对应的id值可以通过Nacos控制台进行获取。
自定义GroupId配置

再没有指定dataId的配置下,默认使用的是DEFAULT_GROUP。如果需要使用自定义的group,可以通过以下的配置

spring:
	cloud:
		nacos:
		config:
			group: DEVELOP_GROUP

注意:

  1. 该配置也要放到bootstrap.yml文件中。
  2. 增加配置时Group的值一定要和spring.cloud.nacos.config.group配置的值一样。
自定义DataId

Spring Cloud Alibaba Nacos Config可支持自定义 Data Id 的配置。

示例如下:

spring:
	application:
		name: service2
	cloud:
		nacos:
			config:
				server‐addr: 127.0.0.1:8848
# config external configuration
# 1、Data Id 在默认的组 DEFAULT_GROUP,不支持配置的动态刷新
				ext‐config[0]:
					data‐id: nacos-test-config1.yml
# 2、Data Id 不在默认的组,不支持动态刷新
				ext‐config[1]:
					data‐id: nacos-test-config2.yml
					group: TEST_GROUP
# 3、Data Id 既不在默认的组,也支持动态刷新
				ext‐config[2]:
					data‐id: nacos-test-config3.yml
					group: DEV_GROUP
					refresh: true

通过测试得出以下结果:

  1. spring.cloud.nacos.config.ext-config[n].data-id可以获取多个DataId的配置。
  2. spring.cloud.nacos.config.ext-config[n].group可以获取自定义DataId所在的组,如果不明确,默认使用DEFAULT_GROUP。
  3. spring.cloud.nacos.config.ext-config[n].refresh的配置是用来动态刷新对应的DataId 的配置。
自定义共享DataId配置

多个服务可以共享DataId的配置,也可以如下配置

spring:
	cloud:
		nacos:
			config:
				shared‐dataids: nacos-test-config1.yml,nacos-test-config2.yml
					refreshable‐dataids: nacos-test-config3.yml	

说明:

  1. spring.cloud.nacos.config.shared-dataids来共享DataId的配置,多个逗号之间隔开。
  2. spring.cloud.nacos.config.refreshable-dataids支持DataId的配置发生变化的时候,进行配置的动态刷新。

注意:

  1. spring.cloud.nacos.config.shared-dataids配置多个DataId的时候,是有一个优先级的,按照配置出现的先后顺序,也就是说后面的优先级要高于前面。
  2. spring.cloud.nacos.config.shared-dataids进行配置时,DataId必须带有文件的扩展名,既可以是properties也可以是yml/yaml。
  3. spring.cloud.nacos.config.refreshable-dataids这个配置也是需要DataId带有文件扩展名的。
  4. 共享DataId的配置相比扩展的 DataId 配置,它把group固定为DEFAULT_GROUP,建议使用扩展的 DataId 配置,因为扩展的 Data Id 配置也可以实现共享DataId配置。
配置的优先级

Nacos目前提供了三种获取配置的方式

  1. spring.cloud.nacos.config.shared-dataids获取多个共享配置
  2. spring.cloud.nacos.config.ext-config[n].data-id通过配置多个config[n]来拉去多个配置
  3. 通过内部相关规则(应用名、扩展名 )获取对应 DataId的配置

注意:

​ 当三者共存的时候,优先级关系为3 > 2 > 1

完全能关闭配置

通过以下配置来关闭获取配置

spring:
	cloud:
		nacos:
			config:
				enabled: false
Nacos集群配置
集群部署

注意:

​ 必须3个或者3个以上的节点才能构成集群(选举机制,高可用的效果。)

步骤:

  1. 安装3个nacos

  2. 将所有nacos安装文件夹中的conf目录下的cluster.conf.example文件名,改为cluster.conf并且进行配置

    # ip:port
    127.0.0.1:8848
    127.0.0.1:8849
    127.0.0.1:8850
    
  3. 以集群的模式进行启动

    startup ‐m cluster
    
  4. 启动完成后可以到Nacos控制台中节点列表中查看

项目配置
spring:
	application:
		name: xxxx
	cloud:
		nacos:
			config:
				server‐addr: 127.0.0.1:8848,127.0.0.1:8849,127.0.0.1:8850

​ 必须3个或者3个以上的节点才能构成集群(选举机制,高可用的效果。)

步骤:

  1. 安装3个nacos

  2. 将所有nacos安装文件夹中的conf目录下的cluster.conf.example文件名,改为cluster.conf并且进行配置

    # ip:port
    127.0.0.1:8848
    127.0.0.1:8849
    127.0.0.1:8850
    
  3. 以集群的模式进行启动

    startup ‐m cluster
    
  4. 启动完成后可以到Nacos控制台中节点列表中查看

项目配置
spring:
	application:
		name: xxxx
	cloud:
		nacos:
			config:
				server‐addr: 127.0.0.1:8848,127.0.0.1:8849,127.0.0.1:8850
Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐