【面试题 - Nacos】二 配置管理

这里写目录标题

  • 1. 配置
    • 1.1 什么是配置
    • 1.2 配置中心
  • 2. Nacos
    • 2.1 Nacos特性
  • 3. Nacos入门
    • 3.1 Nacos配置管理模型
    • 3.2 最佳实践
    • 3.3 Nacos命名空间管理
      • 3.3.1 namespace 隔离设计
      • 3.3.2 新建命名空间
      • 3.3.3. 新建配置![!\[在这里插入图片描述\](https://img-blog.csdnimg.cn/20201231101026799.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3l6eDMxMDU=,size_16,color_FFFFFF,t_70](https://img-blog.csdnimg.cn/20201231101202595.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3l6eDMxMDU=,size_16,color_FFFFFF,t_70)
      • 3.3.4 配置列表
  • 4. demo
    • 4.1 bootstrap.yml配置
    • 4.2获取配置项

1. 配置

1.1 什么是配置

应用程序在启动和运行的时候往往需要读取一些配置信息,配置基本上伴随着应用程序的整个生命周期,比如:数 据库连接参数、启动参数等。
配置主要有以下几个特点

  1. 配置是独立于程序的只读变量【配置对于程序是只读的,程序通过读取配置来改变自己的行为,但是程序不应该去改变配置 】
  2. 【配置贯穿于应用的整个生命周期】应用在启动时通过读取配置来初始化,在运行时根据配置调整行为。 比如:启动时需要读取服务的端口号、系统在运行过程中需要读取定时策略执行定时任务等。
  3. 【 配置需要治理】 同一份程序在不同的环境(开发,测试,生产)、不同的集群(如不同的数据中心)经常需要有不同的 配置,所以需要有完善的环境、集群配置管理
  4. 【配置可以有多种加载方式 常见的有程序内部hard code,配置文件,环境变量,启动参数,基于数据库等】

1.2 配置中心

【面试题 - Nacos】二 配置管理_第1张图片

2. Nacos

2.1 Nacos特性

  1. 服务发现与服务健康检查
    Nacos使服务更容易注册,并通过DNS或HTTP接口发现其他服务,Nacos还提供服务的实时健康检查,以防 止向不健康的主机或服务实例发送请求。
  2. 动态配置管理
    动态配置服务允许您在所有环境中以集中和动态的方式管理所有服务的配置。无需在更新配置时重新部署应用程序,高效和灵活。
  3. 动态DNS服务
    Nacos提供基于DNS 协议的服务发现能力,旨在支持异构语言的服务发现,支持将注册在Nacos上的服务以 域名的方式暴露端点,让三方应用方便的查阅及发现。
  4. 服务和元数据管理 Nacos 能让您从微服务平台建设的视角管理数据中心的所有服务及元数据,包括管理服务的描述、生命周 期、服务的静态依赖分析、服务的健康状态、服务的流量管理、路由及安全策略。

3. Nacos入门

3.1 Nacos配置管理模型

对于Nacos配置管理,通过Namespace、group、Data ID能够定位到一个配置集。
【面试题 - Nacos】二 配置管理_第2张图片

  • 命名空间(Namespace)
    命名空间(namespace)可用于进行不同环境的配置隔离。例如可以隔离开发环境、测试环境和生产环境,因为 它们的配置可能各不相同,或者是隔离不同的用户,不同的开发人员使用同一个nacos管理各自的配置,可通过 namespace隔离。不同的命名空间下,可以存在相同名称的配置分组(Group) 或 配置集。
  • 配置分组(Group)
    配置分组是对配置集进行分组,通过一个有意义的字符串(如 Buy 或 Trade )来表示,不同的配置分组下可以有 相同的配置集(Data ID)。当您在 Nacos 上创建一个配置时,如果未填写配置分组的名称,则配置分组的名称默 认采用 DEFAULT_GROUP 。配置分组的常见场景:可用于区分不同的项目或应用,例如:学生管理系统的配置集 可以定义一个group为:STUDENT_GROUP。
  • 配置集(Data ID)
    在系统中,一个配置文件通常就是一个配置集,一个配置集可以包含了系统的各种配置信息,例如,一个配置集可 能包含了数据源、线程池、日志级别等配置项。每个配置集都可以定义一个有意义的名称,就是配置集的ID即Data ID。
  • 配置项
    配置集中包含的一个个配置内容就是配置项。它代表一个具体的可配置的参数与其值域,通常以 key=value 的形 式存在。例如我们常配置系统的日志输出级别(logLevel=INFO|WARN|ERROR) 就是一个配置项。

3.2 最佳实践

【面试题 - Nacos】二 配置管理_第3张图片

3.3 Nacos命名空间管理

3.3.1 namespace 隔离设计

namespace 的设计是 nacos 基于此做多环境以及多租户(多个用户共同使用nacos)数据(配置和服务)隔离的。

  • 从一个租户(用户)的角度来看,如果有多套不同的环境,那么这个时候可以根据指定的环境来创建不同的 namespce,以此来实现多环境的隔离。例如,你可能有开发,测试和生产三个不同的环境,那么使用一套 nacos 集群可以分别建以下三个不同的 namespace。如下图所示:
    【面试题 - Nacos】二 配置管理_第4张图片
  • 从多个租户(用户)的角度来看,每个租户(用户)可能会有自己的 namespace,每个租户(用户)的配置数据以及注 册的服务数据都会归属到自己的 namespace 下,以此来实现多租户间的数据隔离。例如超级管理员分配了三 个租户,分别为张三、李四和王五。分配好了之后,各租户用自己的账户名和密码登录后,创建自己的命名 空间。如下图所示:
    【面试题 - Nacos】二 配置管理_第5张图片

3.3.2 新建命名空间

【面试题 - Nacos】二 配置管理_第6张图片
注意:
命名空间不可重复
在编写程序获取配置集时,指定的namespace参数一定要填写命名空间ID,而不是名称

3.3.3. 新建配置【面试题 - Nacos】二 配置管理_第7张图片

3.3.4 配置列表

【面试题 - Nacos】二 配置管理_第8张图片

  • Nacos支持 YAML、Properties、TEXT、JSON、XML、HTML 等常见配置格式在线编辑、语法高亮、格式校验。
  • Nacos支持编辑DIFF能力,帮助用户校验修改内容,降低改错带来的风险。
  • 配置集导出[勾选若干配置集,点击 导出选中的配置 ,可获得一个压缩包]
  • 配置集导入[点击右上角的 导入配置 ,可选择导出的压缩包文件,将压缩包内的文件恢复为nacos配置集。]
  • 配置集克隆[点击左下角 克隆 按钮,将会弹出克隆对话框,此功能可用于将配置迁移到其他Namespace。]
  • 历史版本:Nacos通过提供配置版本管理及其一键回滚能力,帮助用户改错配置的时候能够快速恢复,降低微服务系统在配置 管理上的可用性风险。

4. demo

4.1 bootstrap.yml配置

一般来说,spring boot的配置将在application.yml(也可以是application.properties)文件中编写, 由于使用外部配置中心,必须将原先的application.yml重命名为bootstrap.yml
【面试题 - Nacos】二 配置管理_第9张图片
注意:

  1. 若没有指定spring.cloud.nacos.config.group配置,则默认为DEFAULT_GROUP。
  2. spring-cloud-starter-alibaba-nacos-config 在加载配置的时候,加载了以 dataid 为
    $ {spring.application.name}.$ {file-extension:properties} 的基础配置。对应以上的配置,它会去 nacos server中加载data id为fp-activity-api.yaml的配置集。
  3. 一个应用可以拥有多个配置文件【若多个配置文件中有相同的配置项,配置越靠后优先级越高】

4.2获取配置项

【面试题 - Nacos】二 配置管理_第10张图片

@Data
@Component
@RefreshScope //配置项更新的时候无需重启服务就可以获取到最新数据
public class ShareUserGainCouponCode {
  @Value("${redPackage.shareUser.couponCode}")
  private String couponCode;
  @Value("${redPackage.shareUser.couponName}")
  private String couponName;
  @Value("${redPackage.shareUser.shortMessage}")
  private String shortMessage;
}

你可能感兴趣的:(面试题-分布式,面试,java)