javascript
实战:基于 Spring 的应用配置如何迁移至阿里云应用配置管理 ACM
最近遇到一些開(kāi)發(fā)者朋友,準(zhǔn)備將原有的Java Spring的應(yīng)用配置遷移到 阿里云應(yīng)用配置管理 ACM 中。遷移過(guò)程中,遇到不少有趣的問(wèn)題。本文將通過(guò)一個(gè)簡(jiǎn)單的樣例來(lái)還原遷移過(guò)程中遇到的問(wèn)題和相關(guān)解決思路,以期達(dá)到和讀者交流的目的。
什么樣的配置適合進(jìn)入配置中心
這是所有準(zhǔn)備遷移配置到配置中心的用戶(hù)遇到的第一個(gè)問(wèn)題。我們將從時(shí)效性和安全這兩個(gè)維度進(jìn)行分析。
時(shí)效性:靜態(tài) VS 動(dòng)態(tài)
靜態(tài)配置是指程序版本一旦發(fā)布,基本上不會(huì)修改的配置內(nèi)容,例如:
- 軟件版本號(hào):顯然版本號(hào)一經(jīng)確定,產(chǎn)品基本上不需要改。
- 日志樣式:日志的layout,如時(shí)間戳,文件名,日志級(jí)別等排版,基本上也不需要大改。
- 三方軟件LicenseKey:基本上也是一經(jīng)發(fā)布,很少變化。不排除中途三方軟件License升級(jí),但是這種升級(jí)一般都可以根據(jù)軟件重新發(fā)版來(lái)解決配置變更。
- PaaS平臺(tái)連接串:如數(shù)據(jù)庫(kù)連接串,中間包含數(shù)據(jù)庫(kù),用戶(hù)名和密碼等。除非因?yàn)楹弦?guī)原因修改密碼,或者數(shù)據(jù)發(fā)生遷移等,否則也是很少變化。
動(dòng)態(tài)配置是指程序運(yùn)行時(shí)的一些配置變化,通常會(huì)影響到程序的一些運(yùn)行行為,例如:
- 限流降級(jí)參數(shù):限流降級(jí)參數(shù)一般都不太固定。系統(tǒng)一般在運(yùn)行時(shí)最好是需要根據(jù)實(shí)際workload pattern來(lái)動(dòng)態(tài)調(diào)節(jié)限流參數(shù)如閾值RT,峰值TPS,等。
- 監(jiān)控報(bào)警閾值:如交易環(huán)比下跌20%產(chǎn)生error報(bào)警,下跌50%產(chǎn)生critical報(bào)警。 對(duì)于監(jiān)控系統(tǒng)來(lái)講,線(xiàn)上業(yè)務(wù)特征由于變化比較頻繁,因此一般也不將報(bào)警的閾值寫(xiě)死,
- 日志打印級(jí)別:線(xiàn)上一旦出現(xiàn)詭異的行為,希望吧日志打印級(jí)別從error比如調(diào)高到debug,一般都比較希望能動(dòng)態(tài)的去調(diào)整,而不需要重啟應(yīng)用。
- 容災(zāi)多活:一旦站點(diǎn)反生災(zāi)難,一定是希望切換是越快越好。因此配置必須動(dòng)態(tài)秒級(jí)生效,盡可能降低資損。
從時(shí)效性的維度來(lái)講,一般建議用戶(hù)把靜態(tài)配置存放到自己文件中,盡可能保持簡(jiǎn)單,但是需要把動(dòng)態(tài)配置放到配置中心里,以加強(qiáng)靈活性和應(yīng)用動(dòng)態(tài)變更的實(shí)效性。
安全:非敏感 VS 敏感
非敏感配置一般指偏向技術(shù)類(lèi),暴露后不會(huì)導(dǎo)致配置上的安全隱患,例如:
- 軟件版本號(hào):跟產(chǎn)品迭代相關(guān),無(wú)業(yè)務(wù)屬性,非敏感配置。
- 日志樣式:一般跟程序事后診斷相關(guān),非敏感配置。
- 日志打印級(jí)別:影響日志打印的多或少,非敏感配置。
- 限流降級(jí)參數(shù):限流降級(jí)主要為維持內(nèi)部應(yīng)用穩(wěn)定,非敏感配置。
- 監(jiān)控報(bào)警閾值:主要是影響業(yè)務(wù)的報(bào)警精度,非敏感配置。
- 容災(zāi)多活:一般和數(shù)據(jù)主備配置和業(yè)務(wù)分片相關(guān),非敏感配置。
敏感配置通常和業(yè)務(wù)數(shù)據(jù)相關(guān),一旦泄露將引起安全隱患,例如:
- 三方軟件LicenseKey:一旦泄露容易發(fā)生LicenseKey被盜用,為敏感配置。
- PaaS平臺(tái)連接串:典型如數(shù)據(jù)庫(kù)連接串,一旦泄露,無(wú)論內(nèi)部或外部用戶(hù),都可以很容易地登到業(yè)務(wù)數(shù)據(jù)庫(kù)接觸到業(yè)務(wù)敏感信息,為敏感配置。
從安全的維度來(lái)看,我們通常建議用戶(hù)把非敏感配置存放到自己的文件中,盡可能保持簡(jiǎn)單,但是需要把敏感配置放到配置中心里,并加密且做好鑒權(quán),盡量不要讓無(wú)關(guān)人員接觸到。
時(shí)效性和安全分析總結(jié)
基于 Spring 框架的Java應(yīng)用配置如何遷移
使用Spring框架的Java開(kāi)發(fā)者一般經(jīng)常用到的一種配置注解姿勢(shì)是利用Spring的@value注解。
原始的純靜態(tài)文件場(chǎng)景
例如這個(gè)配置,包含兩個(gè)配置參數(shù),一個(gè)是軟件的版本號(hào),一個(gè)是數(shù)據(jù)庫(kù)連接串:
通過(guò)@PropertySource和@value的注解來(lái)自動(dòng)注入配置。
@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; }以上代碼省略了相關(guān)數(shù)據(jù)庫(kù)連接初始化等操作。
開(kāi)始配置遷移,進(jìn)入混合配置場(chǎng)景
目前由于安全合規(guī)或配置時(shí)效等原因,要開(kāi)始遷移配置到ACM上。經(jīng)過(guò)分析,我們發(fā)現(xiàn)部分?jǐn)?shù)據(jù)庫(kù)的配置最好遷移到ACM,以紅色字體標(biāo)注。紅色部分將全部被遷移到ACM中。
接下來(lái)主要三個(gè)改動(dòng),先歸納下。
- 在ACM控制臺(tái)種增加相關(guān)配置的記錄。
- Java工程包中增加 ACM SDK 相關(guān)依賴(lài)。
- 少許修改代碼,增加在ACM中取配置的注解代碼。
第一步,直接到ACM中創(chuàng)建配置項(xiàng),名字為myapp.dbconfig.properties,并把配置內(nèi)容編輯在對(duì)應(yīng)編輯框中。詳細(xì)操作指南請(qǐng)參見(jiàn) ACM 快速入門(mén)文檔,操作截圖如下。
第二步,在maven的pom.xml中增加依賴(lài),如下。
<dependency> <groupId>com.alibaba.nacos</groupId> <artifactId>nacos-spring-context</artifactId> <version>0.2.1- RC1</version> </dependency>第三步,在對(duì)應(yīng)AppConfig.java代碼中植入API注解,通過(guò)ACM去獲取動(dòng)態(tài)配置。代碼增加部分如紅色字體部分。
@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; } }至此,改動(dòng)結(jié)束。通過(guò)ACM SDK支持Spring的@value注解能力,代碼幾乎0改動(dòng)。
幾點(diǎn)注意事項(xiàng)
在以上代碼實(shí)例中,有幾樣事情需要注意:
- 代碼中使用的ACM SDK為Nacos SDK。Nacos 為ACM的開(kāi)源實(shí)現(xiàn),ACM無(wú)縫兼容所有Nacos的接口。
-
在代碼示例中,使用了明文注解來(lái)寫(xiě)死ACM的endpoint, namespace, AK, SK, 等等。在實(shí)際操作種,相關(guān)變量其實(shí)不用寫(xiě)死。
- endpoint namespace等可以通過(guò)ACM的相關(guān)文件配置或系統(tǒng)變量來(lái)解決。
- AK, SK等敏感信息可以通過(guò)ECS Ram Role功能來(lái)讓系統(tǒng)自行判斷,代碼不用寫(xiě)死。
- 代碼中未包含動(dòng)態(tài)配置監(jiān)聽(tīng)的回調(diào)部分。
原文鏈接
本文為云棲社區(qū)原創(chuàng)內(nèi)容,未經(jīng)允許不得轉(zhuǎn)載。
總結(jié)
以上是生活随笔為你收集整理的实战:基于 Spring 的应用配置如何迁移至阿里云应用配置管理 ACM的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 主流微服务注册中心浅析和对比
- 下一篇: gradle idea java ssm