從單體架構(gòu)與SOA轉(zhuǎn)向微服務,配置中心這個服務可能會有些陌生,尤其是單體架構(gòu),幾乎不存在這樣的需求。

我們過去的配置變更方式涉及手動修改各節(jié)點的配置文件。對于擁有多個實例的情況,我們必須逐個節(jié)點進行修改,并在完成修改后分階段重新啟動或重載服務。在先前的架構(gòu)中,這種方法并沒有引起太大的問題。然而,考慮到我們現(xiàn)在的業(yè)務情景,尤其是車貸系統(tǒng)規(guī)模相對較小,已經(jīng)擁有大約30個服務。如果考慮到高可用性(HA),服務實例的數(shù)量將至少翻倍,即至少60個服務實例。在這種情況下,如果我們需要進行較為全局性的配置更改,比如數(shù)據(jù)庫連接地址,那將是一項龐大而繁瑣的工程。
鑒于當前情況,我們自然而然地考慮將所有配置集中存儲在一個地方。最簡單的方法可能是使用NAS(網(wǎng)絡附加存儲)進行共享存儲。隨后,我們可以將配置分為兩個主要部分:全局配置和服務本身的配置。這種方式的配置管理如下圖所示:

這種集中化配置的方法確實有效,但我們需要考慮到如果NAS發(fā)生故障會帶來的問題。為了解決這一點,我們可以考慮將NAS部署為一個集群,以提高可用性。另一種選擇是利用云廠商提供的對象存儲服務,這樣可以進一步提高配置的可靠性和可用性。這種集中化配置的方式實際上是配置中心的雛形,但在生產(chǎn)環(huán)境中,我們可能還需要滿足其他一些要求。
配置中心在解決問題場景上有廣泛的應用,例如:
線上問題排查: 在傳統(tǒng)情況下,生產(chǎn)日志通常設置為INFO級別,但排查問題可能需要調(diào)整為DEBUG級別。通過配置中心,我們可以在不重啟服務的情況下動態(tài)地變更日志級別,避免由于環(huán)境變更導致問題無法重現(xiàn)的情況發(fā)生。
容災處理: 在混合云架構(gòu)中,特別是應用上云而數(shù)據(jù)仍在自己的IDC時,容災處理至關重要。配置中心可以快速完成從主庫切換到從庫的配置,實現(xiàn)主庫故障時的無縫切換。
活動管理: 針對ToC的公司,定期進行營銷活動是常見的操作。在活動期間,系統(tǒng)負載和質(zhì)量的要求通常較高,可能需要特殊的配置管理,如連接池、隊列、線程、降級等。配置中心能夠靈活管理針對不同活動的配置,確保系統(tǒng)在活動期間能夠高效運行。
這些場景展示了配置中心在提高系統(tǒng)靈活性、降低維護成本、應對特殊需求方面的價值。通過動態(tài)管理配置,我們能夠更好地適應不同的業(yè)務場景和需求,提高系統(tǒng)的穩(wěn)定性和可維護性。
- 我們期望配置中心能夠統(tǒng)一管理散落在各個地方(數(shù)據(jù)庫、本地配置文件、啟動參數(shù)、JNDI等)的配置。這些配置通常以鍵值對(K-V)的形式表示,以便于在不同環(huán)境中靈活使用。這種集中的配置管理方式有以下優(yōu)勢:
- 一致性: 通過配置中心,我們能夠確保系統(tǒng)中的配置信息保持一致,而不會因為分散在不同地方而導致不一致的問題。
- 集中管理: 集中管理配置能夠簡化配置的維護和更新過程,而不必在每個節(jié)點都手動進行修改。
- 動態(tài)性: 配置中心應具備動態(tài)配置的能力,允許在運行時動態(tài)調(diào)整配置,而無需重啟服務。這在快速響應業(yè)務變化和排查問題時尤為重要。
- 鍵值對形式: 配置中心一般采用鍵值對的形式,使得配置的表示簡單而靈活。這種形式非常適合表示各種參數(shù)和屬性。
需要注意的是,確實有一些配置,如logback.xml、Groovy/JS動態(tài)腳本、多媒體文件等,可能并不適合通過配置中心進行管理。對于這些類型的配置,我們可能需要采用其他方式,例如使用版本控制系統(tǒng)或特定的配置文件管理工具。配置中心主要關注那些以鍵值對形式存在且需要在運行時動態(tài)調(diào)整的配置信息。
- 在考慮生產(chǎn)環(huán)境中使用的配置中心時,版本化和變更審計是至關重要的考慮因素。
版本化: 一個成熟的配置中心需要支持配置的版本化。當我們進行全局配置修改后,系統(tǒng)應該能夠自動或手動創(chuàng)建一個新版本。這樣,如果修改引入了問題,我們可以迅速回滾到先前的配置版本,避免生產(chǎn)事故。
變更審計: 配置中心應該記錄每次配置的變更,包括修改的時間、修改人員等信息。這種變更審計功能對于問題排查、追責以及系統(tǒng)安全性都是至關重要的。如果出現(xiàn)問題,我們可以追溯到具體的配置變更,幫助更快地定位和解決問題。
通過版本化和變更審計,配置中心可以提供更高級別的可追溯性和可管理性,使得在配置修改引發(fā)問題時能夠更加從容地應對,同時也有助于建立更嚴密的變更管理流程。
- 在一個實際的生產(chǎn)環(huán)境中,配置中心需要支持靈活的配置管理,包括依賴繼承、環(huán)境區(qū)分、場景區(qū)分等功能。
依賴繼承: 配置中心應支持配置的依賴繼承關系。例如,某個微服務可能有自身的配置,同時也會依賴于一些公共配置。配置中心需要能夠自動合并服務自身配置和公共配置,確保微服務獲取到完整的配置信息。
環(huán)境區(qū)分: 不同的環(huán)境(如開發(fā)、測試、預發(fā)、生產(chǎn))可能需要不同的配置。配置中心應該能夠根據(jù)環(huán)境的不同提供相應的配置。這樣,同一份配置在不同環(huán)境中可以有不同的取值,確保在不同階段的部署和測試中能夠使用適當?shù)呐渲谩?/p>
場景區(qū)分: 針對特殊活動或場景(如雙11、618大促),配置中心也應支持特殊配置。這樣,我們可以根據(jù)不同的業(yè)務活動設置特定的配置,確保在活動期間系統(tǒng)能夠按照特定的要求運行。
通過這些功能,配置中心能夠更好地適應多樣化的需求,提供靈活的配置管理。這樣的設計使得系統(tǒng)能夠在不同的環(huán)境和業(yè)務場景下輕松地切換配置,確保系統(tǒng)在不同條件下都能以最優(yōu)的狀態(tài)運行。

- 對于一個實際的生產(chǎn)環(huán)境,配置中心的優(yōu)秀設計需要支持動態(tài)刷新配置并應用到服務實例,同時提供分批次或灰度發(fā)布的策略。
動態(tài)刷新配置: 優(yōu)秀的配置中心應當支持動態(tài)刷新配置,使得配置的變更可以即時生效,而不需要重啟整個服務。為實現(xiàn)這一點,服務通常會集成配置中心的SDK,SDK能夠接收到新的配置并通知服務實例進行配置重載。對于有緩存設計的功能,服務自身需要處理配置的更新邏輯,確保配置的變更能夠正確應用到運行中的服務。
分批次或灰度發(fā)布: 配置中心需要支持分批次或灰度發(fā)布,以確保在配置變更時能夠逐步驗證新配置的穩(wěn)定性。這可以通過按照指定的策略先刷新一批服務實例來實現(xiàn)。服務實例需要提供標簽,用于區(qū)分不同的實例,例如,按地域分發(fā)的服務可以帶上地域標簽,從而實現(xiàn)按地域進行分批次或灰度更新。
弱依賴設計: 為確保服務在脫離配置中心的情況下依然能夠正常運行,通常采用弱依賴的設計。服務在啟動時向配置中心獲取配置并緩存到本地,在配置中心推送配置或服務定時主動拉取最新配置并更新緩存。這種設計可以保證在配置中心或網(wǎng)絡故障時各服務依然可以正常運行,降低了對配置中心的強依賴性。
通過這些設計,配置中心在服務管理方面能夠提供更高度的靈活性和可靠性,確保配置變更的順暢過渡,同時服務依然能夠在各種情況下保持穩(wěn)定運行。
總體而言,配置中心的設計核心包括以下關鍵要求:
- 集中化管理與配置切片: 配置中心應支持集中化管理所有配置,并能按照不同的維度進行切片管理,包括全局級與服務級、不同環(huán)境(如生產(chǎn)、預發(fā)、測試、開發(fā))以及特殊活動等。
- 版本化與變更審計: 配置中心需要具備版本化和變更審計功能,以確保配置變更具有歷史記錄,方便回滾和審計。可以采用類似GIT的方式管理配置的版本。
- 動態(tài)刷新: 配置中心應當支持動態(tài)刷新配置,并能夠按照一定的策略實現(xiàn)動態(tài)刷新。這包括有服務依賴時先刷新被依賴的服務,以及按批次或灰度刷新多實例的情況。
- 高可用: 配置中心本身需要足夠健壯,同時最好能夠作為一個普通服務注冊到注冊中心,形成整體的高可用架構(gòu)。
- 弱依賴: 服務在運行期間不應強依賴配置中心,需要實施好配置獲取及緩存策略,以確保在配置中心或網(wǎng)絡故障時使用緩存配置,不影響服務正常運行。
- Push/Pull: 配置更新可以采用Push或Pull兩種方式。Push方式能夠?qū)崿F(xiàn)對配置變更的實時感知,但對配置中心的要求較高。
- SDK支持: 配置中心應提供相應的SDK,以便服務能夠?qū)崿F(xiàn)配置的刷新和緩存,確保即便在配置中心宕機或網(wǎng)絡不通的情況下,不會影響服務的正常運行。
在微服務架構(gòu)中,配置中心被視為一個重要的核心服務。市場上有一些成熟的獨立配置中心,其中一些與特定的微服務框架配套使用。
例如,Spring Cloud項目通常會使用Spring Cloud Config作為配置中心。Spring Cloud Config提供了與Spring Cloud配套的解決方案,使得在Spring Cloud環(huán)境中,配置的管理變得更為便捷。它能夠支持分布式系統(tǒng)中的外部配置,允許將配置存儲在集中的服務器上。
除此之外,還有其他獨立配置中心,如百度開源的Disconf和攜程開源的Apollo。這些配置中心都在不同的場景下得到了廣泛應用,提供了豐富的功能來滿足微服務架構(gòu)中配置管理的需求。
對于Spring Cloud項目,一般情況下,Spring Cloud Config能夠很好地滿足配置管理的要求。而對于非Spring Cloud項目,可以考慮使用其他成熟的配置中心,比如Apollo。在一些特殊情況下,也可以考慮基于Etcd等技術進行定制化開發(fā),以滿足特定需求和場景的配置管理要求。不同的配置中心適用于不同的項目背景和技術棧,選擇適合自身項目的配置中心是關鍵。