導讀:SpringBoot的時代到來,對於曾經面向一堆XML配置的開發經歷,那真是一大福音,一切都變得很是簡潔,留下的就是簡化的配置文件設置。但在分佈式環境下呢?衆多的實例集羣下,動態的實例遷移等狀況時常發生,致使配置管理的工做變得複雜且困難,百度研發團隊經過多年的架構建設經驗,把過往的配置管理的相關經驗沉澱成一套通用的解決方案,現以開源的方式回饋給社區開發者,但願幫助你們完全解決配置建設的難題。html
全文約4200字,預計閱讀時間8分鐘。前端
1 分佈式環境下的配置管理挑戰java
能夠說配置化是當今應用開發與部署必備的一個能力要求,咱們一般把一些容易變化以及依賴外部狀況而變化的內容,經過配置化的方式來實現,這樣咱們就能夠在零編碼的狀況下實現功能調整,實現極低成本的應用擴展能力。而對於配置管理方式,最爲常見的方式就是配置文件方式, 經過特定的文件內容格式進行設置, 部署時也會與應用程序放在一塊兒。這樣使用方式在單機狀況下比較容易且簡單,可是在大型的分佈式應用場景下,特別又要區分不一樣環境(開發,測試,線上等)就會致使管理成本與出錯風險急速加大。 mysql
以上述場景爲例,涉及的問題與挑戰有:git
-
操做複雜,成本高:若是有幾十臺實例,則須要按個登陸機器進行修改, 很容易發生遺漏;github
-
檢驗與查錯難度大:在幾十臺實例修改,若有其中幾臺修改出錯,很難發現,同時也很難進行內容回溯與回滾;redis
-
PAAS環境下,沒法有效操做:在paas環境下,由於漂移都現象存在,直接登陸實例進行修改,已是很是危險的行爲了,由於一旦漂移,配置就會失效到最初方式;spring
-
動態加載,配置變動推送場景很難支持。sql
因此針對大型分佈式場景,經過創建配置中心來統一管理配置的能力就顯得很是必要了,把業務開發者從複雜以及繁瑣的配置管理中解脫出來,只需專一於業務代碼自己,從而能夠顯著提高開發以及運維效率。將配置和應用在部署階段解耦也能夠進一步提高發布的效率,下降部署成本。同時配置獨立化管理後,針對配置的安全性、回滾能力、追溯能力、應急控制處理等也會有很強的支撐。數據庫
2 BRCC爲何是一個好的配置中心
2.1 好的配置中心應該具備的優勢
前面講了在分佈式環境中爲何須要配置中心,那麼一個好的配置中心應該具有哪些優勢呢?
在咱們看來,好的配置中心應該有如下優勢:
1. 使用便捷
業務系統使用配置中心應該是很是簡單的:配置中心提供統一的kv管理能力,業務系統從配置中心獲取配置,而後在系統中使用配置。因此咱們認爲,衡量配置中心是否優秀的最關鍵因素就是業務系統使用配置的便捷程度,越方便越是好的配置中心。
使用便捷包括了兩個方面:
-
接入便捷 SDK與API是最多見的接入方式。應儘量的使用標準化的設計要求。SDK如在Java語言使用,應兼容Spring與SpringBoot的配置規範,直接使用而無需修改原有代碼, API則採用RESTful的定義標準,採用資源定位方式,提高可讀性與易用性;
-
管理便捷 好的配置中心會提供界面友好的控制檯,方便使用者登陸進行配置管理。配置的管理層面更加清晰化,包括產品,工程, 環境, 版本, 分組等豐富的管理機制。
2. 功能完善
配置中心最主要的功能是對配置的管理,除了對配置的crud、批量變動、模糊匹配、快速導航以外,一個好的配置中心還須要有如下的配置能力:
-
推送 使用者在配置中心變動了配置,可以從新推送配置給業務系統,而且能反饋業務系統接收配置的狀態。
-
追溯 配置變動的歷史都有保存,而且變動之間能進行diff。在分佈式環境下, 能夠追蹤各個實例的生效狀態,
-
多環境多版本 好的配置中心能知足業務系統在不一樣環境和版本下的配置需求,並提供版本之間diff的能力。
-
審計/回滾 配置中心能記錄使用者作的每一次變動操做,供審計使用。
3. 運維簡單
-
部署簡單 能快速部署在各類環境,支持更豐富的環境,如虛擬機、paas、容器化等,支持集羣化和高可用部署。
-
**監控告警 ** 提供完整,豐富監控和告警的能力,以幫助快速定位問題,快速處理風險。
4. 安全可靠
配置安全性很是關鍵,例如數據庫的用戶與密碼,一旦泄露風險很是大,因此配置中心的安全性須要很全面的考量。
一是配置存儲、傳輸的安全性,如內容能夠加密;二是操做的權限管控, 必須對使用者進行權限控制,而權限控制的粒度到什麼程度、使用者的操做是否有跡可循、配置變動是否可回滾,都決定着配置中心的好壞。
5. 高性能與穩定性
在不少大型業務場景下,還面臨着衆多產品線同時使用的狀況,產生高併發的請求配置服務的狀況。因此在配置服務的架構設計必須須要考慮到這種因素,實現高吞吐、高時效與高穩定的架構要求。因此總體架構要具有分佈式的架構設計要求,配合彈性的擴展能力與多級的緩存同步機制,才能很好地解決這些問題,達到秒級的推送與變動能力, 提高至4個9999的穩定性要求。
2.2 BRCC的優勢
21年2月咱們開源了一款配置中心BRCC (Better Remote Config Center),其主打的產品特性就是簡單、易用、安全。BRCC功能結構圖以下:
特色
1. 簡單好用的SDK端
BRCC提供多種語言的sdk,拿java sdk來講,其特色就是徹底兼容springboot的配置規範,能夠直接使用spring的@Value註解來加載配置,以下代碼:
@Component public class Person { @Value("person.username") private String name; // 提供Setter 和 Getter 方法 }
對於習慣spring的開發者來講,能夠在application.properties裏面設置 person.username=張三 就能在啓動時將「張三」賦值給persion類的name變量上。而在使用BRCC時,只要把 person.username=張三 保存在BRCC中,引入BRCC starter的依賴就能夠了,在業務代碼上無需改造,對業務系統來講能夠算是0侵入了。
2. 功能完備的服務端
BRCC做爲一種輕量級的分佈式配置管理解決方案,部署簡單,基於spring boot 2.0開發,打包後能夠直接運行,支持配置的分發、更新推送。除了部署簡單外,服務端還有一些特別實用的功能:
-
安全的控制檯 提供了一套完整的控制檯操做界面,支持多級權限控制,可以從產品線、工程、環境等維度上進行讀寫的控制。
-
配置熱發佈 BRCC提供了配置推送的功能,當配置變動後,能夠主動觸發推送,將配置從新推送給業務系統,而業務系統收到配置後,能夠根據本身的須要進行熱更新,從而不須要重啓既能夠生效配置。在BRCC的服務端也能夠查看推送後配置在業務系統上的生效狀況。
-
配置操做可追溯 在業務系統的迭代升級中,經常會有配置的變更,在BRCC中,使用者對配置的全部變動操做都有跡可循,對歷史配置也能夠查詢、回滾和對比。
總而言之,BRCC是一塊很是優秀的分佈式配置中心解決方案,它徹底兼容原生Spring配置規範,除了提供基本的配置存儲,還提供配置註釋、key-value維度查詢、變動推送、變動軌跡記錄及查詢、細粒度的權限控制、sdk實例管理、友好的UI界面,簡單部署等特色,詳細的功能請參看https://github.com/baidu/brcc。
下面咱們來看看如何快速搭建和使用吧!
3. BRCC快速入門
3.1 快速搭建BRCC服務端
選擇一個合適的版本, 您能夠在brcc的release notes中找到每一個版本支持的功能的介紹,當前推薦的穩定版本爲1.0.4。
爲了方便你們體驗,咱們在百度雲上部署了體驗環境:
在線體驗環境地址:http://180.76.36.149/#/login
測試帳號1:test1 123456
測試帳號2:test2 123456
第一步,環境準備。
BRCC 依賴 Java 環境來運行。
https://docs.oracle.com/cd/E19182-01/820-7851/inst_cli_jdk_javahome_t/
若是您是從代碼開始構建並運行BRCC,還須要爲此配置 Maven環境。
請確保是在如下版本環境中安裝使用:
-
64 bit OS,支持 Linux/Unix/Mac/Windows,推薦選用 Linux/Unix/Mac。
-
64 bit JDK 1.8+;下載 & 配置。
-
Maven 3.2.x+;下載 & 配置。(僅源碼編譯須要)
-
mysql5.6+
-
redis3.2+
64 bit JDK 1.8+ 下載
https://www.oracle.com/java/technologies/javase/javase-jdk8-downloads.html
64 bit JDK 1.8+ 配置
https://docs.oracle.com/cd/E19182-01/820-7851/inst_cli_jdk_javahome_t/
Maven 3.2.x+ 下載
Maven 3.2.x+ 配置
第二步,下載源碼或者安裝包。
你能夠經過源碼和發行包兩種方式來獲取brcc。
- 從 Github 上下載源碼方式
git clone https://github.com/baidu/brcc.git cd brcc/ sh compile.sh
- 下載編譯後壓縮包方式
您能夠從 release notes下載 brcc-server.zip 包。
unzip brcc-server.zip 或者 tar -zxvf brcc-server.tar.gz cd brcc-server
第三步,啓動BRCC配置中心服務。
在start.sh中按要求配置好mysql和redis後,你就能夠經過執行此腳本啓動brcc了。
3.2 配置管理與SDK接入
第一步,BRCC管理端添加配置。
在brcc管理端創產品線、工程、環境、版本、分組、 配置, 以下圖所示。
如上圖,建立了產品線test一、工程test-rcc、版本1.0.0 和分組group1,而且配置了a、b、c 配置項。
第二步,引入brcc-sdk-starter, 確保pom.xml中引入如下依賴。
<dependency> <groupId>com.baidu.mapp</groupId> <artifactId>brcc-sdk-starter</artifactId> <version>${brcc.version}</version> </dependency>
目前最新的版本是1.0.0。
第三步, 添加BRCC的SDK配置描述。
在接入brcc配置中心以前,確保SpringBoot配置是完整的, 在application.properties文件中添加以下內容。
rcc.cc-server-url: http://180.76.36.149 rcc.cc-password: 123456 rcc.logProperties: true rcc.projectName: test-rcc env-name: dev cc-version-name: 1.0.0 enableUpdateCallback: true appName: example
配置屬性介紹
第四步,在項目中進行配置開發。
brcc徹底兼容原生spring配置規範,你能夠像application.yml,application.properties同樣是用brcc中的配置,如:
@Value("${a}") int a = 0; @Value("${b}") long b = 0; @Value("${c}") String c;
第五步,配置驗證。
啓動日誌中出現如下日誌說明配置加載成功。
配置發送變動後執行推送變動操做後,日誌中會出現如下提示。
以上例子,你能夠到 https://github.com/baidu/brcc/tree/main/brcc-example 得到。
4 關於****咱們
咱們大部分紅員來自於百度智能小程序研發部的基礎架構團隊,致力於用簡單易用的方式解決配置相關的需求,下降配置的研發和運維成本。
BRCC的願景是爲業務系統提供簡單、好用的配置服務。目前BRCC已經github上開源,你們能夠訪問獲取所有代碼,也能夠star咱們項目,以便高效得到咱們持續的更新信息。
本期做者介紹 | 來自於百度智能小程序研發部的基礎架構團隊,致力於用簡單易用的方式的解決配置相關的需求,下降配置的研發和運維成本。
招聘信息:近期熱招大數據研發工程師、服務端研發工程師(C++/GO/Java),Web前端研發工程師,iOS/Android客戶端研發工程師
歡迎關注百度Geek說同名公衆號聯繫咱們~