最近遇到一些开发者朋友,准备将原有的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 为ACM的开源实现,ACM无缝兼容所有Nacos的接口。
  • 在代码示例中,使用了明文注解来写死ACM的endpoint, namespace, AK, SK, 等等。在实际操作种,相关变量其实不用写死。

    • endpoint namespace等可以通过ACM的相关文件配置或系统变量来解决。
    • AK, SK等敏感信息可以通过ECS Ram Role功能来让系统自行判断,代码不用写死。
  • 代码中未包含动态配置监听的回调部分。

原文链接
本文为云栖社区原创内容,未经允许不得转载。

实战:基于 Spring 的应用配置如何迁移至阿里云应用配置管理 ACM相关推荐

  1. 阿里云应用配置管理ACM发布,重新定义云上配置的存放方式

    9月26日,阿里云宣布应用配置管理ACM产品正式商用,将重新定义云上配置的存放方式. 据了解,该产品具备亿级应用配置处理能力,将分布式架构下的应用配置管理智能化,极大的降低了在微服务.Devops.大 ...

  2. 基于TCP协议的GPS定位器设备迁移到阿里云IoT物联网平台实践——实践类

    背景 GPS定位器是内置了GPS模块和移动通信模块的终端,用来将GPS模块获得的定位数据通过移动通信模块传至Internet上的一台服务器上,从而可以实现在电脑或手机上查询终端位置. GPS定位器可用 ...

  3. 自建Hive数据仓库跨版本迁移到阿里云E-MapReduce

    最佳实践概述 应用场景 客户在IDC或者公有云环境自建Hadoop集群,数据集中保存在HDFS文件系统,同时借助Hive进行常见的ETL任务.客户在决策上云之后,会将自建Hadoop集群的数据迁移到阿 ...

  4. 【云计算的1024种玩法】轻松将其他云的对象储存迁移至阿里云OSS

    前言 当使用了像 OSS.S3 这样的开放对象储存的 PaaS 产品后,一面上体验到了网站核心同附件库分离的安全性.高性能以及免维护的便利性,一面上却又怕在一个厂家的对象储存上扎根了就无法迁移,会被厂 ...

  5. Python Flask web 项目零改动迁移至阿里云函数计算

    引言 最近尝试了一下阿里云的函数计算,整体感觉很好,主要是省钱!下面就简单聊一下,如何将 Python Flask 的 web 项目迁移至函数计算. 创建一个银行卡校验的 RestAPI 文件名:in ...

  6. ERP物理机迁移至阿里云实践

    摘要: ERP物理机迁移至阿里云实践 机房选型 随着公司的不断发展,业务量逐渐增大,对信息化的要求也越来越高,随之对信息部的要求也越来越多,为此公司决定对现有的信息系统进行升级改造. ERP物理机迁移 ...

  7. 数据传输服务 DTS > 数据迁移 > 从自建数据库迁移至阿里云 > 源库为MySQL > 从自建MySQL迁移至RDS MySQL

    从自建MySQL迁移至RDS MySQL 更新时间:2020-08-20 10:49:52 编辑我的收藏 本页目录 前提条件 注意事项 费用说明 迁移类型说明 增量数据迁移支持同步的SQL操作 数据库 ...

  8. 数据库表迁移到阿里云的方法有哪些

    数据库表迁移到阿里云的方法有哪些,数据软件整体迁移. 服务器的空间大小.稳定性.安全性以及其他因素会影响网站的优化.许多企业在网站运行过程中,这些因素的影响使得企业不得不更换一个新的服务器.如何正确更 ...

  9. 阿里云迁移工具推荐最佳实践:Xen虚拟化迁移到阿里云

    1.迁移需求分析 Xen虚拟化是早期半虚拟化技术,现有部分本地还在使用,像Citrix公司开发的XenServer虚拟化管理平台,底层就是运用的xen虚拟化技术底座,但是目前市场使用比较多的还是开源K ...

最新文章

  1. C语言 之 PTA乙级错误集锦
  2. 如何改变java中的库包_如何在Java / Android模块化库中使两个相互独立的包相互独立?...
  3. Castle IOC容器内幕故事(上)
  4. Oracle数据删除后恢复
  5. GPM - 多语言实现视频
  6. [codevs 1302] 小矮人(2002年CEOI中欧信息学奥赛)
  7. (笔记)Mysql命令drop database:删除数据库
  8. 计算机网络中TCP连接管理,计算机网络 TCP协议
  9. jquery库实现iframe自适应内容高度和宽度
  10. 高等代数——大学高等代数课程创新教材(丘维声)——2.3笔记+习题
  11. Python爬虫之scrapy分布式爬虫
  12. Appium连接逍遥模拟器,解决Timing Out
  13. C++ 坑人小程序(全集)
  14. 使用CSS画一个三角形
  15. border.css
  16. Bugly 1:版本更新
  17. 专访羽顺热能董事长陈群:荣誉就是不懈的努力
  18. Linux下使用hiredis库与libevent实现异步接口的I/O复用
  19. Google云计算三大论文中英文版
  20. 网络线路及带宽中CN2,GIA,CIA,BGP,CMI以及IPLC都是什么意思?

热门文章

  1. python 环境管理工具_再见 virtualenv!K神教你轻松管理多个Python环境
  2. python多进程和多线程使用场景_Python36 多线程、多进程的使用场景
  3. linux内存管理_浅谈Linux内存管理
  4. 【LeetCode笔记 - 每日一题】373. 查找和最小的 K 对数字(Java、堆、优先队列)
  5. mysql导入greenplum_greenPlum中通过gpfdist导入文本数据到数据库表中
  6. ios 主题切换 思路_IOS主题切换ThemeManager
  7. linux无filelength函数,Linux Shell 自定义函数(定义、返回值、变量作用域)介绍
  8. 只有数学老师懂的15个泪流满面的瞬间~
  9. 数学之史:微积分的发明——变量数学的巨人之争
  10. 我们需要打造有意识的人工智能吗?