Spring Cloud Alibaba 配置管理实践
2023-07-302.6k 阅读
一、Spring Cloud Alibaba 配置管理概述
在微服务架构中,配置管理是一个至关重要的环节。不同的微服务可能需要不同的配置,并且在不同的环境(开发、测试、生产等)下,配置也会有所差异。Spring Cloud Alibaba 提供了一套完善的配置管理解决方案,帮助开发者轻松应对这些挑战。
Spring Cloud Alibaba 配置管理基于 Nacos 配置中心。Nacos 是一个易于使用的动态服务发现、配置管理和服务管理平台。它可以集中管理微服务的配置,支持配置的动态更新,使得开发者无需重启微服务就能应用新的配置。
二、环境搭建
- 安装 Nacos Server
- 首先,从 Nacos 官方网站(https://github.com/alibaba/nacos/releases)下载合适版本的 Nacos 安装包。以 Linux 环境为例,解压下载的压缩包:
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 安装完成。
- 创建 Spring Boot 项目并集成 Nacos 配置
- 使用 Spring Initializr(https://start.spring.io/)创建一个 Spring Boot 项目,添加
Spring Cloud Alibaba Nacos Config
和Spring 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
。
- 使用 Spring Initializr(https://start.spring.io/)创建一个 Spring Boot 项目,添加
三、基本配置管理
- 在 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
。
- Data ID:格式为
- 点击“发布”按钮,配置文件创建完成。
- 在 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 配置值。
- 在 Spring Boot 应用中,可以通过
四、配置的动态更新
- 开启动态更新支持
- 在 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
注解表示该类中的配置属性支持动态刷新。
- 在 Spring Boot 应用中,要实现配置的动态更新,需要对获取配置的方式进行一些调整。首先,使用
- 动态更新配置
- 在 Nacos 控制台,找到之前创建的
my - service - dev.properties
配置文件,修改database.url
的值,例如改为jdbc:mysql://new - host:3306/mydb
。 - 点击“发布”按钮后,再次访问
http://localhost:8080/config
,会发现获取到的数据库 URL 已经更新为新的值,无需重启 Spring Boot 应用。
- 在 Nacos 控制台,找到之前创建的
五、多环境配置管理
- 不同环境配置文件的创建
- 在 Nacos 控制台,为不同环境创建相应的配置文件。例如,除了
my - service - dev.properties
外,再创建my - service - test.properties
和my - 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
。
- 在 Nacos 控制台,为不同环境创建相应的配置文件。例如,除了
- 切换环境配置
- 在 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
。
- 在 Spring Boot 应用的
六、共享配置管理
- 创建共享配置文件
- 在 Nacos 控制台,创建共享配置文件。例如,创建一个名为
common.properties
的配置文件,Group 设为DEFAULT_GROUP
。 - 在
common.properties
中添加一些共享的配置项,如logging.level.com.example = INFO
。
- 在 Nacos 控制台,创建共享配置文件。例如,创建一个名为
- 在应用中使用共享配置
- 在 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
中的配置发生变化,应用也能动态获取到新的配置。
- 在 Spring Boot 应用的
七、配置加密与解密
- 配置加密需求
- 在实际应用中,有些配置信息(如数据库密码)是敏感信息,不适合明文存储在配置中心。Spring Cloud Alibaba 支持对配置进行加密和解密。
- 使用 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 会自动对加密的配置进行解密,应用可以像获取普通配置一样获取解密后的密码。
- 首先,在项目中添加相关依赖,如
八、配置版本管理
- Nacos 配置版本概念
- Nacos 配置中心支持配置的版本管理。每次对配置文件的修改都会生成一个新的版本号,方便开发者追溯配置的变更历史。
- 查看配置版本
- 在 Nacos 控制台的配置列表中,点击某个配置文件的“版本历史”按钮,可以查看该配置文件的所有版本记录。记录中包含版本号、修改时间、修改人等信息。
- 通过版本管理,开发者可以在配置出现问题时,快速回滚到之前的某个版本。例如,当应用在更新配置后出现异常,可以根据版本历史找到上一个正常的版本,将配置恢复到该版本状态。
九、配置管理的高可用性
- Nacos Server 集群部署
- 为了实现配置管理的高可用性,需要将 Nacos Server 进行集群部署。假设我们有三台服务器,分别为
server1
、server2
和server3
。 - 首先,在每台服务器上安装 Nacos Server,并修改
conf/cluster.conf
文件,添加集群节点信息:
server1:8848 server2:8848 server3:8848
- 然后,在每台服务器上启动 Nacos Server。
- 为了实现配置管理的高可用性,需要将 Nacos Server 进行集群部署。假设我们有三台服务器,分别为
- 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 Boot 应用的
十、与其他 Spring Cloud 组件的集成
- 与 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 配置中心动态获取路由配置,并且当配置发生变化时,网关能够自动更新路由。
- 与 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 组件的集成也进一步拓展了其在微服务生态中的应用范围。在实际项目中,开发者可以根据具体需求,灵活运用这些配置管理功能,构建出健壮、高效的微服务系统。