随着单体架构像服务化架构和为服务架构演进,应用自己独立维护本地配置方式有很多不足之处

  • 配置动态更新
    需要手动修改配置文件并且重启应用才能生效,效率低,重启会导致服务暂时不可用
  • 配置集中式管理
    每个节点都维护一个配置文件则如果要修改某个属性工作量巨大
  • 配置内容的安全性和权限
    配置文件随代码提交到代码库中,容易造成外泄
  • 不同部署环境下配置的管理
    通过传统的profile配置文件机制来管理对日常维护较繁琐
    把各个应用系统中的某些配置放在一个第三方中间件上进行统一维护,对统一配置中心上的数据的变更需要推送到相应的服务节点实现动态更新
    配置中心的解决方案有很多:ZooKeeper、Disconf、Apollo、Spring Cloud Config、QConf、Nacos等,其核心功能多是差不大多

Nacos配置中心简介

Config Service是Nacos用于实现配置中心的核心模块,实现对配置的CRUD、版本管理、灰度管理、监听管理、推送轨迹、聚合数据等
image.png

Nacos集成Spring Boot实现统一配置管理

客户端项目配置

  • 依赖
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>com.alibaba.boot</groupId>
            <artifactId>nacos-config-spring-boot-starter</artifactId>
            <version>0.2.4</version>
        </dependency>
  • 配置文件
nacos.config.server-addr=127.0.0.1:8848
  • 动态配置读取类
@RestController
@NacosPropertySource(dataId = "example", autoRefreshed = true)
public class NacosConfigController {
    @NacosValue(value = "${info:Local Hello World!}", autoRefreshed = true)
    private String info;

    @GetMapping("/config")
    public String get() {
        return info;
    }
}

1.@NacosPropertySource:加载dataId为example的配置源,autoRefreshed为true表示开启自动更新
2.@NacosValue:设置属性的值,${info:Local Hello World!}表示K为info,V的默认值为Local Hello World,如果K不存在则使用默认V,高可用策略

配置中心配置

  • 启动Nacos
  • 创建配置
    1.通过Nacos网页控制台创建
    image.png
    2.Open API创建
    image.png

image.png

//TODO

Spring Cloud Alibaba Nacos Config

Spring Cloud Alibaba Nacos Config是Spring Cloud生态中的Spring Cloud Config替代方法

Nacos Config的基本应用

  • 添加依赖
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework.cloud</groupId>
			<artifactId>spring-cloud-starter</artifactId>
		</dependency>
		<dependency>
			<groupId>com.alibaba.cloud</groupId>
			<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
			<version>2.1.1.RELEASE</version>
		</dependency>
		<dependency>
			<groupId>org.springframework.cloud</groupId>
			<artifactId>spring-cloud-context</artifactId>
			<version>2.1.1.RELEASE</version>
		</dependency>
  • 配置文件
    1.创建bootstrp.properties文件,添加Nacos Server的连接地址
spring.application.name=spring-cloud-nacos-config-sample
spring.cloud.nacos.config.server-addr=127.0.0.1:8848
#Nacos配置中心的DataID前缀
spring.cloud.nacos.config.prefiFx=example

该文件配置必须是在bootstrap.properties文件中,该加载优先于application.properties。在加载远程配置之前,要读取Nacos配置中心的服务地址信息,所以要优先加载
个人理解类似于Spring Boot外部配置文件的优先顺序
image.png

//TODO

基于Data ID配置YAML的文件扩展名

SPring Cloud Alibaba Nacos Config从Nacos Config Server中加载配置时,会匹配Data ID,在Spring Cloud Nacos的实现中,Data ID默认规则是$-$.$

  • 使用YAML格式配置
    1.bootstrap.properties中声明spring.cloud.nacos.config.file-extension=yaml
    2.Nacos控制台配置格式更改为YAML,格式内容更改为yaml格式的内容

不同环境的配置切换

Spring Boot环境

基于spring.profiles.active实现不同环境下配置切换

  • 1.在ressource目录下创建不同配置环境
    application.properties:默认配置
    application-dev.properties:开发
    application-test.properties:测试
    application-prod.properties:生产
  • 2.pplication.properties默认配置中设置
    通过spring.profiles.actives=$
    来指定配置环境
    通过启动参数VM options=-Dspring.profiles.actives=env来指定

SPring Cloud Alibaba Nacos环境

Spring CloudAlibaba Nacos Config加载Nacos Config Server配置时如果没有配置profile,DataID会以默认文件应用名为前缀。如果配置了profile,DataID还会加载配置的环境为前缀的基础配置

  • 在bootstrap.properties中声明spring.profiles.active=prod
  • 在Nacos控制台上新增spring.application.name的值为前缀-prod.properties即可获得该内容
    image.png

由于配置文件的环境是写死在jar包中的,通常可以根据Jar启动参数设置-Dspring.profiles.actives=pro 较为灵活方便

Nacos Config自定义Namespace和Group

image.png
Nacos Config默认的Namespace和Group为public和DEFAULT_GROUP
image.png

  • Namespace:解决多环节及多租户数据的隔离问题
    在多套不同的换几个下,可以根据指定的环境创建不同的Namespace,实现多环境的数据隔离,或者在多用户的场景中,是个用户维护自己的Namepspace,实现每个用户的配置数据和注册数据的隔离
  • Group:实现Data ID分组管理的机制
    实现不同Service/Data ID的隔离,用法没有特别的规定
    官方建议Namespace区分环境,Group区分业务层数据分组

创建Namespace

  • 1.Nacos新增Namespace
    image.png
    image.png
  • 2.在bootstrap.properties配置文件中新增配置
spring.cloud.nacos.config.namespace=f4050d05-2367-428b-97d1-2d31a8991a17

创建Group

Group不需要提前创建,在通过控制台或Open API创建配置的时候指定即可

  • 1.通过控制台新增配置的时候指定
    image.png
  • 2.在bootstrap.properties配置文件中新增配置
spring.cloud.nacos.config.group=TEST_GROUP

创建Data ID

具体的Nacos的某个配置集的ID,用户组织划分系统的配置集
spring Cloud Alibaba Nacos Config支持自动以Data ID配置

spring.cloud.nacos.config.ext-config[0].data-id=exanple.properties
spring.cloud.nacos.config.ext-config[0].group=DEFAULT_GROUP
#配置发生改变时是否动态刷新,以感知最新的配置,默认为false,不会实现动态刷新
spring.cloud.nacos.config.ext-config[0].refresh=true
  • spring.cloud.nacos.config.ext-config[n]支持多个扩展,n值越大,优先级越高

Nacos Config实现原理

image.png
Nacos Config对配置提供了4种操作,分为2大类配置的CRUD、动态监听

  • 配置的CURD
    1.获取配置
    2.发布配置
    3.删除配置
  • 动态监听
    1.监听配置

配置的CRUD

  • 服务端:配置存储及持久化
    Nacos默认采用Derby数据库,可以配置成MySQL数据流
  • 客户端:获取相应数据的API返回结果

动态监听:Pull、Push

客户端和服务端之间的数据交互方式可分为Pull和Push

  • Pull:客户端主动从服务端拉取数据
    需要定时拉取一次,会存在时间间隔,不能保证数据的实时性
  • Push:服务端主动把数据推送到客户端
    服务端需要维持与客户端长连接,耗费大量内存资源来保存每个连接,且需要心跳机制检测连接的有效性

Nacos采用长轮询机制的Pull模式,结合了Push和Pull的优势,客户端发起Pull请求,检查服务端是否发生变更,如果变更立即返回结果。如果没有变更,则等待29.5S,在此期间如果有变更,则立即返回,如果没有等待时间过后再返回

Spring Cloud如何实现配置的加载

image.png
image.png
image.png

  • Spring Cloud基于Spring Boot基于Spring。Spring抽象一个对象Environment表示Spring应用程序环境配置,整合了各种外部环境,且提供统一访问方法getProperty
  • Spring启动时把配置加载到Environment中,创建一个Bean可以从Environment中把属性通过@Value形式注入业务代码

//TODO

Nacos Config核心源码分析

//TODO


这个家伙很懒,啥也没有留下😋