实战:基于 Spring 的应用配置如何迁移至阿里云应用配置管理 ACM
最近遇到一些开发者朋友,准备将原有的Java Spring的应用配置迁移到 阿里云应用配置管理 ACM 中。迁移过程中,遇到不少有趣的问题。本文将通过一个简单的样例来还原迁移过程中遇到的问题和相关解决思路,以期达到和读者交流的目的。
什么样的配置适合进入配置中心
这是所有准备迁移配置到配置中心的用户遇到的第一个问题。我们将从时效性和安全这两个维度进行分析。

时效性:静态 VS 动态
静态配置是指程序版本一旦发布,基本上不会修改的配置内容,例如:
- 软件版本号:显然版本号一经确定,产品基本上不需要改。
- 日志样式:日志的layout,如时间戳,文件名,日志级别等排版,基本上也不需要大改。
- 三方软件LicenseKey:基本上也是一经发布,很少变化。不排除中途三方软件License升级,但是这种升级一般都可以根据软件重新发版来解决配置变更。
- PaaS平台连接串:如数据库连接串,中间包含数据库,用户名和密码等。除非因为合规原因修改密码,或者数据发生迁移等,否则也是很少变化。
动态配置是指程序运行时的一些配置变化,通常会影响到程序的一些运行行为,例如:
- 限流降级参数:限流降级参数一般都不太固定。系统一般在运行时最好是需要根据实际workload pattern来动态调节限流参数如阈值RT,峰值TPS,等。
- 监控报警阈值:如交易环比下跌20%产生error报警,下跌50%产生critical报警。 对于监控系统来讲,线上业务特征由于变化比较频繁,因此一般也不将报警的阈值写死,
- 日志打印级别:线上一旦出现诡异的行为,希望吧日志打印级别从error比如调高到debug,一般都比较希望能动态的去调整,而不需要重启应用。
- 容灾多活:一旦站点反生灾难,一定是希望切换是越快越好。因此配置必须动态秒级生效,尽可能降低资损。
从时效性的维度来讲,一般建议用户把静态配置存放到自己文件中,尽可能保持简单,但是需要把动态配置放到配置中心里,以加强灵活性和应用动态变更的实效性。
安全:非敏感 VS 敏感
非敏感配置一般指偏向技术类,暴露后不会导致配置上的安全隐患,例如:
- 软件版本号:跟产品迭代相关,无业务属性,非敏感配置。
- 日志样式:一般跟程序事后诊断相关,非敏感配置。
- 日志打印级别:影响日志打印的多或少,非敏感配置。
- 限流降级参数:限流降级主要为维持内部应用稳定,非敏感配置。
- 监控报警阈值:主要是影响业务的报警精度,非敏感配置。
- 容灾多活:一般和数据主备配置和业务分片相关,非敏感配置。
敏感配置通常和业务数据相关,一旦泄露将引起安全隐患,例如:
- 三方软件LicenseKey:一旦泄露容易发生LicenseKey被盗用,为敏感配置。
- PaaS平台连接串:典型如数据库连接串,一旦泄露,无论内部或外部用户,都可以很容易地登到业务数据库接触到业务敏感信息,为敏感配置。
从安全的维度来看,我们通常建议用户把非敏感配置存放到自己的文件中,尽可能保持简单,但是需要把敏感配置放到配置中心里,并加密且做好鉴权,尽量不要让无关人员接触到。

时效性和安全分析总结
基于 Spring 框架的Java应用配置如何迁移
使用Spring框架的Java开发者一般经常用到的一种配置注解姿势是利用Spring的@value注解。
原始的纯静态文件场景
例如这个配置,包含两个配置参数,一个是软件的版本号,一个是数据库连接串:

通过@PropertySource和@value的注解来自动注入配置。
@Configuration
@ComponentScan("com.alibaba")
@PropertySource("classpath:myApp.properties")
public class AppConfig {
@Value(value="${url}")
private String URL;
@Value(value="${dbuser}")
private String USER;
@Value(value="${driver}")
private String DRIVER;
@Value(value="${dbpassword}")
private String PASSWORD;
@Value(value="${appVersion}")
private String version;
}
以上代码省略了相关数据库连接初始化等操作。
开始配置迁移,进入混合配置场景
目前由于安全合规或配置时效等原因,要开始迁移配置到ACM上。经过分析,我们发现部分数据库的配置最好迁移到ACM,以红色字体标注。红色部分将全部被迁移到ACM中。
接下来主要三个改动,先归纳下。
- 在ACM控制台种增加相关配置的记录。
- Java工程包中增加 ACM SDK 相关依赖。
- 少许修改代码,增加在ACM中取配置的注解代码。
第一步,直接到ACM中创建配置项,名字为myapp.dbconfig.properties,并把配置内容编辑在对应编辑框中。详细操作指南请参见 ACM 快速入门文档,操作截图如下。

第二步,在maven的pom.xml中增加依赖,如下。
<dependency>
<groupId>com.alibaba.nacos</groupId>
<artifactId>nacos-spring-context</artifactId>
<version>0.2.1- RC1</version>
</dependency>
第三步,在对应AppConfig.java代码中植入API注解,通过ACM去获取动态配置。代码增加部分如红色字体部分。
@Configuration @ComponentScan("com.journaldev")
@PropertySource("classpath:myApp.properties")
@EnableNacosConfig(globalProperties =
@NacosProperties(endpoint = "acm.aliyun.com", namespace = "xxx", accessKey = "xxx", secretKey = "xxx"))
@NacosPropertySource(dataId = "myApp.dbconfig.properties", autoRefreshed = true) public class AppConfig {
@Value(value="${url}") private String URL;
@Value(value="${dbuser}") private String USER;
@Value(value="${driver}") private String DRIVER;
@Value(value="${dbpassword}") private String PASSWORD;
@Value(value="${appVersion}")
private String version; public String getVersion() {
return version;
}
}
至此,改动结束。通过ACM SDK支持Spring的@value注解能力,代码几乎0改动。
几点注意事项
在以上代码实例中,有几样事情需要注意:
- 代码中使用的ACM SDK为Nacos SDK。Nacos (http://nacos.io) 为ACM的开源实现,ACM无缝兼容所有Nacos的接口。
在代码示例中,使用了明文注解来写死ACM的endpoint, namespace, AK, SK, 等等。在实际操作种,相关变量其实不用写死。
- endpoint namespace等可以通过ACM的相关文件配置或系统变量来解决。详情参见:https://help.aliyun.com/document_detail/60138.html
- AK, SK等敏感信息可以通过ECS Ram Role功能来让系统自行判断,代码不用写死。详情参见:https://help.aliyun.com/document_detail/72013.html
- 代码中未包含动态配置监听的回调部分。基于Spring的动态配置相关使用方法请参见:https://github.com/nacos-group/nacos-spring-project
阅读原文
更多技术干货 请关注阿里云云栖社区微信号 :yunqiinsight
实战:基于 Spring 的应用配置如何迁移至阿里云应用配置管理 ACM的更多相关文章
- Spring Boot 揭秘与实战 附录 - Spring Boot 公共配置
Spring Boot 公共配置,配置 application.properties/application.yml 文件中. 摘自:http://docs.spring.io/spring-boot ...
- 将个人博客从GitHub迁移至阿里云服务器过程总结
让我们先回顾下前两篇博客: 程序员如何从0到1搭建自己的技术博客 在个人博客中优雅的使用Gitalk评论插件 通过前两篇博客,我们了解了如何快速的从0到1搭建一个个人博客并使用了Gitalk评论插件, ...
- 大数据平台Hive数据迁移至阿里云ODPS平台流程与问题记录
一.背景介绍 最近几天,接到公司的一个将当前大数据平台数据全部迁移到阿里云ODPS平台上的任务.而申请的这个ODPS平台是属于政务内网的,因考虑到安全问题当前的大数据平台与阿里云ODPS的网络是不通的 ...
- Linux下配置yum源为阿里云或网易的详解
一.yum源概述 yum需要一个yum库,也就是yum源.默认情况下,CentOS就有一个yum源.在/etc/yum.repos.d/目录下有一些默认的配置文件(可以将这些文件移到/opt下,或者直 ...
- 实战基于Spring Boot 2的WebFlux和mLab搭建反应式Web
Spring Framework 5带来了新的Reactive Stack非阻塞式Web框架:Spring WebFlux.作为与Spring MVC并行使用的Web框架,Spring WebFlux ...
- Spring框架学习笔记(6)——阿里云服务器部署Spring Boot项目(jar包)
最近接外包,需要部署服务器,便是参考了网上的几篇博文,成功在阿里云服务器成功部署了Spring Boot项目,特记下本篇笔记 Spring Boot项目打包 这里说一下部署的一些问题 1.mysql驱 ...
- 由一次自建库迁移到阿里云RDS引发的性能问题。
刚入职一互联网公司,项目正好处于计划上线的时间,由于公司前不久已经购买了rds服务,领导决定尝试一番! 当然,新事物.云事物还是要谨慎的.安排我先把测试环境数据库迁移上去,这里吐槽一下,往rds迁移一 ...
- 记一次阿里云ECS服务器图片资源迁移至 阿里云 oss
系统用户上传的图片资源放在ECS服务器,图片要做cdn加速,图片量越来越大(第一年200G,还在用户再增加图片量疯狂增长)备份是个问题. 决定迁移至 oss.前端直接上传oss 后台做签名,回调入库图 ...
- CentOS配置本地yum源/阿里云yum源/163yuan源,并配置yum源的优先级
一.用Centos镜像搭建本地yum源 由于安装centos后的默认yum源为centos的官方地址,所以在国内使用很慢甚至无法访问,所以一般的做法都是把默认的yum源替换成aliyun的yum源或者 ...
随机推荐
- TCP/IP的分层管理_01
1.TCP/IP协议族里最重要的一点就是分层.TCP/IP协议族按层次分别分为以下4层: 应用层,传输层,网络层和数据链路层. 应用层:决定了向用户提供应用服务时通 ...
- UVA 10529 - Dumb Bones (概率dp)
题目描述 You are trying to set up a straight line of dominos, standing on end, to be pushed over later f ...
- sql server 基础语法4 实践练习+子查询
drop table class create table class ( classId ) primary key not null, cName ) ) insert into class ', ...
- 20175223 MySQL
目录 完成结果 要求 1 :导入world.sql 要求 2 :CityWanna.java CityWanna.java 要求 3 :CountryWanna.java CountryWanna.j ...
- django更换默认数据库sqlite3为pymsql后出现Keyerror:255的解决办法----升级PyMySQL
一.更换数据库的办法: 1.安装PyMySQL 2.修改project目录同名文件下的settings.py:DATABASES = { 'default': { # 'ENGINE': 'djang ...
- 有关JWT(Json Web Token)的那些事
用户认证是计算机安全领域一个永恒的热点话题,然而你会发现,开发者很少讨论有关Json Web Token的话题,其实使用Json Web Token集成到API身份验证机制中是容易,本文给大家普及基础 ...
- ASP.NET Core学习——7
多环境ASP.NET Core介绍了支持在多种环境中管理应用程序行为的改进,如开发(devlopment),预演(staging)和生成(production).环境变量用来指示应用程序正在运行的环境 ...
- 用iptables实现代理上网
环境:内网:eth1:192.168.2.0/24外网:eth0:10.17.0.111用iptables实现NATSNAT:改变数据包的源地址.防火墙会使用外部地址,替换数据包的本地网络地址.这样使 ...
- 基于MFC的Media Player播放器的制作(3---功能实现)
| 版权声明:本文为博主原创文章,未经博主允许不得转载. 下面我们试试一下,按下退出Button退出播放器的功能: 首先,我们双击退出Button按钮,就会弹出下图的框: 上面的弄好之后我们就实现 ...
- 去BAT面试完的Mysql面试题总结(55道,带完整答案)
1.一张表里面有ID自增主键,当insert了17条记录之后,删除了第15,16,17条记录,再把mysql重启,再insert一条记录,这条记录的ID是18还是15 ? 2.mysql的技术特点是什 ...