MK
摩柯社区 - 一个极简的技术知识社区
AI 面试

Spring Cloud Alibaba 配置管理实践

2023-07-302.6k 阅读

一、Spring Cloud Alibaba 配置管理概述

在微服务架构中,配置管理是一个至关重要的环节。不同的微服务可能需要不同的配置,并且在不同的环境(开发、测试、生产等)下,配置也会有所差异。Spring Cloud Alibaba 提供了一套完善的配置管理解决方案,帮助开发者轻松应对这些挑战。

Spring Cloud Alibaba 配置管理基于 Nacos 配置中心。Nacos 是一个易于使用的动态服务发现、配置管理和服务管理平台。它可以集中管理微服务的配置,支持配置的动态更新,使得开发者无需重启微服务就能应用新的配置。

二、环境搭建

  1. 安装 Nacos Server
    tar -xvf nacos - server - x.x.x.tar.gz
    cd nacos - server - x.x.x/bin
    
    • 启动 Nacos Server:
    sh startup.sh -m standalone
    
    • 访问 http://localhost:8848/nacos,使用默认账号密码(nacos/nacos)登录 Nacos 控制台,此时 Nacos Server 安装完成。
  2. 创建 Spring Boot 项目并集成 Nacos 配置
    • 使用 Spring Initializr(https://start.spring.io/)创建一个 Spring Boot 项目,添加 Spring Cloud Alibaba Nacos ConfigSpring Cloud Starter Bootstrap 依赖。例如,在 pom.xml 文件中添加以下依赖:
    <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring - cloud - alibaba - nacos - config</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring - cloud - starter - bootstrap</artifactId>
    </dependency>
    
    • resources 目录下创建 bootstrap.properties 文件,配置 Nacos 配置中心的地址和相关信息:
    spring.application.name = my - service
    spring.cloud.nacos.config.server - addr = 127.0.0.1:8848
    spring.cloud.nacos.config.file - extension = properties
    
    • 这里 spring.application.name 定义了应用名称,spring.cloud.nacos.config.server - addr 指向 Nacos Server 的地址,spring.cloud.nacos.config.file - extension 表示配置文件的格式为 properties

三、基本配置管理

  1. 在 Nacos 控制台创建配置文件
    • 登录 Nacos 控制台,点击左侧菜单的“配置管理” -> “配置列表”。
    • 点击“新建配置”按钮,在弹出的窗口中填写相关信息:
      • Data ID:格式为 ${spring.application.name}-${spring.profiles.active}.${spring.cloud.nacos.config.file - extension},例如 my - service - dev.properties。这里 dev 表示开发环境。
      • Group:默认为 DEFAULT_GROUP,也可以根据实际需求自定义。
      • 配置内容:例如添加配置项 database.url = jdbc:mysql://localhost:3306/mydb
    • 点击“发布”按钮,配置文件创建完成。
  2. 在 Spring Boot 应用中获取配置
    • 在 Spring Boot 应用中,可以通过 @Value 注解获取配置值。例如,创建一个 ConfigController
    import org.springframework.beans.factory.annotation.Value;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.RestController;
    
    @RestController
    public class ConfigController {
    
        @Value("${database.url}")
        private String databaseUrl;
    
        @GetMapping("/config")
        public String getConfig() {
            return "Database URL: " + databaseUrl;
        }
    }
    
    • 启动 Spring Boot 应用,访问 http://localhost:8080/config,就可以看到从 Nacos 配置中心获取到的数据库 URL 配置值。

四、配置的动态更新

  1. 开启动态更新支持
    • 在 Spring Boot 应用中,要实现配置的动态更新,需要对获取配置的方式进行一些调整。首先,使用 @RefreshScope 注解。修改 ConfigController 如下:
    import org.springframework.beans.factory.annotation.Value;
    import org.springframework.cloud.context.config.annotation.RefreshScope;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.RestController;
    
    @RestController
    @RefreshScope
    public class ConfigController {
    
        @Value("${database.url}")
        private String databaseUrl;
    
        @GetMapping("/config")
        public String getConfig() {
            return "Database URL: " + databaseUrl;
        }
    }
    
    • 这里 @RefreshScope 注解表示该类中的配置属性支持动态刷新。
  2. 动态更新配置
    • 在 Nacos 控制台,找到之前创建的 my - service - dev.properties 配置文件,修改 database.url 的值,例如改为 jdbc:mysql://new - host:3306/mydb
    • 点击“发布”按钮后,再次访问 http://localhost:8080/config,会发现获取到的数据库 URL 已经更新为新的值,无需重启 Spring Boot 应用。

五、多环境配置管理

  1. 不同环境配置文件的创建
    • 在 Nacos 控制台,为不同环境创建相应的配置文件。例如,除了 my - service - dev.properties 外,再创建 my - service - test.propertiesmy - service - prod.properties
    • my - service - test.properties 中可以配置测试环境的数据库 URL,如 database.url = jdbc:mysql://test - host:3306/mydb
    • my - service - prod.properties 中配置生产环境的数据库 URL,如 database.url = jdbc:mysql://prod - host:3306/mydb
  2. 切换环境配置
    • 在 Spring Boot 应用的 bootstrap.properties 文件中,通过修改 spring.profiles.active 属性来切换环境。例如,要切换到测试环境,修改 bootstrap.properties 如下:
    spring.application.name = my - service
    spring.cloud.nacos.config.server - addr = 127.0.0.1:8848
    spring.cloud.nacos.config.file - extension = properties
    spring.profiles.active = test
    
    • 重启 Spring Boot 应用,此时应用会从 my - service - test.properties 中获取配置,而不是 my - service - dev.properties

六、共享配置管理

  1. 创建共享配置文件
    • 在 Nacos 控制台,创建共享配置文件。例如,创建一个名为 common.properties 的配置文件,Group 设为 DEFAULT_GROUP
    • common.properties 中添加一些共享的配置项,如 logging.level.com.example = INFO
  2. 在应用中使用共享配置
    • 在 Spring Boot 应用的 bootstrap.properties 文件中,配置共享配置:
    spring.application.name = my - service
    spring.cloud.nacos.config.server - addr = 127.0.0.1:8848
    spring.cloud.nacos.config.file - extension = properties
    spring.cloud.nacos.config.shared - dataids = common.properties
    spring.cloud.nacos.config.refreshable - dataids = common.properties
    
    • spring.cloud.nacos.config.shared - dataids 表示要共享的配置文件 Data ID,spring.cloud.nacos.config.refreshable - dataids 表示这些共享配置文件支持动态刷新。
    • 这样,common.properties 中的配置就会被应用加载,并且如果 common.properties 中的配置发生变化,应用也能动态获取到新的配置。

七、配置加密与解密

  1. 配置加密需求
    • 在实际应用中,有些配置信息(如数据库密码)是敏感信息,不适合明文存储在配置中心。Spring Cloud Alibaba 支持对配置进行加密和解密。
  2. 使用 Spring Cloud Alibaba 加密机制
    • 首先,在项目中添加相关依赖,如 spring - cloud - alibaba - nacos - config - encryption
    • 配置加密密钥。可以在 bootstrap.properties 中添加:
    spring.cloud.nacos.config.encrypt.key = my - secret - key
    
    • 在 Nacos 控制台,对敏感配置进行加密。例如,对 my - service - dev.properties 中的 database.password 进行加密。假设原始密码为 123456,使用加密工具(如 nacos - config - client - encryption 提供的工具)对其进行加密,得到加密后的字符串。
    • 将加密后的字符串填入 my - service - dev.properties 中的 database.password 配置项,如 database.password = {cipher}encrypted - string
    • 在 Spring Boot 应用中,无需额外配置,Spring Cloud Alibaba 会自动对加密的配置进行解密,应用可以像获取普通配置一样获取解密后的密码。

八、配置版本管理

  1. Nacos 配置版本概念
    • Nacos 配置中心支持配置的版本管理。每次对配置文件的修改都会生成一个新的版本号,方便开发者追溯配置的变更历史。
  2. 查看配置版本
    • 在 Nacos 控制台的配置列表中,点击某个配置文件的“版本历史”按钮,可以查看该配置文件的所有版本记录。记录中包含版本号、修改时间、修改人等信息。
    • 通过版本管理,开发者可以在配置出现问题时,快速回滚到之前的某个版本。例如,当应用在更新配置后出现异常,可以根据版本历史找到上一个正常的版本,将配置恢复到该版本状态。

九、配置管理的高可用性

  1. Nacos Server 集群部署
    • 为了实现配置管理的高可用性,需要将 Nacos Server 进行集群部署。假设我们有三台服务器,分别为 server1server2server3
    • 首先,在每台服务器上安装 Nacos Server,并修改 conf/cluster.conf 文件,添加集群节点信息:
    server1:8848
    server2:8848
    server3:8848
    
    • 然后,在每台服务器上启动 Nacos Server。
  2. Spring Boot 应用连接集群
    • 在 Spring Boot 应用的 bootstrap.properties 文件中,修改 spring.cloud.nacos.config.server - addr 配置为集群地址:
    spring.cloud.nacos.config.server - addr = server1:8848,server2:8848,server3:8848
    
    • 这样,Spring Boot 应用就可以从 Nacos Server 集群中获取配置,当某一台 Nacos Server 出现故障时,应用仍然可以从其他节点获取配置,保证了配置管理的高可用性。

十、与其他 Spring Cloud 组件的集成

  1. 与 Spring Cloud Gateway 集成
    • 在微服务架构中,Spring Cloud Gateway 常作为网关使用。可以将网关的路由配置存储在 Nacos 配置中心。
    • 首先,在 Nacos 控制台创建一个配置文件,例如 gateway - routes.properties
    • gateway - routes.properties 中添加路由配置,如:
    spring.cloud.gateway.routes[0].id = service - 1 - route
    spring.cloud.gateway.routes[0].uri = lb://service - 1
    spring.cloud.gateway.routes[0].predicates[0] = Path=/service - 1/**
    
    • 在 Spring Cloud Gateway 项目的 bootstrap.properties 文件中,配置 Nacos 配置中心:
    spring.application.name = gateway - service
    spring.cloud.nacos.config.server - addr = 127.0.0.1:8848
    spring.cloud.nacos.config.file - extension = properties
    spring.cloud.nacos.config.shared - dataids = gateway - routes.properties
    spring.cloud.nacos.config.refreshable - dataids = gateway - routes.properties
    
    • 这样,Spring Cloud Gateway 就可以从 Nacos 配置中心动态获取路由配置,并且当配置发生变化时,网关能够自动更新路由。
  2. 与 Spring Cloud Sleuth 集成
    • Spring Cloud Sleuth 用于分布式链路追踪。可以将 Sleuth 的相关配置存储在 Nacos 配置中心。
    • 在 Nacos 控制台创建一个配置文件,如 sleuth - config.properties,添加 Sleuth 配置项,如 spring.sleuth.sampler.probability = 1.0
    • 在使用 Spring Cloud Sleuth 的微服务项目的 bootstrap.properties 文件中,配置 Nacos 配置中心并引入该共享配置:
    spring.application.name = my - microservice
    spring.cloud.nacos.config.server - addr = 127.0.0.1:8848
    spring.cloud.nacos.config.file - extension = properties
    spring.cloud.nacos.config.shared - dataids = sleuth - config.properties
    spring.cloud.nacos.config.refreshable - dataids = sleuth - config.properties
    
    • 这样,微服务就可以从 Nacos 配置中心获取 Sleuth 的配置,并且在配置更新时动态应用新的配置。

通过以上对 Spring Cloud Alibaba 配置管理的实践,我们可以有效地管理微服务架构中的各种配置,提高系统的可维护性、灵活性和稳定性。无论是基本配置的获取与更新,还是多环境、共享配置等复杂场景,Spring Cloud Alibaba 配置管理都提供了完善的解决方案。同时,与其他 Spring Cloud 组件的集成也进一步拓展了其在微服务生态中的应用范围。在实际项目中,开发者可以根据具体需求,灵活运用这些配置管理功能,构建出健壮、高效的微服务系统。