个人技术分享

回顾

  • 配置文件都不陌生,在Spring Boot项目中,默认会提供一个application.properties或者application.yml文件,我们可以把一些全局性的配置或者需要动态维护的配置写入该文件,比如数据库连接、功能开关、限流阈值、服务器地址等。
  • 为了解决不同环境下服务连接配置等信息的差异,Spring Boot提供了基于spring.profiles.active={profile}的机制来实现不同环境的切换。

问题

  • 随着单体架构向微服务架构的演进,各个应用自己独立维护本地配置的方式开始显露出它的不足之处:
    • 配置的动态更新
    • 配置集中式管理
    • 配置内容的安全性和权限
    • 不同部署环境下配置的管理

统一配置管理

  • 统一配置管理就是弥补不足的方法,可以集中管理所有实例的配置。
  • 简单来说,最基本的方法是把各个应用系统中的某些配置放在一个第三方中间件上进行统一维护。
  • 然后对于统一配置中心上的数据的变更需要推送到响应的服务节点实现动态更新。

配置中心的解决方案:

  • Zookeeper
  • Disconf
  • Spring Cloud Config
  • Apollo(阿婆罗)
  • Nacos
    在这里插入图片描述

Nacos的关键特性

动态配置服务

  • 业务服务一般都会维护一个本地配置文件,然后把一些常量配置到这个文件中。这种方式在某些场景中会存在问题,比如配置需要变更时需要重新部署应用。
  • 动态配置服务可以让您以中心化、外部化和动态化的方式管理所有环境的应用配置和服务配置。
  • 动态配置消除了配置变更时重新部署应用和服务的需要,让配置管理变得更加高效和敏捷。配置中心化管理让实现无状态服务变得更简单,让服务按需弹性扩展变得更容易。
  • Nacos 提供了一个简洁易用的UI (控制台样例 Demo) 帮助您管理所有的服务和应用的配置。Nacos 还提供包括配置版本跟踪、金丝雀发布、一键回滚配置以及客户端配置更新状态跟踪在内的一系列开箱即用的配置管理特性,帮助您更安全地在生产环境中管理配置变更和降低配置变更带来的风险。
小结

Nacos一方面可以将配置集中管理,另一方可以在配置变更时,及时通知微服务,实现配置的热更新。
在这里插入图片描述在这里插入图片描述

Nacos的架构

在这里插入图片描述

Spring Cloud Alibaba Nacos Config

1.创建项目

  • 指定artifactId为cloudalibaba-config-nacos-client
    在这里插入图片描述

2.添加依赖

在这里插入图片描述

3.添加启动注解

  • @EnableDiscoveryClient
@SpringBootApplication
@EnableDiscoveryClient
public class CloudalibabaConfigNacosClientApplication {
    public static void main(String[] args) {
        SpringApplication.run(CloudalibabaConfigNacosClientApplication.class, args);
    }
}

4.添加配置信息

  • 使用控制器类动态读取配置信息

bootstrap.yaml

spring:
  application:
    name: nacos-config-client
  profiles:
    active: dev
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848
      config:
        server-addr: localhost:8848
        file-extension: yaml
server:
  port: 7600

5.使用控制器类动态读取配置信息

@RestController
@RefreshScope // 支持Nacos的动态刷新功能
public class ConfigClientController {
    @Value("${config.info}")
    private String configInfo;
    @GetMapping("/config/info")
    public String findConfigInfo() throws Exception{
        return "nacos配置中心读取的信息===>"+configInfo;
    }
}

6.Nacos Server添加配置信息

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

7.测试

在这里插入图片描述
更新配置后再次访问
在这里插入图片描述在这里插入图片描述

Nacos Namespace/Group/DataID三者关系

任务背景

  • 问题1:如果实际开发中,通常一个系统会准备,dev开发环境,test测试环境,prod生产环境,那如何保证指定环境启动时服务能正确读取到Nacos上相应环境的配置文件呢?
  • 问题2:一个大型分布式微服务系统会有很多微服务项目,每个微服务项目又都会有相应的开发环境、测试环境、生产环境…那么怎么对这些微服务配置进行管理呢?

Nacos如何处理

  • Nacos有分类管理的操作。抛出三个概念,Namespace(命令空间)、Group(分组)、DataID。

命名空间(Namespace)

  • 用于进行租户粒度的配置隔离。
  • 不同的命名空间下,可以存在相同的 Group 或 Data ID 的配置。
  • Namespace 的常用场景之一是不同环境的配置的区分隔离,例如开发测试环境和生产环境的资源(如配置、服务)隔离等。
  • Nacos默认的命名空间是public,我们就可以利用Namespace来实现隔离
  • 比如我们现在有三个环境:开发、测试、生产环境,我们就可以创建三个Namespace,不同的Namespace之间是隔离的。
    在这里插入图片描述

配置集 ID(Data ID)

  • Nacos 中的某个配置集的 ID。配置集 ID 是组织划分配置的维度之一。
  • Data ID 通常用于组织划分系统的配置集。
  • 一个系统或者应用可以包含多个配置集,每个配置集都可以被一个有意义的名称标识。
  • 通常采用类 Java 包(如 com.taobao.tc.refund.log.level)的命名规则保证全局唯一性。
    在这里插入图片描述
dataId 的完整格式
${prefix}-${spring.profiles.active}.${file-extension}
  • prefix 默认为 spring.application.name 的值,也可以通过配置项 spring.cloud.nacos.config.prefix来配置。
  • spring.profiles.active 即为当前环境对应的 profile。
  • 注意:当 spring.profiles.active 为空时,对应的连接符 - 也将不存在,dataId 的拼接格式变成 ${prefix}.${file-extension}
  • file-exetension 为配置内容的数据格式,可以通过配置项 spring.cloud.nacos.config.file-extension 来配置。目前只支持 properties 和 yaml 类型。
    在这里插入图片描述在这里插入图片描述

代码案例

1.新建命名空间:dev和test

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

2.新建DataID(nacos-config-client-dev.yaml)和Group(DEV_GROUP)

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

3.修改配置文件

spring:
  application:
    name: nacos-config-client
  profiles:
    active: dev
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848
      config:
        server-addr: localhost:8848
        file-extension: yaml
        namespace: 244f3580-dc01-46fa-b555-43d5e183c47c  # 命名空间ID
        group: DEV_GROUP
server:
  port: 7600

4.测试

在这里插入图片描述

附:从微服务中拉取配置分析

如何获取Nacos地址

  • 服务需要先读取nacos中的配置文件,但是我们将nacos的地址配置到了application.yml文件中,而读取application.yml文件是在读取nacos之后的,所以按照原来的那样是行不通的。
  • 而bootstrap.yml文件的优先级要高很多(这个文件是引导文件,优先级高于application.yml),所以我们需要新建一个bootstrap.yml文件,将nacos的地址配置到这个文件中,这样的话就行得通了

如何知道我们要获取哪一个配置

  • 通过在bootstrap.yml文件配置服务名称、开发环境和文件后缀名我们就能知道了,因为我们在Nacos上新建配置的时候就是以这三个信息命名的。

流程图

在这里插入图片描述