Spring Cloud 使用 nacos config 实现 配置中心

一、配置中心

配置中心是一个集中化的管理平台,用于存储、管理和动态调整应用程序的配置信息。在现代微服务架构中,尤其是在分布式系统中,各个微服务通常会有大量的配置(如数据库连接信息、API 密钥、服务发现配置、功能开关等)。为了方便配置管理、降低维护成本和提高灵活性,通常会使用配置中心来集中管理这些配置。

配置中心的优点

  • 集中管理:

    • 所有的配置信息都存储在一个地方,便于查看、修改和维护。
  • 灵活性:

    • 支持动态更新配置,无需重启应用程序,减少了对生产环境的影响。
  • 可扩展性:

    • 配置中心通常是分布式的,能够支持大规模的应用和服务。
  • 支持版本控制和回滚:

    • 支持配置的历史版本管理,可以根据需要回滚到历史版本。
  • 多环境管理:

    • 配置中心通常支持多环境配置,能够为开发、测试、生产环境提供不同的配置。

配置中心的缺点

  • 单点故障问题:
    • 如果配置中心的服务宕机或不可用,所有的应用可能无法获取到最新的配置,可能会导致服务故障。
  • 性能瓶颈:
    • 如果配置中心处理大量的配置请求时,可能会成为性能瓶颈,尤其在高并发场景下。
  • 配置泄露风险:
    • 配置中心中存储的配置信息可能包含敏感数据,如数据库密码、API 密钥等,必须确保配置中心具备足够的安全性。

常见的配置中心:

1、Nacos:
  • Nacos 是阿里巴巴开源的一款动态服务发现、配置管理和服务管理平台。它提供了强大的配置管理功能,支持配置的动态更新,支持多种格式的配置(如 properties, YAML, JSON),并且能够支持多环境、多数据源的配置管理。
2、Apollo:
  • Apollo 是携程开源的配置管理中心,专注于分布式配置管理,提供了可视化的界面来管理配置,支持灰度发布、版本回滚等特性。
3、Spring Cloud Config:
  • Spring Cloud Config 是 Spring Cloud 提供的一个配置管理解决方案,它使用 Git 或 SVN 作为后端存储系统,支持配置的集中管理。Spring Cloud Config 支持 Spring 应用程序的自动配置,能够在多个微服务之间共享配置。
4、Consul:
  • Consul 是一个开源的服务发现和配置管理工具,提供了健康检查、服务发现和配置存储等功能。Consul 的配置存储可以用于存储应用程序的配置,并支持分布式系统的管理。
5、Zookeeper:
  • Zookeeper 是一个开源的分布式协调服务,广泛用于分布式系统中的配置管理、服务发现等场景。它也可以作为配置中心,通过存储配置信息来支持服务的动态更新。

二、使用 nacos 实现配置中心

1、 引入依赖 添加配置

nacos config 配置文档

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

使用 bootstrap.yml 或 bootstrap.properties (不明白阅读配置文档)

spring:
  application:
    name: order-service
  cloud:
    nacos:
      server-addr: 127.0.0.1:8848
      username: nacos
      password: nacos
      config:
        file-extension: yaml
        namespace: dev
        extension-configs:
          - data-id: cloud.extension-dev-yaml
            group: DEFAULT_GROUP_1
            refresh: true
        shared-configs:
          - data-id: cloud.shared-dev-yaml
            group: DEFAULT_GROUP_1
            refresh: true

2、配置含义:主要针对 spring.cloud.nacos.config 下的配置进行解释,建议 优先阅读上面提到的配置文档

  • namespace 命名空间 默认为 public
    image

  • file-extension 文件扩展名 用于标识默认的配置文件扩展名 默认properties

  • extension-configs 扩展配置 定义某个服务或应用 专属的配置(数组类型)

    • data-id 对应配置的data-id
    • group 对应配置的 group
    • refresh 实时刷新配置变更(Data Id 需 和 配置的文件类型 保持一致; 默认的配置可不设置(Data Id 前缀)和文件类型正确就可以)
      错误示范(非默认,不含正确文件扩展名)
      image
      正确配置(非默认,包含正确文件扩展名)
      image
      默认配置(默认,不包含文件扩展名)
      image
  • shared-configs 共享配置 定义多个服务 共同的配置(数组类型)

3、配置优先级

数组类型的配置,相同配置:下标大 的 覆盖下标小的
同时配置的优先级为:profile > 默认配置文件 > extension-configs > shared-configs
image

profile: 认为 我们在程序中的配置 例如yml
默认配置文件: 认为 ${spring.application.name}-${profile}.${file-extension:properties} 是这个格式的默认配置(不懂的阅读配置文档)

三、启动配置中心

1、若项目不能启动,提示类似于 如下内容:

image

这是高版本,设置了 禁用 bootstrap 启动配置:

解决方案: 导入新的依赖 (即可解决,启动的问题)

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-bootstrap</artifactId>
        </dependency>

2、检验自动刷新配置

在启动类中使用循环输出配置文件,查看配置

    public static void main(String[] args) throws InterruptedException {
        ConfigurableApplicationContext applicationContext = SpringApplication.run(OrderApplication.class, args);
        while (true) {
            String userName = applicationContext.getEnvironment().getProperty("user.name");
            String userAge = applicationContext.getEnvironment().getProperty("user.age");
            System.out.println("userName:" + userName + ";userAge:" + userAge);
            String cloudOrder = applicationContext.getEnvironment().getProperty("cloud.order");
            String cloudStock = applicationContext.getEnvironment().getProperty("cloud.stock");
            System.out.println("cloudOrder:" + cloudOrder + ";cloudStock:" + cloudStock);
            TimeUnit.SECONDS.sleep(5);
        }
    }
在配置中心,编辑修改配置文件:

image

在本地查看修改文件前后,配置文件的变化:

image

posted @ 2024-12-20 23:47  代码红了一大片  阅读(123)  评论(0编辑  收藏  举报