最近遇到一些開發者朋友,準備將原有的Java Spring的應用配置遷移到 阿里雲應用配置管理 ACM 中。遷移過程當中,遇到很多有趣的問題。本文將經過一個簡單的樣例來還原遷移過程當中遇到的問題和相關解決思路,以期達到和讀者交流的目的。html
這是全部準備遷移配置到配置中心的用戶遇到的第一個問題。咱們將從時效性和安全這兩個維度進行分析。java
靜態配置是指程序版本一旦發佈,基本上不會修改的配置內容,例如:git
動態配置是指程序運行時的一些配置變化,一般會影響到程序的一些運行行爲,例如:github
從時效性的維度來說,通常建議用戶把靜態配置存放到本身文件中,儘量保持簡單,可是須要把動態配置放到配置中內心,以增強靈活性和應用動態變動的實效性。spring
非敏感配置通常指偏向技術類,暴露後不會致使配置上的安全隱患,例如:數據庫
敏感配置一般和業務數據相關,一旦泄露將引發安全隱患,例如:安全
從安全的維度來看,咱們一般建議用戶把非敏感配置存放到本身的文件中,儘量保持簡單,可是須要把敏感配置放到配置中內心,並加密且作好鑑權,儘可能不要讓無關人員接觸到。app
時效性和安全分析總結框架
使用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中建立配置項,名字爲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的endpoint, namespace, AK, SK, 等等。在實際操做種,相關變量其實不用寫死。