Nacos入门之配置管理

Nacos-配置管理

服务发现 配置管理

1 Nacos简介

配置中心:微服务架构的配置中心,配置中心将配置从各应用中剥离出来,对配置进行统一管理,应用自身不需要自己去管理配置

主流的配置中心:Spring Cloud Config、Apollo、Nacos

Nacos是阿里的一个开源产品,它是针对微服务架构中的服务发现、配置管理、服务治理的综合型解决方案

配置:应用程序在启动和运行时需要读取一些配置中心,数据库连接参数、启动参数

  • 配置是独立于程序的只读变量
  • 配置伴随应用的整个生命周期
  • 配置可以有多种加载方式
  • 配置需要治理

Nacos特性

服务发现与服务健康检查

动态配置管理

动态DNS服务

Nacos提供基于DNS协议的服务发现能力

服务的元数据管理

2 安装Nacos Server

2.1 安装过程

省略(42条消息) 解决Nacos下载速度缓慢的问题_年少不知曲中意,再听已是曲终人-CSDN博客_nacos下载很慢

2.2 外部mysql数据库支持

单机模式时Nacos默认使用嵌入式数据库实现数据的存储,若想使用外部masql存储nacos数据:

  1. 安装数据库

  2. 初始化mysql数据库,新建数据库nacos_config,执行数据库初始化SQL文件:${nacoshome}/conf/nacos-mysql.sql

  3. 添加进nacos-server-2.0.3\nacos\conf\application.properties

    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=root
    

3 配置管理-入门demo程序

导入jar包

	<dependency>
        <groupId>com.alibaba.nacos</groupId>
        <artifactId>nacos-client</artifactId>
        <version>2.0.3</version>
    </dependency>
	<!--这两个slf4j日志不加可能会报错-->
	<dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-api</artifactId>
        <version>1.7.6</version>
    </dependency>

    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-log4j12</artifactId>
        <version>1.7.6</version>
    </dependency>

nacos 配置管理-配置列表-新建配置

	//data id
    String dataId = "nacos-simple-demo.yaml";
    //group
    String group = "DEFAULT_GROUP";
commmon:
  config1: something

新建一个SimpleDemoMain类

package test;

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服务上的配置
        //nacos server 地址
        String serverAddr = "192.168.1.92:8848";
       
        //data id
        String dataId = "nacos-simple-demo.yaml";
        //group
        String group = "DEFAULT_GROUP";
        Properties properties = new Properties();
        properties.put("serverAddr",serverAddr);
        //获取配置
        ConfigService configService = NacosFactory.createConfigService(properties);
        //String dataId, String group, long timeoutMs
        String config = configService.getConfig(dataId, group, 5000);
        System.out.println(config);


    }

}

4 Nacos配置管理基础应用

4.1 Nacos配置管理模型

对于Nacos配置管理,通过namespace、Group、 DataId能够定位到一个唯一的配置集

在这里插入图片描述

配置管理

系统配置的编辑、存储、分发、变更管理、历史版本管理、变更审计等所有与配置相关的活动。

配置项

一个具体的可配置的参数与其值域,通常以 param-key=param-value 的形式存在。例如我们常配置系统的日志输出级别(logLevel=INFO|WARN|ERROR) 就是一个配置项。

配置集

一组相关或者不相关的配置项的集合称为配置集。在系统中,一个配置文件通常就是一个配置集,包含了系统各个方面的配置。例如,一个配置集可能包含了数据源、线程池、日志级别等配置项。

配置集 ID

Nacos 中的某个配置集的 ID。配置集 ID 是组织划分配置的维度之一。Data ID 通常用于组织划分系统的配置集。一个系统或者应用可以包含多个配置集,每个配置集都可以被一个有意义的名称标识。Data ID 通常采用类 Java 包(如 com.taobao.tc.refund.log.level)的命名规则保证全局唯一性。此命名规则非强制。

配置分组

Nacos 中的一组配置集,是组织配置的维度之一。通过一个有意义的字符串(如 Buy 或 Trade )对配置集进行分组,从而区分 Data ID 相同的配置集。当您在 Nacos 上创建一个配置时,如果未填写配置分组的名称,则配置分组的名称默认采用 DEFAULT_GROUP 。配置分组的常见场景:不同的应用或组件使用了相同的配置类型,如 database_url 配置和 MQ_topic 配置。

命名空间

用于进行租户粒度的配置隔离。不同的命名空间下,可以存在相同的 Group 或 Data ID 的配置。Namespace 的常用场景之一是不同环境的配置的区分隔离,例如开发测试环境和生产环境的资源(如配置、服务)隔离等。

4.2 命名空间管理

功能:

单用户:例如开发测试环境和生产环境的资源(如配置、服务)隔离等。

多用户:每个用户占用一个namespace命名空间

		//使用nacos client 远程获取nacos服务上的配置
        //nacos server 地址
        String serverAddr = "192.168.1.92:8848";
        //namespace 默认为public
        String namespace = "f60d904c-dd92-4171-b977-29249f96a31a";
        //group
        String group = "DEFAULT_GROUP";
        //data id
        String dataId = "nacos-simple-demo.yaml";
        
        Properties properties = new Properties();
        properties.put("serverAddr",serverAddr);
        properties.put("namespace",namespace);
        //获取配置
        ConfigService configService = NacosFactory.createConfigService(properties);
        //String dataId, String group, long timeoutMs
        String config = configService.getConfig(dataId, group, 5000);
        System.out.println(config);

4.3 配置管理基础功能

配置列表 发布、删除、编辑、导出、导入、克隆······

历史版本 根据dataId和namespace 查询某个配置集的历史版本,查看详情、回滚

监听查询 根据dataId和group查询有什么客户端在监听 dataId配置集

//监听,当配置有变化时获取监听
        //String dataId, String group, Listener listener
        configService.addListener(dataId, group, new Listener() {
            @Override
            public Executor getExecutor() {
                return null;
            }
            //当配置有变化时获取监听
            @Override
            public void receiveConfigInfo(String configInfo) {
                System.out.println(configInfo);
            }
        });
        while(true){
            try {
                Thread.sleep(2000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }

4.4 登录管理

修改登录密码

密码采用Bcrypt加密 不可解密

nacos 2.0.3可在管理界面直接修改登录密码

关闭登录功能

application.properties文件中spring.security.enabled=false

5 Nacos配置管理应用于分布式系统

5.1 从单体架构到微服务

微服务和单体架构的区别 - zyz1 - 博客园 (cnblogs.com)

5.1.1单体架构

Web应用程序发展的早期,大部分web工程师将所有的功能模块打包到一起并放在一个web容器中运行,所有功能 模块使用同一个数据库,同时,它还提供API或者UI访问的web模块等。

在这里插入图片描述

尽管也是模块化逻辑,但是最终它还是会打包并部署为单体式应用,这种将所有功能都部署在一个web容器中运行 的系统就叫做单体架构(也叫:巨石型应用)。

单体架构有很多好处
开发效率高:模块之间交互采用本地方法调用,并节省微服务之间的交互讨论时间与开发成本。
容易测试:IDE都是为开发单个应用设计的、容易测试——在本地就可以启动完整的系统。

容易部署:运维成本小,直接打包为一个完整的包,拷贝到web容器的某个目录下即可运行。 但是,上述的好处是有条件的,它适用于小型简单应用,对于大规模的复杂应用,就会展现出来以下的不足
复杂性逐渐变高,可维护性逐渐变差 :所有业务模块部署在一起,复杂度越来越高,修改时牵一发动全身。
版本迭代速度逐渐变慢:修改一个地方就要将整个应用全部编译、部署、启动时间过长、回归测试周期过长。
阻碍技术创新:若更新技术框架,除非你愿意将系统全部重写,无法实现部分技术更新。
无法按需伸缩:通过冗余部署完整应用的方式来实现水平扩展,无法针对某业务按需伸缩。

5.1.2微服务架构

许多大型公司,通过采用微服务架构解决了上述问题。其思路不是开发一个巨大的单体式的应用,而是将应用分解 为小的、互相连接的微服务。

一个微服务一般完成某个特定的功能,比如订单服务、用户服务等等。每一个微服务都是完整应用,都有自己的业 务逻辑和数据库。一些微服务还会发布API给其它微服务和应用客户端使用。

比如,根据前面描述系统可能的分解如下:

在这里插入图片描述

每一个业务模块都使用独立的服务完成,这种微服务架构模式也影响了应用和数据库之间的关系,不像传统多个业 务模块共享一个数据库,微服务架构每个服务都有自己的数据库。

微服务架构的好处:

  • 分而治之,职责单一;易于开发、理解和维护、方便团队的拆分和管理
  • 可伸缩;能够单独的对指定的服务进行伸缩
  • 局部容易修改,容易替换,容易部署,有利于持续集成和快速迭代
  • 不会受限于任何技术栈

5.2 分布式应用配置管理

如何通过Nacos集中管理多个服务的配置 :

在这里插入图片描述

  • 用户通过Nacos Server的控制台集中对多个服务的配置进行管理
  • 各服务统一从Nacos Server中获取各自的配置,并监听配置的变化
5.2.1 发布配置
5.2.2 创建父工程
5.2.3 微服务service1配置
5.2.4 微服务service2配置
5.2.5支持配置的动态刷新
// 注入配置文件上下文 
@Autowired private ConfigurableApplicationContext applicationContext;
@GetMapping(value = "/configs") public String getConfigs(){ 
    return applicationContext.getEnvironment().getProperty("common.name"); 
}

我们通过nacos控制台更新common.name的配置值,再次访问web端点/configs,发现应用程序能够获取到最新 的配置值,说明spring-cloud-starter-alibaba-nacos-config 支持配置的动态更新。

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

5.2.6 自定义 namespace与group配置
spring:
  cloud:
    nacos:
      config:
        namespace: b3404bc0‐d7dc‐4855‐b519‐570ed34b62d7
        group: 

在没有明确指定 ${spring.cloud.nacos.config.namespace} 配置的情况下, 默认使用的是 Nacos 上 Public 这个 namespace。

Note:该配置必须放在 bootstrap.yml文件中。此外 spring.cloud.nacos.config.namespace 的值是 namespace 对应的 id,id 值可以在 Nacos 的控制台获取。并且在添加配置时注意不要选择其他的 namespae,否则将会导致 读取不到正确的配置。

在没有明确指定 ${spring.cloud.nacos.config.group} 配置的情况下, 默认使用的是 DEFAULT_GROUP 。

Note:该配置必须放在 bootstrap.properties 文件中。并且在添加配置时 Group 的值一定要和 spring.cloud.nacos.config.group 的配置值一致。

5.2.7 自定义扩展的 Data Id 配置
server:
  port: 56010
spring:
  application:
    name: service1
  cloud:
    nacos:
      config:
        server-addr: 192.168.1.92:8848
        file-extension: yaml #dataId的名称就是application的name加file-extension
        namespace: f60d904c-dd92-4171-b977-29249f96a31a
        group: test
#       shared-dataids: ext-config-common01.properties,ext-config-common02.properties,ext-config-common03.properties
#         refreshable-dataids: ext-config-common01.properties
        # config external configuration
        # 1、Data Id 在默认的组 DEFAULT_GROUP,不支持配置的动态刷新
        ext-config[0]:
          data-id: ext-config-common01.properties
        # 2、Data Id 不在默认的组,不支持动态刷新
        ext-config[1]:
          data-id: ext-config-common02.properties
          group: GLOBALE_GROUP
        # 3、Data Id 既不在默认的组,也支持动态刷新
        ext-config[2]:
          data-id: ext-config-common03.properties
          group: REFRESH_GROUP
          refresh: true  #动态刷新配置

可以看到:

通过 spring.cloud.nacos.config.ext-config[n].data-id 的配置方式来支持多个 Data Id 的配置。

通过 spring.cloud.nacos.config.ext-config[n].group的配置方式自定义 Data Id 所在的组,不明确配置 的话,默认是 DEFAULT_GROUP。

通过 spring.cloud.nacos.config.ext-config[n].refresh 的配置方式来控制该 Data Id 在配置变更时,是 否支持应用中可动态刷新, 感知到最新的配置值。默认是不支持的。

Note : spring.cloud.nacos.config.ext-config[n].data-id 的值必须带文件扩展名,文件扩展名既可支持 properties,又可以支持 yaml/yml。 此时 spring.cloud.nacos.config.file-extension 的配置对自定义扩 展配置的 Data Id 文件扩展名没有影响。

5.2.8 配置优先级

Spring Cloud Alibaba Nacos Config 目前提供了三种配置能力从 Nacos 拉取相关的配置。

  • A: 通过 spring.cloud.nacos.config.shared-dataids 支持多个共享 Data Id 的配置
  • B: 通过 spring.cloud.nacos.config.ext-config[n].data-id 的方式支持多个扩展 Data Id 的配置,多个 Data Id 同时配置时,他的优先级关系是 spring.cloud.nacos.config.ext-config[n].data-id 其中 n 的值越 大,优先级越高。
  • C: 通过内部相关规则(应用名、扩展名 )自动生成相关的 Data Id 配置

当三种方式共同使用时,他们的一个优先级关系是:C > B >A

通过设置 spring.cloud.nacos.config.enabled = false 来完全关闭 Spring Cloud Nacos Config

5.3 Nacos集群部署

d-dataids 支持多个共享 Data Id 的配置

  • B: 通过 spring.cloud.nacos.config.ext-config[n].data-id 的方式支持多个扩展 Data Id 的配置,多个 Data Id 同时配置时,他的优先级关系是 spring.cloud.nacos.config.ext-config[n].data-id 其中 n 的值越 大,优先级越高。
  • C: 通过内部相关规则(应用名、扩展名 )自动生成相关的 Data Id 配置

当三种方式共同使用时,他们的一个优先级关系是:C > B >A

通过设置 spring.cloud.nacos.config.enabled = false 来完全关闭 Spring Cloud Nacos Config

5.3 Nacos集群部署

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值