深入微服务-Nacos 配置中心核心概念及实战

1,199 阅读4分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第9天,点击查看活动详情

微服务系列文章目录


前言

本系列带着大家深入微服务 Spring体系的各个框架的基本使用以及底层原理。上一篇文章介绍了Nacos的核心概念以及客户端实现服务发现的功能,本节将带着大家学习下Nacos Config核心概念以及实战


分布式配置中心的作用

分布式配置中心可以集中管理程序配置以及实现不重启服务容器,动态修改程序的配置内容,市面上的分布式配置中心有携程的Apollo,SpringCloud Config,Nacos Config 配置中心。

Nacos 配置中心是什么

  • Nacos Config 提供用于存储配置和其他元数据的 key/value 存储,为分布式系统中的外部化配置提供服务器端和客户端支持
  • 使用 Nacos Config,可以在 Nacos Server 配置界面集中管理 Spring Cloud 应用的外部属性配置
  • 当应用程序通过部署管道(例如:Jenkins)从开发到测试再到生产时,可以管理这些环境之间的配置,并确保应用程序具有迁移时需要运行的所有内容

Nacos Config.png

Nacos 配置中心核心概念

  • 配置 (Configuration) 在软件开发过程中将一些需要变更的参数、变量从代码中分离出来独立管理,以独立的配置文件的形式存在,根据不同的部署环境可以进行切换不同的配置。配置变更是调整系统运行时的有效手段之一。
  • 配置管理 (Configuration Management) 在数据中心中,系统中所有配置的编辑、存储、分发、变更管理、历史版本管理、变更审计等所有与配置相关的活动统称为配置管理

Nacos 配置中心的配置一致性模型

Nacos 配置管理一致性分为两部分,第一部分是Server间一致性协议(Nacos Server集群环境),一个是SDK(Nacos Config Client)与Server的一致性协议,配置作为分布式系统中飞强一致性数据,在出现脑裂的时候高可用性高于一致性,因此配置中心采用的是AP一致性协议

Nacos Config 实战

需实现效果:通过Nacos实现配置的动态变更

1、启动Nacos Server 2、nacos server中新建serviceA-dev.yaml

Nacos Config配置界面.png

3、搭建Nacos Config 服务 3.1) 引入Nacos Client依赖

<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>

3.2) 添加bootstrap.yaml

spring:
  profiles:
    active: dev #指定环境
  application:
    name: serviceA # 服务名称
  cloud:
    nacos:
      config:
        server-addr: nacos:8848
        file-extension: yaml
        username: nacos
        password: nacos

3.3) 添加启动类,测试功能

@SpringBootApplication
public class NacosConfigApplication {

    public static void main(String[] args) {
        ConfigurableApplicationContext applicationContext = SpringApplication.run(NacosConfigApplication.class, args);
        String userName = applicationContext.getEnvironment().getProperty("user.name");
        String userAge = applicationContext.getEnvironment().getProperty("user.age");
        System.out.println("my name is :"+userName+"; age: "+userAge);
    }
}

启动服务之后,控制台输出

Nacos Config 输出界面.png

Nacos Config功能

支持profile粒度的配置

spring-cloud-starter-alibaba-nacos-config 在加载配置的时候,不仅仅加载了以 dataid 为 ${spring.application.name}.${file-extension:properties} 为前缀的基础配置,还加载了dataid为 ${spring.application.name}-${profile}.${file-extension:properties} 的基础配置, 可以通过Spring 提供的 ${spring.profiles.active} 这个配置项来配置,实现读取不同的环境

spring:
  profiles:
    active: dev #指定环境

支持自定义namespace配置

Namespace 的常用场景之一是不同环境的配置的区分隔离,例如开发测试环境和生产环境的资源(如配置、服务)隔离等 在没有明确指定 ${spring.cloud.nacos.config.namespace} 配置的情况下, 默认使用的是 Nacos 上 public 这个namespae。如果需要使用自定义的命名空间,可以通过以下配置来实现: namespace 对应的是命名空间的id

spring:
  cloud:
    nacos:
      config:
        namespace: xxx # 命名空间ID

命名空间ID默认为默认生成,可指定

Nacos 命名空间ID.png

支持自定义 Group 的配置

在没有明确指定 ${spring.cloud.nacos.config.group} 配置的情况下, 默认使用的是 DEFAULT_GROUP 。如果需要自定义自己的 Group,可以通过以下配置来实现:

spring:
  cloud:
    nacos:
      config:
        group: DEV_GROUP

支持共享配置

共享配置 解决多个应用间配置共享的问题

spring:
  cloud:
    nacos:
      config:
        shared-configs:
          - data-id: shared-configs.yml
            refresh: true
  • 通过 spring.cloud.nacos.config.shared-configs[n].data-id 来支持多个共享 Data Id 的配置。
  • 通过 spring.cloud.nacos.config.shared-configs[n].group 来配置自定义 Data Id 所在的组,不明确配置的话,默认是 DEFAULT_GROUP。
  • 通过 spring.cloud.nacos.config.shared-configs[n].refresh 来控制该Data Id在配置变更时,是否支持应用中动态刷新,默认false

支持自定义扩展DataId配置

支持自定义 Data Id 的配置

spring:
  cloud:
    nacos:
      config:
        extension-configs:
          - data-id: shared-configs.yml
            refresh: true
  • 通过 spring.cloud.nacos.config.extension-configs[n].data-id 的配置方式来支持多个 Data Id 的配置。
  • 通过 spring.cloud.nacos.config.extension-configs[n].group 的配置方式自定义 Data Id 所在的组,不明确配置的话,默认是 DEFAULT_GROUP。
  • 通过 spring.cloud.nacos.config.extension-configs[n].refresh 的配置方式来控制该 Data Id 在配置变更时,是否支持应用中可动态刷新, 感知到最新的配置值。默认是不支持的

总结

Nacos 基础篇差不多更新完了,后面会给大家带来Nacos 源码解析部分,感谢支持