一箇中國式微服務架構模擬案例

介紹

我和極客時間合作的課程《微服務架構和實踐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技術棧的一個不錯參考。

piggy metrics

PiggMetrics採用前後分離架構,前端是單頁SPA,後端採用基於Spring Cloud技術棧的微服務架構。

架構設計

業務服務架構

biz arch

上圖是PiggyMetrics的業務服務架構,包括:

  1. CLIENT,一個純JS/HTML/CSS單頁應用,實現註冊登錄和前端展示邏輯
  2. ACCOUNT SERVICE,賬戶服務,存儲用戶賬戶和記賬信息
  3. NOTIFICATION SERVICE,通知服務,存儲通知和備份等相關配置
  4. STATISTICS SERVICE,統計服務,計算用戶財務狀況和統計信息

每個服務有一個獨立的MongoDB數據存儲(表示微服務獨立數據源思想)。客戶端可調用後臺服務,例如前端調用賬戶服務去註冊賬戶。服務之間也會相互調用,例如賬戶更新時,賬戶服務會同時調統計服務去更新用戶統計信息。另外,統計服務還會調用第三方匯率服務獲取匯率信息。

原基礎服務架構

tech arch

上圖是PiggyMetrics的原基礎服務架構,包括:

  1. API網關:基於Spring Cloud Zuul的網關,是調用後臺API的聚合入口,實現反向路由和負載均衡(Eureka+Ribbon)、限流熔斷(Hystrix)等功能。CLIENT單頁應用和ZUUL網關暫住在一起,簡化部署。
  2. 服務註冊和發現:基於Spring Cloud Eureka的服務註冊中心。業務服務啓動時通過Eureka註冊,網關調用後臺服務通過Eureka做服務發現,服務之間調用也通過Eureka做服務發現。
  3. 授權認證服務:基於Spring Security OAuth2的授權認證中心。客戶端登錄時通過AUTHSERVICE獲取訪問令牌(走用戶名密碼模式)。服務之間調用也通過AUTHSERVICE獲取訪問令牌(走客戶端模式)。令牌校驗方式~各資源服務器去AUTHSERVICE集中校驗令牌。
  4. 配置服務:基於Spring Cloud Config的配置中心,集中管理所有Spring服務的配置文件。
  5. 分佈式調用鏈:基於Spring Cloud Sleuth的調用鏈監控。網關調用後臺服務,服務之間調用,都採用Zipkin進行埋點和跟蹤。
  6. 軟負載和限流熔斷:基於Spring Cloud Ribbon&Hystrix,Zuul調用後臺服務,服務之間相互調用,都通過Ribbon實現軟負載,也通過Hystrix實現熔斷限流保護。
  7. METRICS & DASHBOARD:基於Spring Cloud Turbine + Hystrix Dashboard,對所有Hystrix產生的Metrics流進行聚合,並展示在Hystrix Dashboard上。
  8. 日誌監控:採用ELK棧集中收集和分析應用日誌。

改造後的基礎服務架構

customized arch

上圖是經過我改造後的架構,淺藍色標註的都屬於基礎服務,主要替換的組件如下:

  1. 授權認證服務:替換爲使用第8模塊爲課程定製開發的Gravitee OAuth2服務器。
  2. 配置服務:替換爲使用攜程Apollo做統一配置中心,集中管理所有Spring微服務的配置。
  3. 分佈式調用鏈:替換爲使用大衆點評開源的CAT做調用鏈監控,從網關調後臺服務,服務之間相互調用,都採用CAT客戶端進行埋點監控。CAT埋點既演示使用攔截器(interceptor)方式,也演示使用AOP非侵入方式。
  4. METRICS&ALERTING:網關和微服務都啓用Prometheus Metrics端點,便於集成Prometheus監控和告警。

其它組件,比如Zuul網關、Eureka服務發現、Ribbon軟負載、Hystrix限流熔斷,以及ELK集中日誌都同原架構,沒有太大變化。

註冊登錄和服務調用流程

註冊登錄流程

register & login

上圖展示PiggyMetrics的登錄註冊流程,簡化流程如下:

  1. 客戶端應用向後臺發起註冊請求。
  2. 請求通過網關反向路由到賬戶服務(Account Svc)。
  3. 賬戶服務先去授權認證服務(Gravitee OAuth2)創建一個用戶(包括用戶和密碼,這樣後續纔可以登錄獲取訪問令牌)。賬戶服務再保存新賬戶信息到本地MongoDB數據庫。
  4. 註冊成功以後,客戶應用向授權認證服務請求訪問令牌(走用戶名密碼模式),拿到令牌以後緩存本地localstorage。

服務調用流程

api call

上圖展示PiggyMetrics的API調用流程,簡化流程如下:

  1. 客戶端向後臺服務發起API調用,調用時在HTTP授權頭上帶上訪問令牌
  2. 網關截獲API請求,根據安全需求判斷是否需要驗令牌,如果需要,則向授權服務器發起令牌校驗請求。授權服務器校驗令牌並返回有效型性信息,如果令牌有效,同時返回用戶名等相關信息。網關再判斷校驗是否通過,如果通過,則將用戶名以HTTP HEADER方式向後臺服務傳遞,如果不通過,則直接報授權錯到客戶端。
  3. 資源服務器從HTTP HEADER獲取用戶名等信息,可通過用戶名進一步查詢用戶相關信息,實現業務邏輯。

客戶端調用後臺服務,經過改造爲網關集中校驗令牌方式,這樣可以簡化安全架構,即在企業內網,資源服務器端可直接獲取用戶名信息,不需要再到授權服務器做集中令牌校驗。另外,服務之間的調用也改造爲可以直接調用,不需要授權認證和令牌,這種做法也是很多一線企業實際落地的做法,即在生產環境中,內部服務之間調用不授權認證,這樣可以簡化服務的開發和部署,但是對於安全敏感的服務要求做好生產網段隔離(需運維配合)。

生產擴展

注意!!!,我擴展的PiggyMetrics僅供學習參考,如果要參考這個架構進行生產化,仍需做生產化擴展,下面是一些可能的擴展點:

  1. 安全,採用網關集中令牌校驗後,內部服務可以直接調用,不需要授權認證,但在生產環境中,特別是對於安全敏感的服務,需要考慮安全增強,例如生產網段隔離和IP白名單等機制。
  2. CAT客戶端進一步封裝,案例演示中爲了簡化,使用一些手工埋點,但在實際生產中,一般需要有獨立框架團隊對CAT客戶端進行進一步封裝,對常用基礎組件(服務框架,數據訪問層,MVC框架,消息系統,緩存系統等)進行集中埋點,並提供封裝好的客戶端(最好做到無侵入,可參考Spring Cloud Sleuth Starter埋點方式),方便業務研發團隊接入。基本上,框架層集中埋點以後,業務應用只需引入依賴即可,一般不需要再手工埋點。
  3. 用戶服務解耦,演示案例中,用戶服務(包括用戶數據庫)和Gravitee OAuth2集成在一起,但實際企業中用戶服務可能是獨立不耦合的,Gravitee OAuth2可以擴展集成獨立用戶服務,賬戶服務也可以集成對接獨立用戶服務。
  4. 前後分離部署,演示案例中,爲簡化部署,前端應用和網關住在一起,但在實際生產中,根據企業業務和團隊規模,前端應用和後端微服務可能是完全分離部署的,具體做法可參考波波的視頻課程。
  5. Gravitee OAuth2,另外Gravitee OAuth2本身也需要擴展,具體可參考其站點文檔說明[參考3]

個人思考

近年,國外一線互聯網公司(如Netflix)在成功落地微服務架構的基礎上,陸續開源了其中的一些核心組件,如Zuul/Eureka/Hystrix等,推動了社區技術進步。Pivotal則將這些組件和Spring集成起來,推出Spring Cloud技術棧,在社區產生較大影響,但整個體系可以認爲是一個純西方技術文化的技術棧。同樣在近年,我們國內一線互聯網公司在實踐中也落地了不少基礎組件,例如大衆點評的CAT,攜程的Apollo等,這些組件同樣經過大流量考驗,使用上更具中國文化特色,也更接地氣。我們架構師在做技術選型的時候,不可盲信國外技術棧,更好的做法是兼收幷蓄,在吸收借鑑Spring Cloud技術棧的基礎上,替換融入一些中國特色的微服務組件,構建中國特色的微服務基礎架構,通過實踐走出自己的道路。

波波的這門<<微服務架構和實踐160講>>課程,包括本次的綜合案例分析,其實就是這樣一種博採衆長、融合提煉思想的嘗試,希望對國內架構師帶來一些新的參考和啓發。

附錄

  1. 原版PiggyMetrics
  2. 改造版PiggyMetrics
  3. Gravitee OAuth2
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章