ACM 服务
ACM介绍
1、应用配置管理 ACM(Application Configuration Management)
前身为淘宝内部配置中心 Diamond,现已作为 Nacos 的配置中心模块开源。
在应用生命周期管理中,开发人员通常会将应用中需要变更的一些配置项或者元数据从代码中分离出来,放在单独的配置文件中管理,这些单独管理的内容就称为应用配置。这种分离应用配置的方法是管理应用变更的常见手段之一。发布应用后,运维人员或最终用户可以通过调整配置来适配环境,或调整应用程序的运行行为。
ACM 是面向分布式系统的配置中心。凭借配置变更、配置推送、历史版本管理、灰度发布、配置变更审计等配置管理工具,ACM 能帮助您集中管理所有应用环境中的配置,降低分布式系统中管理配置的成本,并降低因错误的配置变更带来可用性下降甚至发生故障的风险。
(1) 传统配置管理
在传统架构中,如果配置信息有变更,通常需要登录服务器并手动修改配置来使配置生效,如下图。
(2) Spring Cloud Bus配置自动更新
Spring Cloud Bus依赖RabbitMQ或kafka,以RabbitMQ为例。
1、Spring Cloud bus通过消息队列MQ传递消息给各服务修改配置
2、对外暴露/actuator/bus-refresh接口
3、在git服务器(码云、GitHub等)上配置WebHooks,自动调用/actuator/bus-refresh接口(或手动访问),刷新配置
(3) ACM配置管理
修改ACM 控制台配置,配置信息自动推送到各个服务器中,并在秒级延迟内生效。
2、产品对比
(1) 相似产品简介
- ZooKeeper
ZooKeeper 是一个分布式应用程序协调服务,是 Google Chubby 的开源实现。它是一个为分布式应用提供一致性服务的软件,提供的功能包括配置维护、域名服务、分布式同步、组服务等。在 Hadoop 集群等场景下,ZooKeeper 同时充当应用配置管理的角色。但是由于它是 CP(Consistency,Partition Tolerance) 类应用,因此在可用性和性能上都会受到一定影响。
- etcd
和 ZooKeeper 类似,etcd 是一个高可用的键值存储系统,主要用于配置共享和服务发现。ETCD 是由 CoreOS 开发并维护的,灵感来自于 ZooKeeper 和 Doozer。它使用 Go 语言编写,并通过 Raft 一致性算法处理日志复制以保证强一致性。etcd 和 ZooKeeper 类似,同样可以用来做应用管理配置。但是由于它是强一致的管理类应用,因此其可用性和性能在某些场景会受到一定影响。
- Spring Cloud Config Server
和 ACM 类似,Spring Cloud Config Server 为服务端和客户端提供了分布式系统的外部配置支持。配置服务器为各应用的所有环境提供了一个中心化的外部配置。与 ACM 不同的是,Spring Cloud 配置服务器默认采用 Git 来存储配置信息,其配置存储、版本管理、发布 等功能都基于 Git 或其他外围系统来实现。除此之外,在配置功能方面,ACM 和 Spring Cloud Config 也有很大不同。
(2) 产品对比
以下表格详细描述了 ACM 与 etcd、ZooKeeper 和 Spring Cloud Config 在应用配置管理方面的区别
产品 | ACM | Spring Cloud Config Server | ZooKeeper | ETCD |
---|---|---|---|---|
配置修改 | 直接在 ACM 控制台上进行配置修改 | 一般在 Git 仓库上进行配置修改 | 通过调用 ZK API 修改 | 通过调用 etcd API 修改 |
配置自动推送 | 修改过的配置自动推送到监听的客户端 | 客户端只能在启动的时候加载 | 修改过的配置自动推送到监听的客户端 | 修改过的配置自动推送到监听的客户端 |
API接口 | 基于 RESTful API,同时支持 Java Native 接口,Spring Cloud 接口,和其他语言类接口 | 基于 RESTful API 和 Spring Cloud 规范,同时也支持其他语言客户端 | 支持 Java 原生接口 | 基于 RESTful API 的接口 |
版本管理 | 在 ACM 上自动记录各个修改的版本信息 | 通过 Git 间接管理版本 | 不带任何版本控制 | 不带任何版本控制 |
配置推送追踪 | 可查询所有客户端配置推送状态和轨迹 | 无法查询配置推送历史 | 无法查询配置推送历史 | 无法查询配置推送历史 |
UI控制台 | 阿里云提供ACM UI控制台 | https://github.com/dyc87112/spring-cloud-config-admin 停更一年 | zkui等 | 没了解 |
ACM 与 Spring Cloud Config Server相比,从产品对比,可以看出,只有ACM能够简单直观的,在UI可视化界面上,查看到客户端配置的推送状态、轨迹。反过来看,Spring Cloud Config 存在一个较大的缺陷,那就是依赖于IDE、GIT、等第三方工具
ACM使用文档:
https://help.aliyun.com/document_detail/85466.html?spm=a2c4g.11186623.6.550.63975610UaguKg
3、ACM UI 控制台
ACM 控制台是管理配置的工作台,包含以下区域:
A 顶端导航栏:地域选择、消息、工单等。
B 左侧菜单栏:可导航至配置列表、历史版本、监听查询、推送轨迹、命名空间等子模块。
C 配置管理:提供创建配置、查询配置、修改配置、删除配置四个核心功能及更多高级功能。
D 公告栏:包含重要提醒、产品快报、社区推荐等内容。
具体操作细节可以访问:
https://help.aliyun.com/document_detail/59956.html?spm=a2c4g.11186623.6.554.315f199aL6Qygs
4、ACM 平台访问控制
平台支持创建自定义RAM角色、自定义子RAM用户,并可为它们按需分配权限。详情见:
https://help.aliyun.com/document_detail/85118.html?spm=a2c4g.11186623.6.565.62a33aaaN9HlqG
5、SDK 使用参考
ACM SDK 是 ACM 提供给用户的获取配置手段,用于获取、监听配置。
ACM SDK 目前支持以下类型:
- ACM Java Native SDK:支持 ACM 配置监听和变更的 Java *原生 SDK。
- Spring Cloud ACM:支持 Spring Cloud Config 接口规范的 Java SDK。
后续将不再继续维护,推荐使用 Nacos 的 spring-cloud-starter-alibaba-nacos-config。 - ACM Node.js SDK:支持 ACM 配置监听和变更的 Node.js 原生 SDK。
- ACM C++ SDK:支持 ACM 配置监听和变更的 C++ 原生 SDK。
- ACM Python(已开源):支持 ACM 配置监听和变更的 Python 原生 SDK。
- ACM PHP (已开源):支持 ACM 配置监听的 PHP 原生 * SDK。
- Nacos Client:支持 ACM 配置监听和变更的 Java 原生 SDK。
这里主要介绍一下 Nacos SDK 的 Nacos Spring Cloud的配置。
(1) Nacos Spring Cloud 的ACM 单个Data-Id 配置 实现
ps: 偷懒途径:下载样本工程,直接配置一下properties。 https://github.com/nacos-group/nacos-examples/tree/acm
1、Maven 依赖:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
<version>${latest.version}</version>
</dependency>
PS: Spring Boot 版本选择相应的 spring-cloud-starter-alibaba-nacos-config 版本。
spring-cloud-starter-alibaba-nacos-config 版本 0.2.x.RELEASE 对应 Spring Boot 2.x 版本。
版本 0.1.x.RELEASE 对应 Spring Boot 1.x 版本。
2、在 bootstrap.properties(此处使用bootstrap.yml也可以,亲测有效 nacos-config 版本为 0.2.1.RELEASE) 文件中配置连接信息。
# ACM 左侧命名空间详情中可以找到, End Point的值对应endpoint \\ 命名空间ID的值 对应 namespace
spring.cloud.nacos.config.endpoint=XXXX
spring.cloud.nacos.config.namespace=XXXX
# AccessKey SecretKey
spring.cloud.nacos.config.access-key=XXXX
spring.cloud.nacos.config.secret-key=XXXX
# name
spring.application.name=com.alibaba.nacos.example
# 指定配置的 Data ID 后缀,支持 properties、yaml,默认为 properties (yml其实就是yaml,直接用yaml就好)
spring.cloud.nacos.config.file-extension=properties
# 指定 ACM 配置的 Group ,默认为 DEFAULT_GROUP (新建时点击高级选项)
spring.cloud.nacos.config.group=EXAMPLE
控制台配置的 DataID 的约定格式为 ${spring.application.name}.${spring.cloud.nacos.config.file-extension}
即 在ACM 配置列表的 DataID 必须配置为 com.alibaba.nacos.example.properties
3、使用 Spring 的注解 @Value 设置属性值,使用 Spring Cloud 原生注解 @RefreshScope 实现配置自动更新。
对应ACM配置如下:
@RestController
@RequestMapping("/config")
@RefreshScope
public class ConfigController {
@Value("${connectTimeoutInMills:5000}")
private int connectTimeoutInMills;
public void setConnectTimeoutInMills(int connectTimeoutInMills) {
this.connectTimeoutInMills = connectTimeoutInMills;
}
@RequestMapping(value = "/get", method = GET)
@ResponseBody
public int get() {
return connectTimeoutInMills;
}
}
4、对应ACM配置如下
5、测试一下
访问URL : localhost:8080/config/get
若返回的是:1000,则说明SDK配置生效
(1) 修改配置内容并发布,你会发现控制台开始打印新的日志
(2) 重新访问URL,你会发现,配置已经已经改变
(2) Nacos Spring Cloud 的ACM 多个Data-Id 配置 实现(改成yml同样有效)
基础配置同上.
spring.profiles.active=dev
spring.application.name=UCAP-CRM-SERVICE
spring.cloud.nacos.config.endpoint=XXXX
spring.cloud.nacos.config.namespace=XXXX
# 推荐使用 RAM 用户的 accessKey 和 secretKey
spring.cloud.nacos.config.access-key=XXXX
spring.cloud.nacos.config.secret-key=XXXX
方案一
- 通过 spring.cloud.nacos.config.ext-config[n].data-id 的配置方式来支持多个 Data Id 的配置。
- 通过 spring.cloud.nacos.config.ext-config[n].group 的配置方式自定义 Data Id 所在的组,不明确配置的话,默认是 DEFAULT_GROUP。
- 通过 spring.cloud.nacos.config.ext-config[n].refresh 的配置方式来控制该 Data Id 在配置变更时,是否支持应用中可动态刷新, 感知到最新的配置值。默认是不支持的。
# ACM 配置上的 data-id名 +配置格式 如 crmService-dev.yaml
spring.cloud.nacos.config.ext-config[0].data-id=XXXX
# ACM 配置上的 group
spring.cloud.nacos.config.ext-config[0].group=XXXX
#动态刷新
spring.cloud.nacos.config.ext-config[0].refresh=true
spring.cloud.nacos.config.ext-config[1].data-id=XXXX
spring.cloud.nacos.config.ext-config[1].group=XXXX
spring.cloud.nacos.config.ext-config[1].refresh=XXXX
方案二
多个共享 Data Id 的配置,多个之间用逗号隔开,按照配置出现的先后顺序,即后面的优先级要高于前面。如crmService-dev.yaml,db-dev.yaml
spring.cloud.nacos.config.shared-dataids: XXXX,XXXX
#设置配置是否动态刷新
spring.cloud.nacos.config.refreshable-dataids: XXXX,XXXX
此方案有明显缺陷,目前在官网上没找到对此方案下DataId的Group属性的设置,也就是说此方案的Group 必须是默认值
DEAFULT_GROUP。
Spring Cloud Alibaba Nacos Config 目前提供了三种配置能力从 Nacos 拉取相关的配置。
-
A: 通过 spring.cloud.nacos.config.shared-dataids 支持多个共享 Data Id 的配置
-
B: 通过 spring.cloud.nacos.config.ext-config[n].data-id 的方式支持多个扩展 Data Id 的配置
-
C: 通过内部相关规则(应用名、应用名+ Profile )自动生成相关的 Data Id 配置(暂时没去尝试)
当三种方式共同使用时,他们的一个优先级关系是:A < B < C
官网参考文档:
1、 支持自定义扩展的 Data Id 配置
https://github.com/alibaba/spring-cloud-alibaba/wiki/Nacos-config?spm=a2c4g.11186623.2.16.6e20ca80rygPgN
2、https://github.com/alibaba/spring-cloud-alibaba/issues/141