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

简介: 最近遇到一些开发者朋友,准备将原有的Java Spring的应用配置迁移到 阿里云应用配置管理 ACM 中。迁移过程中,遇到不少有趣的问题。本文将通过一个简单的样例来还原迁移过程中遇到的问题和相关解决思路,以期达到和读者交流的目的。

最近遇到一些开发者朋友,准备将原有的Java Spring的应用配置迁移到 阿里云应用配置管理 ACM 中。迁移过程中,遇到不少有趣的问题。本文将通过一个简单的样例来还原迁移过程中遇到的问题和相关解决思路,以期达到和读者交流的目的。

什么样的配置适合进入配置中心

这是所有准备迁移配置到配置中心的用户遇到的第一个问题。我们将从时效性和安全这两个维度进行分析。

1543573796096_9bdfb367_f600_409b_b38a_ad13d730f76b

时效性:静态 VS 动态

静态配置是指程序版本一旦发布,基本上不会修改的配置内容,例如:

  • 软件版本号:显然版本号一经确定,产品基本上不需要改。
  • 日志样式:日志的layout,如时间戳,文件名,日志级别等排版,基本上也不需要大改。
  • 三方软件LicenseKey:基本上也是一经发布,很少变化。不排除中途三方软件License升级,但是这种升级一般都可以根据软件重新发版来解决配置变更。
  • PaaS平台连接串:如数据库连接串,中间包含数据库,用户名和密码等。除非因为合规原因修改密码,或者数据发生迁移等,否则也是很少变化。

动态配置是指程序运行时的一些配置变化,通常会影响到程序的一些运行行为,例如:

  • 限流降级参数:限流降级参数一般都不太固定。系统一般在运行时最好是需要根据实际workload pattern来动态调节限流参数如阈值RT,峰值TPS,等。
  • 监控报警阈值:如交易环比下跌20%产生error报警,下跌50%产生critical报警。 对于监控系统来讲,线上业务特征由于变化比较频繁,因此一般也不将报警的阈值写死,
  • 日志打印级别:线上一旦出现诡异的行为,希望吧日志打印级别从error比如调高到debug,一般都比较希望能动态的去调整,而不需要重启应用。
  • 容灾多活:一旦站点反生灾难,一定是希望切换是越快越好。因此配置必须动态秒级生效,尽可能降低资损。

从时效性的维度来讲,一般建议用户把静态配置存放到自己文件中,尽可能保持简单,但是需要把动态配置放到配置中心里,以加强灵活性和应用动态变更的实效性。

安全:非敏感 VS 敏感

非敏感配置一般指偏向技术类,暴露后不会导致配置上的安全隐患,例如:

  • 软件版本号:跟产品迭代相关,无业务属性,非敏感配置。
  • 日志样式:一般跟程序事后诊断相关,非敏感配置。
  • 日志打印级别:影响日志打印的多或少,非敏感配置。
  • 限流降级参数:限流降级主要为维持内部应用稳定,非敏感配置。
  • 监控报警阈值:主要是影响业务的报警精度,非敏感配置。
  • 容灾多活:一般和数据主备配置和业务分片相关,非敏感配置。

敏感配置通常和业务数据相关,一旦泄露将引起安全隐患,例如:

  • 三方软件LicenseKey:一旦泄露容易发生LicenseKey被盗用,为敏感配置。
  • PaaS平台连接串:典型如数据库连接串,一旦泄露,无论内部或外部用户,都可以很容易地登到业务数据库接触到业务敏感信息,为敏感配置。

从安全的维度来看,我们通常建议用户把非敏感配置存放到自己的文件中,尽可能保持简单,但是需要把敏感配置放到配置中心里,并加密且做好鉴权,尽量不要让无关人员接触到。

_2018_12_03_10_01_30

时效性和安全分析总结

基于 Spring 框架的Java应用配置如何迁移

使用Spring框架的Java开发者一般经常用到的一种配置注解姿势是利用Spring的@value注解。

原始的纯静态文件场景

例如这个配置,包含两个配置参数,一个是软件的版本号,一个是数据库连接串:

_2018_12_03_10_17_12

通过@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 快速入门文档,操作截图如下。

1543566792866_88abe9b8_890d_4a64_a016_76f905de94ba

第二步,在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改动。

几点注意事项

在以上代码实例中,有几样事情需要注意:

更多信息

代码实例下载链接

提取密码:gy57

如果您对阿里云应用配置管理 ACM的开源版产品 Nacos 感兴趣,请访问我们的官网网站,或是扫描以下二维码加入我们。

1543571210478_43c6b705_e8a4_4ef7_a74c_e89fe906f8f2

相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
相关文章
|
7天前
|
SQL Java 数据库连接
(自用)Spring常用配置
(自用)Spring常用配置
13 0
|
12天前
招募!阿里云x魔搭社区发起Create@AI创客松邀你探索下一代多维智能体应用
招募!阿里云x魔搭社区发起Create@AI创客松邀你探索下一代多维智能体应用
267 0
|
29天前
|
SQL Java 数据库连接
挺详细的spring+springmvc+mybatis配置整合|含源代码
挺详细的spring+springmvc+mybatis配置整合|含源代码
35 1
|
21天前
|
安全 Java 数据安全/隐私保护
【深入浅出Spring原理及实战】「EL表达式开发系列」深入解析SpringEL表达式理论详解与实际应用
【深入浅出Spring原理及实战】「EL表达式开发系列」深入解析SpringEL表达式理论详解与实际应用
44 1
|
7天前
|
JSON Java 数据库连接
属性注入掌握:Spring Boot配置属性的高级技巧与最佳实践
属性注入掌握:Spring Boot配置属性的高级技巧与最佳实践
14 1
|
7天前
|
Java 数据库连接 Spring
简化配置,提高灵活性:Spring中的参数化配置技巧
简化配置,提高灵活性:Spring中的参数化配置技巧
17 0
|
7天前
|
Java Shell 测试技术
一次配置,多场景适用:Spring Boot多套配置文件的深度剖析
一次配置,多场景适用:Spring Boot多套配置文件的深度剖析
16 0
一次配置,多场景适用:Spring Boot多套配置文件的深度剖析
|
8天前
|
云安全 数据采集 安全
阿里云安全产品,Web应用防火墙与云防火墙产品各自作用简介
阿里云提供两种关键安全产品:Web应用防火墙和云防火墙。Web应用防火墙专注网站安全,防护Web攻击、CC攻击和Bot防御,具备流量管理、大数据防御能力和简易部署。云防火墙是SaaS化的网络边界防护,管理南北向和东西向流量,提供访问控制、入侵防御和流量可视化。两者结合可实现全面的网络和应用安全。
阿里云安全产品,Web应用防火墙与云防火墙产品各自作用简介
|
11天前
|
Java 容器
SpringBoot使用配置注解开启自动配置功能&整合spring-boot-configuration-processor
SpringBoot使用配置注解开启自动配置功能&整合spring-boot-configuration-processor
12 0
|
18天前
|
消息中间件 Kubernetes Kafka
Terraform阿里云创建资源1分钟创建集群一键发布应用Terraform 创建 Kubernetes 集群
Terraform阿里云创建资源1分钟创建集群一键发布应用Terraform 创建 Kubernetes 集群
14 0

热门文章

最新文章