目錄
一、介紹
二、架構(gòu)和模塊
三、架構(gòu)剖析
1.最簡架構(gòu)
?2. 高可用保障
?3.多接口擴展
四、總結(jié)
一、介紹
Apollo(阿波羅)是攜程框架部研發(fā)并開源的一款生產(chǎn)級的配置中心產(chǎn)品,它能夠集中管理應(yīng)用在不同環(huán)境、不同集群的配置,配置修改后能夠?qū)崟r推送到應(yīng)用端,并且具備規(guī)范的權(quán)限、流程治理等特性,適用于微服務(wù)配置管理場景。
Apollo 目前在國內(nèi)開發(fā)者社區(qū)比較熱,在?Github?上有超過 5k 顆星,在國內(nèi)眾多互聯(lián)網(wǎng)公司有落地案例,可以說 Apollo 是目前配置中心產(chǎn)品領(lǐng)域 Number1 的產(chǎn)品,其成熟度和企業(yè)級特性要遠遠強于 Spring Cloud 體系中的 Spring Cloud Config 產(chǎn)品。
Apollo 采用分布式微服務(wù)架構(gòu),它的架構(gòu)有一點復(fù)雜。Apollo 的作者宋順雖然給出了一個架構(gòu)圖,但是如果沒有一定的分布式微服務(wù)架構(gòu)基礎(chǔ)的話,則普通的開發(fā)人員甚至是架構(gòu)師也很難一下子理解。只有完全理解了 Apollo 的架構(gòu)才能在生產(chǎn)實踐中更好的部署和使用 Apollo。另外,通過學(xué)習(xí) Apollo 的架構(gòu),大家可以深入理解微服務(wù)架構(gòu)的一些基本原理。
二、架構(gòu)和模塊
下圖為官方的架構(gòu)圖:
如果沒有足夠的分布式微服務(wù)架構(gòu)的基礎(chǔ),對攜程的一些框架產(chǎn)品 (比如 Software Load Balancer (SLB) 不了解的話,那么首次看這個架構(gòu)圖是不太好理解的。
下面是 Apollo 的七個模塊,其中四個模塊是和功能相關(guān)的核心模塊,另外三個模塊是輔助服務(wù)發(fā)現(xiàn)的模塊:
四個核心模塊及其主要功能:
模塊 | 主要功能 |
---|---|
ConfigService | 服務(wù)于Apollo客戶端 提供配置獲取接口 |
AdminService | 服務(wù)于管理界面Portal 提供配置管理接口 |
Client |
為應(yīng)用獲取配置,支持實時更新 通過MetaServer獲取ConfigService的服務(wù)列表 使用客戶端軟負載SLB方式調(diào)用ConfigService |
Portal |
配置管理界面 通過MetaServer獲取AdminService的服務(wù)列表 使用客戶端軟負載SLB方式調(diào)用AdminService |
三個輔助服務(wù)發(fā)現(xiàn)模塊
模塊 | 主要功能 |
---|---|
Eureka |
用于服務(wù)發(fā)現(xiàn)和注冊 Config/AdminService注冊實例并定期報心跳 和ConfigService組在一起部署 |
MetaServer | 相當于一個Eureka Proxy 邏輯角色,和ConfigService組在一起部署 Portal通過域名訪問MetaServer獲取AdminService的地址列表 |
NginxLB | 和域名系統(tǒng)配合,協(xié)助用戶訪問Portal進行配置管理 和域名系統(tǒng)配合,協(xié)助Portal訪問MetaServer獲取AdminService地址列表 |
三、架構(gòu)剖析
1.最簡架構(gòu)
如果不考慮分布式微服務(wù)架構(gòu)中的服務(wù)發(fā)現(xiàn)問題,Apollo 的最簡架構(gòu)如下圖所示:
注意事項:
- ConfigService 是一個獨立的微服務(wù),服務(wù)于 Client 進行配置獲取。
- Client 和 ConfigService 保持長連接,通過一種拖拉結(jié)合 (push & pull) 的模式,實現(xiàn)配置實時更新的同時,保證配置更新不丟失。
- AdminService 是一個獨立的微服務(wù),服務(wù)于 Portal 進行配置管理。Portal 通過調(diào)用 AdminService 進行配置管理和發(fā)布。
- ConfigService 和 AdminService 共享 ConfigDB,ConfigDB 中存放項目在某個環(huán)境的配置信息。ConfigService/AdminService/ConfigDB 三者在每個環(huán)境 (DEV/FAT/UAT/PRO) 中都要部署一份。
- Portal 有一個獨立的 PortalDB,存放用戶權(quán)限、項目和配置的元數(shù)據(jù)信息。Portal 只需部署一份,它可以管理多套環(huán)境。
?2. 高可用保障
為了保證高可用,ConfigService 和 AdminService 都是無狀態(tài)以集群方式部署的,這個時候就存在一個服務(wù)發(fā)現(xiàn)問題:Client 怎么找到 ConfigService?Portal 怎么找到 AdminService?為了解決這個問題,Apollo 在其架構(gòu)中引入了 Eureka 服務(wù)注冊中心組件,實現(xiàn)微服務(wù)間的服務(wù)注冊和發(fā)現(xiàn),更新后的架構(gòu)如下圖所示:
眾所周知, Eureka 是自帶服務(wù)發(fā)現(xiàn)的 Java 客戶端的,如果 Apollo 只支持 Java 客戶端接入,不支持其它語言客戶端接入的話,那么 Client 和 Portal 只需要引入 Eureka 的 Java 客戶端,就可以實現(xiàn)服務(wù)發(fā)現(xiàn)功能。發(fā)現(xiàn)目標服務(wù)后,通過客戶端軟負載 (SLB,例如 Ribbon) 就可以路由到目標服務(wù)實例。這是一個經(jīng)典的微服務(wù)架構(gòu),基于 Eureka 實現(xiàn)服務(wù)注冊發(fā)現(xiàn) + 客戶端 Ribbon 配合實現(xiàn)軟路由,如下圖所示:
注意事項:?
- Config/AdminService 啟動后都會注冊到 Eureka 服務(wù)注冊中心,并定期發(fā)送?;钚奶?。
- Eureka 采用集群方式部署,使用分布式一致性協(xié)議保證每個實例的狀態(tài)最終一致。
?3.多接口擴展
在攜程,應(yīng)用場景不僅有 Java,還有很多遺留的.Net 應(yīng)用。Apollo 的作者也考慮到開源到社區(qū)以后,很多客戶應(yīng)用是非 Java 的。但是 Eureka(包括 Ribbon 軟負載) 原生僅支持 Java 客戶端,如果要為多語言開發(fā) Eureka/Ribbon 客戶端,這個工作量很大也不可控。
為此,Apollo 的作者引入了 MetaServer 這個角色,其實可以將其視為一個 Eureka 的 Proxy代理,其將 Eureka 的服務(wù)發(fā)現(xiàn)接口以更簡單明確的 HTTP 接口的形式暴露出來,方便 Client/Protal 通過簡單的 HTTPClient 就可以查詢到 Config/AdminService 的地址列表。獲取到服務(wù)實例地址列表之后,再以簡單的客戶端軟負載 (Client SLB) 策略路由定位到目標實例并發(fā)起調(diào)用。
現(xiàn)在還有一個問題,MetaServer 本身也是無狀態(tài)以集群方式部署的,那么 Client/Protal 該如何發(fā)現(xiàn) MetaServer 呢?一種傳統(tǒng)的做法是借助硬件或者軟件負載均衡器,例如在攜程采用的是擴展后的 NginxLB(也稱 Software Load Balancer),由運維為 MetaServer 集群配置一個域名,指向 NginxLB 集群,NginxLB 再對 MetaServer 進行負載均衡和流量轉(zhuǎn)發(fā)。Client/Portal 通過域名 +NginxLB 間接訪問 MetaServer 集群。
引入 MetaServer 和 NginxLB 之后的架構(gòu)如下圖所示:
?
現(xiàn)在還剩下最后一個環(huán)節(jié):Portal 也是無狀態(tài)以集群方式部署的,用戶如何發(fā)現(xiàn)和訪問 Portal?答案也是簡單的傳統(tǒng)做法,用戶通過域名 +NginxLB 間接訪問 Portal 集群。
包括用戶端的最終的 Apollo 架構(gòu)全貌如下圖所示:文章來源:http://www.zghlxwxcb.cn/news/detail-635890.html
四、總結(jié)
- 官方的視角是從上往下的俯視視角,而本文是側(cè)面視角。經(jīng)過三部分的剖析之后,相信大家對 Apollo 的微服務(wù)架構(gòu)會有更清晰的認識,
- ConfgService/AdminService/Client/Portal 是 Apollo 的四個核心微服務(wù)模塊,相互協(xié)作完成配置中心業(yè)務(wù)功能,Eureka/MetaServer/NginxLB 是輔助微服務(wù)之間進行服務(wù)發(fā)現(xiàn)的模塊。
- Apollo 采用微服務(wù)架構(gòu)設(shè)計,架構(gòu)和部署都有一些復(fù)雜,但是每個服務(wù)職責單一,易于擴展。
- Apollo 只需要一套 Portal 就可以集中管理多套環(huán)境 (DEV/FAT/UAT/PRO) 中的配置,這個是它的架構(gòu)的一大亮點。
- 服務(wù)發(fā)現(xiàn)是微服務(wù)架構(gòu)的基礎(chǔ),在 Apollo 的微服務(wù)架構(gòu)中,既采用 Eureka 注冊中心式的服務(wù)發(fā)現(xiàn),也采用 NginxLB 集中 Proxy 式的服務(wù)發(fā)現(xiàn)。
最后附上Apollo的官方代碼,代碼中有許多值得學(xué)習(xí)和借鑒的地方,大家如果感興趣的話可以參考:
https://github.com/ctripcorp/apollo文章來源地址http://www.zghlxwxcb.cn/news/detail-635890.html
到了這里,關(guān)于由淺入深剖析 Apollo(阿波羅)架構(gòu)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!