Apollo分布式配置中心入门
一.概述
1.什么是配置
應(yīng)用程序在啟動(dòng)和運(yùn)行的時(shí)候往往需要讀取一些配置信息,配置基本上伴隨著應(yīng)用程序的整個(gè)生命周期,比如:數(shù)據(jù)庫(kù)連接參數(shù)、啟動(dòng)參數(shù)等。
配置主要有以下幾個(gè)特點(diǎn):
-
配置是獨(dú)立于程序的只讀變量
-
配置首先是獨(dú)立于程序的,同一份程序在不同的配置下會(huì)有不同的行為
-
其次,配置對(duì)于程序是只讀的,程序通過讀取配置來改變自己的行為,但是程序不應(yīng)該去改變配置
-
-
配置伴隨應(yīng)用的整個(gè)生命周期
-
配置貫穿于應(yīng)用的整個(gè)生命周期,應(yīng)用在啟動(dòng)時(shí)通過讀取配置來初始化,在運(yùn)行時(shí)根據(jù)配置調(diào)整行為。 比如:啟動(dòng)時(shí)需要讀取服務(wù)的端口號(hào)、系統(tǒng)在運(yùn)行過程中需要讀取定時(shí)策略執(zhí)行定時(shí)任務(wù)等。
-
-
配置可以有多種加載方式
-
常見的有程序內(nèi)部硬編碼,配置文件,環(huán)境變量,啟動(dòng)參數(shù),基于數(shù)據(jù)庫(kù)等
-
-
配置需要治理
-
權(quán)限控制:由于配置能改變程序的行為,不正確的配置甚至能引起災(zāi)難,所以對(duì)配置的修改必須有比較完善的權(quán)限控制
-
不同環(huán)境、集群配置管理:同一份程序在不同的環(huán)境(開發(fā),測(cè)試,生產(chǎn))、不同的集群(如不同的數(shù)據(jù)中心)經(jīng)常需要有不同的配置,所以需要有完善的環(huán)境、集群配置管理
-
2.什么是配置中心
傳統(tǒng)單體應(yīng)用存在一些潛在缺陷,如隨著規(guī)模的擴(kuò)大,部署效率降低,團(tuán)隊(duì)協(xié)作效率差,系統(tǒng)可靠性變差,維護(hù)困難,新功能上線周期長(zhǎng)等,所以迫切需要一種新的架構(gòu)去解決這些問題,而微服務(wù)架構(gòu)正是當(dāng)下一種流行的解法。
不過,解決一個(gè)問題的同時(shí),往往會(huì)誕生出很多新的問題,所以微服務(wù)化的過程中伴隨著很多的挑戰(zhàn),其中一個(gè)挑戰(zhàn)就是有關(guān)服務(wù)(應(yīng)用)配置的。當(dāng)系統(tǒng)從一個(gè)單體應(yīng)用,被拆分成分布式系統(tǒng)上一個(gè)個(gè)服務(wù)節(jié)點(diǎn)后,配置文件也必須跟著遷移(分割),這樣配置就分散了,不僅如此,分散中還包含著冗余,如下圖:
?
配置中心將配置從應(yīng)用中剝離出來,統(tǒng)一管理,優(yōu)雅的解決了配置的動(dòng)態(tài)變更、持久化、運(yùn)維成本等問題。
應(yīng)用自身既不需要去添加管理配置接口,也不需要自己去實(shí)現(xiàn)配置的持久化,更不需要引入“定時(shí)任務(wù)”以便降低運(yùn)維成本。
總得來說,配置中心就是一種統(tǒng)一管理各種應(yīng)用配置的基礎(chǔ)服務(wù)組件。
在系統(tǒng)架構(gòu)中,配置中心是整個(gè)微服務(wù)基礎(chǔ)架構(gòu)體系中的一個(gè)組件,如下圖,它的功能看上去并不起眼,無非就是配置的管理和存取,但它是整個(gè)微服務(wù)架構(gòu)中不可或缺的一環(huán)。
?
集中管理配置,那么就要將應(yīng)用的配置作為一個(gè)單獨(dú)的服務(wù)抽離出來了,同理也需要解決新的問題,比如:版本管理(為了支持回滾),權(quán)限管理等。
總結(jié)一下,在傳統(tǒng)巨型單體應(yīng)用紛紛轉(zhuǎn)向細(xì)粒度微服務(wù)架構(gòu)的歷史進(jìn)程中,配置中心是微服務(wù)化不可缺少的一個(gè)系統(tǒng)組件,在這種背景下中心化的配置服務(wù)即配置中心應(yīng)運(yùn)而生,一個(gè)合格的配置中心需要滿足:
-
配置項(xiàng)容易讀取和修改
-
添加新配置簡(jiǎn)單直接
-
支持對(duì)配置的修改的檢視以把控風(fēng)險(xiǎn)
-
可以查看配置修改的歷史記錄
-
不同部署環(huán)境支持隔離
二.Apollo簡(jiǎn)介
1.主流配置中心
目前市面上用的比較多的配置中心有:
Disconf 2014年7月百度開源的配置管理中心,專注于各種「分布式系統(tǒng)配置管理」的「通用組件」和「通用平臺(tái)」, 提供統(tǒng)一的「配置管理服務(wù)」。目前已經(jīng)不再維護(hù)更新。 https://github.com/knightliao/disconf
Spring Cloud Config 2014年9月開源,Spring Cloud 生態(tài)組件,可以和Spring Cloud體系無縫整合。 https://github.com/spring-cloud/spring-cloud-config
Apollo 2016年5月,攜程開源的配置管理中心,能夠集中化管理應(yīng)用不同環(huán)境、不同集群的配置,配置修改后能夠?qū)?時(shí)推送到應(yīng)用端,并且具備規(guī)范的權(quán)限、流程治理等特性,適用于微服務(wù)配置管理場(chǎng)景。 https://github.com/ctripcorp/apollo
Nacos 2018年6月,阿里開源的配置中心,也可以做DNS和RPC的服務(wù)發(fā)現(xiàn)。 https://github.com/alibaba/nacos
2.功能特性對(duì)比
由于Disconf不再維護(hù),下面主要對(duì)比一下Spring Cloud Config、Apollo和Nacos。
| 配置實(shí)時(shí)推送 | 支持(Spring Cloud Bus) | 支持(HTTP長(zhǎng)輪詢1s內(nèi)) | 支持(HTTP長(zhǎng)輪詢1s內(nèi)) |
| 版本管理 | 支持(Git) | 支持 | 支持 |
| 配置回滾 | 支持(Git) | 支持 | 支持 |
| 灰度發(fā)布 | 支持 | 支持 | 不支持 |
| 權(quán)限管理 | 支持(依賴Git) | 支持 | 不支持 |
| 多集群 | 支持 | 支持 | 支持 |
| 多環(huán)境 | 支持 | 支持 | 支持 |
| 監(jiān)聽查詢 | 支持 | 支持 | 支持 |
| 多語言 | 只支持Java | 主流語言,提供了Open API | 主流語言,提供了Open API |
| 配置格式校驗(yàn) | 不支持 | 支持 | 支持 |
| 單機(jī)讀(QPS) | 7(限流所致) | 9000 | 15000 |
| 單機(jī)寫(QPS) | 5(限流所致) | 1100 | 1800 |
| 3節(jié)點(diǎn)讀 (QPS) | 21(限流所致) | 27000 | 45000 |
| 3節(jié)點(diǎn)寫 (QPS) | 5限流所致() | 3300 | 5600 |
總的來看,Apollo和Nacos相對(duì)于Spring Cloud Config的生態(tài)支持更廣,在配置管理流程上做的更好。Apollo相對(duì)于Nacos在配置管理做的更加全面,Nacos則使用起來相對(duì)比較簡(jiǎn)潔,在對(duì)性能要求比較高的大規(guī)模場(chǎng)景更適合。但對(duì)于一個(gè)開源項(xiàng)目的選型,項(xiàng)目上的人力投入(迭代進(jìn)度、文檔的完整性)、社區(qū)的活躍度(issue的數(shù)量和解決速度、Contributor數(shù)量、社群的交流頻次等),這些因素也比較關(guān)鍵,考慮到Nacos開源時(shí)間不長(zhǎng)和社區(qū)活躍度,所以從目前來看Apollo應(yīng)該是最合適的配置中心選型。
3.Apollo簡(jiǎn)介
Apollo(阿波羅)是攜程框架部門研發(fā)的分布式配置中心,能夠集中化管理應(yīng)用的不同環(huán)境、不同集群的配置,配置修改后能夠?qū)崟r(shí)推送到應(yīng)用端,并且具備規(guī)范的權(quán)限、流程治理等特性,適用于微服務(wù)配置管理場(chǎng)景。
Apollo包括服務(wù)端和客戶端兩部分:
服務(wù)端基于Spring Boot和Spring Cloud開發(fā),打包后可以直接運(yùn)行,不需要額外安裝Tomcat等應(yīng)用容器。
Java客戶端不依賴任何框架,能夠運(yùn)行于所有Java運(yùn)行時(shí)環(huán)境,同時(shí)對(duì)Spring/Spring Boot環(huán)境也有較好的支持。
4.特性
基于配置的特殊性,所以Apollo從設(shè)計(jì)之初就立志于成為一個(gè)有治理能力的配置發(fā)布平臺(tái),目前提供了以下的特性:
-
統(tǒng)一管理不同環(huán)境、不同集群的配置
-
Apollo提供了一個(gè)統(tǒng)一界面集中式管理不同環(huán)境(environment)、不同集群(cluster)、不同命名空間(namespace)的配置。
-
同一份代碼部署在不同的集群,可以有不同的配置,比如zookeeper的地址等
-
通過命名空間(namespace)可以很方便地支持多個(gè)不同應(yīng)用共享同一份配置,同時(shí)還允許應(yīng)用對(duì)共享的配置進(jìn)行覆蓋
-
-
配置修改實(shí)時(shí)生效(熱發(fā)布)
-
用戶在Apollo修改完配置并發(fā)布后,客戶端能實(shí)時(shí)(1秒)接收到最新的配置,并通知到應(yīng)用程序
-
-
版本發(fā)布管理
-
所有的配置發(fā)布都有版本概念,從而可以方便地支持配置的回滾
-
-
灰度發(fā)布
-
支持配置的灰度發(fā)布,比如點(diǎn)了發(fā)布后,只對(duì)部分應(yīng)用實(shí)例生效,等觀察一段時(shí)間沒問題后再推給所有應(yīng)用實(shí)例
-
-
權(quán)限管理、發(fā)布審核、操作審計(jì)
-
應(yīng)用和配置的管理都有完善的權(quán)限管理機(jī)制,對(duì)配置的管理還分為了編輯和發(fā)布兩個(gè)環(huán)節(jié),從而減少人為的錯(cuò)誤。
-
所有的操作都有審計(jì)日志,可以方便地追蹤問題
-
-
客戶端配置信息監(jiān)控
-
可以在界面上方便地看到配置在被哪些實(shí)例使用
-
-
提供Java和.Net原生客戶端
-
提供了Java和.Net的原生客戶端,方便應(yīng)用集成
-
支持Spring Placeholder, Annotation和Spring Boot的ConfigurationProperties,方便應(yīng)用使用
-
同時(shí)提供了Http接口,非Java和.Net應(yīng)用也可以方便地使用
-
-
提供開放平臺(tái)API
-
Apollo自身提供了比較完善的統(tǒng)一配置管理界面,支持多環(huán)境、多數(shù)據(jù)中心配置管理、權(quán)限、流程治理等特性。不過Apollo出于通用性考慮,不會(huì)對(duì)配置的修改做過多限制,只要符合基本的格式就能保存,不會(huì)針對(duì)不同的配置值進(jìn)行針對(duì)性的校驗(yàn),如數(shù)據(jù)庫(kù)用戶名、密碼,Redis服務(wù)地址等
-
對(duì)于這類應(yīng)用配置,Apollo支持應(yīng)用方通過開放平臺(tái)API在Apollo進(jìn)行配置的修改和發(fā)布,并且具備完善的授權(quán)和權(quán)限控制
-
總結(jié)
以上是生活随笔為你收集整理的Apollo分布式配置中心入门的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Kafka事务特性详解
- 下一篇: Apollo分布式配置中心在本地的安装教