實戰:基於 Spring 的應用配置如何遷移至阿里雲應用配置管理 ACM

最近遇到一些開發者朋友,準備將原有的Java Spring的應用配置遷移到 阿里雲應用配置管理 ACM 中。遷移過程當中,遇到很多有趣的問題。本文將經過一個簡單的樣例來還原遷移過程當中遇到的問題和相關解決思路,以期達到和讀者交流的目的。html

什麼樣的配置適合進入配置中心

這是全部準備遷移配置到配置中心的用戶遇到的第一個問題。咱們將從時效性和安全這兩個維度進行分析。java

時效性:靜態 VS 動態

靜態配置是指程序版本一旦發佈,基本上不會修改的配置內容,例如:git

  • 軟件版本號:顯然版本號一經肯定,產品基本上不須要改。
  • 日誌樣式:日誌的layout,如時間戳,文件名,日誌級別等排版,基本上也不須要大改。
  • 三方軟件LicenseKey:基本上也是一經發布,不多變化。不排除中途三方軟件License升級,可是這種升級通常均可以根據軟件從新發版來解決配置變動。
  • PaaS平臺鏈接串:如數據庫鏈接串,中間包含數據庫,用戶名和密碼等。除非由於合規緣由修改密碼,或者數據發生遷移等,不然也是不多變化。

動態配置是指程序運行時的一些配置變化,一般會影響到程序的一些運行行爲,例如:github

  • 限流降級參數:限流降級參數通常都不太固定。系統通常在運行時最好是須要根據實際workload pattern來動態調節限流參數如閾值RT,峯值TPS,等。
  • 監控報警閾值:如交易環比下跌20%產生error報警,下跌50%產生critical報警。 對於監控系統來說,線上業務特徵因爲變化比較頻繁,所以通常也不將報警的閾值寫死,
  • 日誌打印級別:線上一旦出現詭異的行爲,但願吧日誌打印級別從error好比調高到debug,通常都比較但願能動態的去調整,而不須要重啓應用。
  • 容災多活:一旦站點反生災難,必定是但願切換是越快越好。所以配置必須動態秒級生效,儘量下降資損。

從時效性的維度來說,通常建議用戶把靜態配置存放到本身文件中,儘量保持簡單,可是須要把動態配置放到配置中內心,以增強靈活性和應用動態變動的實效性。spring

安全:非敏感 VS 敏感

非敏感配置通常指偏向技術類,暴露後不會致使配置上的安全隱患,例如:數據庫

  • 軟件版本號:跟產品迭代相關,無業務屬性,非敏感配置。
  • 日誌樣式:通常跟程序過後診斷相關,非敏感配置。
  • 日誌打印級別:影響日誌打印的多或少,非敏感配置。
  • 限流降級參數:限流降級主要爲維持內部應用穩定,非敏感配置。
  • 監控報警閾值:主要是影響業務的報警精度,非敏感配置。
  • 容災多活:通常和數據主備配置和業務分片相關,非敏感配置。

敏感配置一般和業務數據相關,一旦泄露將引發安全隱患,例如:安全

  • 三方軟件LicenseKey:一旦泄露容易發生LicenseKey被盜用,爲敏感配置。
  • PaaS平臺鏈接串:典型如數據庫鏈接串,一旦泄露,不管內部或外部用戶,均可以很容易地登到業務數據庫接觸到業務敏感信息,爲敏感配置。

從安全的維度來看,咱們一般建議用戶把非敏感配置存放到本身的文件中,儘量保持簡單,可是須要把敏感配置放到配置中內心,並加密且作好鑑權,儘可能不要讓無關人員接觸到。app

時效性和安全分析總結框架

基於 Spring 框架的Java應用配置如何遷移

使用Spring框架的Java開發者通常常常用到的一種配置註解姿式是利用Spring的@value註解。maven

原始的純靜態文件場景

例如這個配置,包含兩個配置參數,一個是軟件的版本號,一個是數據庫鏈接串:

經過@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改動。

幾點注意事項

在以上代碼實例中,有幾樣事情須要注意:

原文連接 

相關文章
相關標籤/搜索