介紹
我和極客時間合作的課程《微服務架構和實踐160講》已經於2018年底完成,最後一個模塊是綜合案例分析,通過一個簡單的模擬業務案例,將之前課程的各個組件集成起來,包括:
- 統一授權認證中心Gravitee OAuth2
- 集中配置Apollo
- 基礎服務Zuul/Eureka/Ribbon/Hystrix
- 監控反饋CAT/Prometheus
這些組件既包括Spring Cloud技術棧的部分組件(Zuul/Eureka/Ribbon/Hystrix),也包含國內一線互聯網公司落地的一些組件(如大衆點評CAT和攜程Apollo),也包括我自己爲課程開發的組件Gravitee OAuth2(非生產級),所以本案例可以稱爲是一箇中國式微服務技術棧綜合演示案例,可供學習參考。
另外,課程開播以來陸續收到一些學員的提問,比較典型的有:
- 如何使用Apollo集中管理Spring應用的配置?
- 網關集中驗證令牌怎麼做?
- 基於OAuth2的註冊登錄和API調用具體如何實現?
- CAT非侵入式埋點怎麼做,如何儘量減少業務研發直接使用CAT進行埋點?
在課程中,通過案例演示,我也會統一回復這些問題。
案例背景
我本人並不打算完全自己開發一個演示案例,而是會重用比較流行的開源項目,在它基礎上做定製擴展,所以本案例是基於github上的一個開源項目PiggyMetrics[附錄1]改造而來。PiggyMetrics是一個模擬的個人記賬理財的應用,原作者稱其爲一個端到端的微服務PoC(Proof of Concept),也就是說他開發這個是爲了驗證微服務架構和Spring Cloud技術棧。PiggyMetrics目前在github上有超過4.6k星,是學習微服務架構和Spring Cloud技術棧的一個不錯參考。
PiggMetrics採用前後分離架構,前端是單頁SPA,後端採用基於Spring Cloud技術棧的微服務架構。
架構設計
業務服務架構
上圖是PiggyMetrics的業務服務架構,包括:
- CLIENT,一個純JS/HTML/CSS單頁應用,實現註冊登錄和前端展示邏輯
- ACCOUNT SERVICE,賬戶服務,存儲用戶賬戶和記賬信息
- NOTIFICATION SERVICE,通知服務,存儲通知和備份等相關配置
- STATISTICS SERVICE,統計服務,計算用戶財務狀況和統計信息
每個服務有一個獨立的MongoDB數據存儲(表示微服務獨立數據源思想)。客戶端可調用後臺服務,例如前端調用賬戶服務去註冊賬戶。服務之間也會相互調用,例如賬戶更新時,賬戶服務會同時調統計服務去更新用戶統計信息。另外,統計服務還會調用第三方匯率服務獲取匯率信息。
原基礎服務架構
上圖是PiggyMetrics的原基礎服務架構,包括:
- API網關:基於Spring Cloud Zuul的網關,是調用後臺API的聚合入口,實現反向路由和負載均衡(Eureka+Ribbon)、限流熔斷(Hystrix)等功能。CLIENT單頁應用和ZUUL網關暫住在一起,簡化部署。
- 服務註冊和發現:基於Spring Cloud Eureka的服務註冊中心。業務服務啓動時通過Eureka註冊,網關調用後臺服務通過Eureka做服務發現,服務之間調用也通過Eureka做服務發現。
- 授權認證服務:基於Spring Security OAuth2的授權認證中心。客戶端登錄時通過AUTHSERVICE獲取訪問令牌(走用戶名密碼模式)。服務之間調用也通過AUTHSERVICE獲取訪問令牌(走客戶端模式)。令牌校驗方式~各資源服務器去AUTHSERVICE集中校驗令牌。
- 配置服務:基於Spring Cloud Config的配置中心,集中管理所有Spring服務的配置文件。
- 分佈式調用鏈:基於Spring Cloud Sleuth的調用鏈監控。網關調用後臺服務,服務之間調用,都採用Zipkin進行埋點和跟蹤。
- 軟負載和限流熔斷:基於Spring Cloud Ribbon&Hystrix,Zuul調用後臺服務,服務之間相互調用,都通過Ribbon實現軟負載,也通過Hystrix實現熔斷限流保護。
- METRICS & DASHBOARD:基於Spring Cloud Turbine + Hystrix Dashboard,對所有Hystrix產生的Metrics流進行聚合,並展示在Hystrix Dashboard上。
- 日誌監控:採用ELK棧集中收集和分析應用日誌。
改造後的基礎服務架構
上圖是經過我改造後的架構,淺藍色標註的都屬於基礎服務,主要替換的組件如下:
- 授權認證服務:替換爲使用第8模塊爲課程定製開發的Gravitee OAuth2服務器。
- 配置服務:替換爲使用攜程Apollo做統一配置中心,集中管理所有Spring微服務的配置。
- 分佈式調用鏈:替換爲使用大衆點評開源的CAT做調用鏈監控,從網關調後臺服務,服務之間相互調用,都採用CAT客戶端進行埋點監控。CAT埋點既演示使用攔截器(interceptor)方式,也演示使用AOP非侵入方式。
- METRICS&ALERTING:網關和微服務都啓用Prometheus Metrics端點,便於集成Prometheus監控和告警。
其它組件,比如Zuul網關、Eureka服務發現、Ribbon軟負載、Hystrix限流熔斷,以及ELK集中日誌都同原架構,沒有太大變化。
註冊登錄和服務調用流程
註冊登錄流程
上圖展示PiggyMetrics的登錄註冊流程,簡化流程如下:
- 客戶端應用向後臺發起註冊請求。
- 請求通過網關反向路由到賬戶服務(Account Svc)。
- 賬戶服務先去授權認證服務(Gravitee OAuth2)創建一個用戶(包括用戶和密碼,這樣後續纔可以登錄獲取訪問令牌)。賬戶服務再保存新賬戶信息到本地MongoDB數據庫。
- 註冊成功以後,客戶應用向授權認證服務請求訪問令牌(走用戶名密碼模式),拿到令牌以後緩存本地localstorage。
服務調用流程
上圖展示PiggyMetrics的API調用流程,簡化流程如下:
- 客戶端向後臺服務發起API調用,調用時在HTTP授權頭上帶上訪問令牌
- 網關截獲API請求,根據安全需求判斷是否需要驗令牌,如果需要,則向授權服務器發起令牌校驗請求。授權服務器校驗令牌並返回有效型性信息,如果令牌有效,同時返回用戶名等相關信息。網關再判斷校驗是否通過,如果通過,則將用戶名以HTTP HEADER方式向後臺服務傳遞,如果不通過,則直接報授權錯到客戶端。
- 資源服務器從HTTP HEADER獲取用戶名等信息,可通過用戶名進一步查詢用戶相關信息,實現業務邏輯。
客戶端調用後臺服務,經過改造爲網關集中校驗令牌方式,這樣可以簡化安全架構,即在企業內網,資源服務器端可直接獲取用戶名信息,不需要再到授權服務器做集中令牌校驗。另外,服務之間的調用也改造爲可以直接調用,不需要授權認證和令牌,這種做法也是很多一線企業實際落地的做法,即在生產環境中,內部服務之間調用不授權認證,這樣可以簡化服務的開發和部署,但是對於安全敏感的服務要求做好生產網段隔離(需運維配合)。
生產擴展
注意!!!,我擴展的PiggyMetrics僅供學習參考,如果要參考這個架構進行生產化,仍需做生產化擴展,下面是一些可能的擴展點:
- 安全,採用網關集中令牌校驗後,內部服務可以直接調用,不需要授權認證,但在生產環境中,特別是對於安全敏感的服務,需要考慮安全增強,例如生產網段隔離和IP白名單等機制。
- CAT客戶端進一步封裝,案例演示中爲了簡化,使用一些手工埋點,但在實際生產中,一般需要有獨立框架團隊對CAT客戶端進行進一步封裝,對常用基礎組件(服務框架,數據訪問層,MVC框架,消息系統,緩存系統等)進行集中埋點,並提供封裝好的客戶端(最好做到無侵入,可參考Spring Cloud Sleuth Starter埋點方式),方便業務研發團隊接入。基本上,框架層集中埋點以後,業務應用只需引入依賴即可,一般不需要再手工埋點。
- 用戶服務解耦,演示案例中,用戶服務(包括用戶數據庫)和Gravitee OAuth2集成在一起,但實際企業中用戶服務可能是獨立不耦合的,Gravitee OAuth2可以擴展集成獨立用戶服務,賬戶服務也可以集成對接獨立用戶服務。
- 前後分離部署,演示案例中,爲簡化部署,前端應用和網關住在一起,但在實際生產中,根據企業業務和團隊規模,前端應用和後端微服務可能是完全分離部署的,具體做法可參考波波的視頻課程。
- Gravitee OAuth2,另外Gravitee OAuth2本身也需要擴展,具體可參考其站點文檔說明[參考3]
個人思考
近年,國外一線互聯網公司(如Netflix)在成功落地微服務架構的基礎上,陸續開源了其中的一些核心組件,如Zuul/Eureka/Hystrix等,推動了社區技術進步。Pivotal則將這些組件和Spring集成起來,推出Spring Cloud技術棧,在社區產生較大影響,但整個體系可以認爲是一個純西方技術文化的技術棧。同樣在近年,我們國內一線互聯網公司在實踐中也落地了不少基礎組件,例如大衆點評的CAT,攜程的Apollo等,這些組件同樣經過大流量考驗,使用上更具中國文化特色,也更接地氣。我們架構師在做技術選型的時候,不可盲信國外技術棧,更好的做法是兼收幷蓄,在吸收借鑑Spring Cloud技術棧的基礎上,替換融入一些中國特色的微服務組件,構建中國特色的微服務基礎架構,通過實踐走出自己的道路。
波波的這門<<微服務架構和實踐160講>>課程,包括本次的綜合案例分析,其實就是這樣一種博採衆長、融合提煉思想的嘗試,希望對國內架構師帶來一些新的參考和啓發。