微服務架構的中國式落地

来源:https://www.cnblogs.com/lfs2640666960/archive/2018/05/30/9113524.html
-Advertisement-
Play Games

前言 近年,Spring Cloud儼然已經成為微服務開發的主流技術棧,在國內開發者社區非常火爆。我近年一直在一線互聯網公司(攜程,拍拍貸等)開展微服務架構實踐,根據我個人的一線實踐經驗和我平時對Spring Cloud的調研,我認為Spring Cloud技術棧中的有些組件離生產級開發尚有一定距離 ...


前言

近年,Spring Cloud儼然已經成為微服務開發的主流技術棧,在國內開發者社區非常火爆。我近年一直在一線互聯網公司(攜程,拍拍貸等)開展微服務架構實踐,根據我個人的一線實踐經驗和我平時對Spring Cloud的調研,我認為Spring Cloud技術棧中的有些組件離生產級開發尚有一定距離。,比方說Spring Cloud Config和Spring Cloud Sleuth都是Pivotal自研產品,尚未得到大規模企業級生產應用,很多企業級特性缺失(具體見我後文描述)。另外Spring Cloud體系還缺失一些關鍵的微服務基礎組件,比如Metrics監控,健康檢查和告警等。所以我在參考Spring Cloud微服務技術棧的基礎上,結合自身的實戰落地經驗,也結合國內外一線互聯網公司(例如Netflix,點評,攜程,Zalando等)的開源實踐,綜合提出更貼近國內技術文化特色的輕量級的微服務參考技術棧。希望這個參考技術棧對一線的架構師(或者是初創公司)有一個好的指導,能夠少走彎路,快速落地微服務架構。

這個參考技術棧和總體架構如下圖所示:

中國式微服務技術棧2.0

主要包含11大核心組件,分別是:

核心支撐組件:

  1. 服務網關Zuul

  2. 服務註冊發現Eureka+Ribbon

  3. 服務配置中心Apollo

  4. 認證授權中心Spring Security OAuth2

  5. 服務框架Spring MVC/Boot

監控反饋組件:

  1. 數據匯流排Kafka

  2. 日誌監控ELK

  3. 調用鏈監控CAT

  4. Metrics監控KairosDB

  5. 健康檢查和告警ZMon

  6. 限流熔斷和流聚合Hystrix/Turbine

二、核心支撐組件

2.1 服務網關Zuul

2013年左右,infoq曾經對前Netflix架構總監Adrian Cockcroft有過一次專訪[附錄1],其中有問Adrian:“Netflix開源這麼多項目,你認為哪一個是最不可或缺的(MOST Indispensable)”,Adrian回答說:“在NetflixOSS開源項目中,有一個容易被忽略,但是Netflix最強大的基礎服務之一,它就是Zuul網關服務。Zuul網關主要用於智能路由,同時也支持認證,區域和內容感知路由,將多個底層服務聚合成統一的對外API。Zuul網關的一大亮點是動態可編程,配置可以秒級生效”。從Adrian的回答中,我們可以感受到Zuul網關對微服務基礎架構的重要性。

Zuul在英文中是一種怪獸,星際爭霸中蟲族裡頭也有Zuul,Netflix為網關起名Zuul,寓意看門神獸

Zuul網關在Netflix經過生產級驗證,在納入Spring Cloud體系之後,在社區中也有眾多成功的應用。Zuul網關在攜程(日流量超50億),拍拍貸等公司也有成功的落地實踐,是微服務基礎架構中網關一塊的首選。其它開源產品像Kong或者Nginx等也可以改造支持網關功能,但是較複雜門檻高一點。

Zuul網關雖然不完全支持非同步,但是同步模型反而使它簡單輕量,易於編程和擴展,當然同步模型需要做好限流熔斷(和限流熔斷組件Hystrix配合),否則可能造成資源耗盡甚至雪崩效應(cascading failure)。

2.2 服務註冊發現Eureka + Ribbon

針對微服務註冊發現場景,社區裡頭的開源產品當中,經過生產級大流量驗證的,目前只有Netflix Eureka一個,它也已經納入Spring Cloud體系,在社區中有眾多成功應用,例如攜程Apollo配置中心也是使用Eureka做軟負載。其它產品如Zookeeper/Etcd/Consul等,都是比較通用的產品,還需要進一步封裝定製才可生產級使用。Eureka支持跨數據中心高可用,但它是AP最終一致系統,不是強一致性系統。

Eureka是阿基米德洗澡時發現浮力原理時發出的驚嘆聲,在微服務中寓意發現

Ribbon是可以和Eureka配套對接的客戶端軟負載庫,在Eureka的配合下能夠支持多種靈活的動態路由和負載均衡策略。內部微服務直連可以直接走Ribbon客戶端軟負載,網關上也可以部署Ribbon,這時網關相當於一個具有路由和軟負載能力的超級客戶端。

2.3 服務配置中心Apollo

Spring Cloud體系裡頭有個Spring Cloud Config產品,但是功能遠遠達不到生產級,只能小規模場景下用,中大規模企業級場景不建議採用。攜程框架研發部開源的Apollo是一款在攜程和其它眾多互聯網公司生產落地下來的產品,開源兩年多,目前在github上有超過4k星,非常成功,文檔齊全也是它的一大亮點,推薦作為企業級的配置中心產品。Apollo支持完善的管理界面,支持多環境,配置變更實時生效,許可權和配置審計等多種生產級功能。Apollo既可以用於連接字元串等常規配置場景,也可用於發佈開關(Feature Flag)和業務配置等高級場景。

阿波羅是希臘神話中太陽神的意思

2.4 認證授權中心Spring Security OAuth2

目前開源社區還沒有特別成熟的微服務安全認證中心產品,之前我工作過的一些中大型互聯網公司,比如攜程,唯品會等,在這一塊基本都是定製自研的,但是對一般企業來說,定製自研還是有門檻的。OAuth2是一種基於令牌Token的授權框架,已經得到眾多大廠(Google, Facebook, Twitter, Microsoft等)的支持,可以認為是事實上的微服務安全協議標準,適用於開放平臺聯合登錄,現代微服務安全(包括單頁瀏覽器App/無線原生App/伺服器端WebApp接入微服務,以及微服務之間調用等場景),和企業內部應用認證授權(IAM/SSO)等多種場景。

Spring Security OAuth2是Spring Security基礎上的一個擴展,支持四種主要的OAuth2 Flows,基本可以作為微服務認證授權中心的推薦產品。但是Spring Security OAuth2還只是一個框架,不是一個端到端的開箱即用的產品,企業級應用仍需在其上進行定製,例如提供Web端管理界面,對接企業內部的用戶認證登錄系統,使用Cache緩存令牌,和微服務網關對接等,才能作為生產級使用。在這裡給大家推薦一個架構交流群650385180,裡面會分享一些資深架構師錄製的視頻錄像:有Spring,MyBatis,Netty源碼分析,高併發、高性能、分散式、微服務架構的原理,JVM性能優化這些成為架構師必備的知識體系。還能領取免費的學習資源,以下的知識體系圖也是在群里獲取。相信對於已經工作和遇到技術瓶頸的碼友,在這個群里一定有你需要的內容。

2.5 服務框架Spring Boot

Spring可以說是史上最成功的Web App/API開發框架之一,它融入了Java社區中多年來沉澱下來的最佳實踐,雖然有將近15年曆史,但目前的社區活躍度仍呈上升趨勢。Spring Boot在Spring的基礎上進一步打包封裝,提供更貼心的Starter工程,自啟動能力,自動依賴管理,基於代碼的配置等特性進一步降低接入門檻。另外Spring Boot也提供actuator這樣的生產級監控特性,支持DevOps研發模式,它是微服務開發框架的推薦首選。

REST契約規範Swagger和Spring有比較好的集成,使得Spring也支持契約驅動開發(Contract Driven Development)模型。對於一些中大規模的企業,如果業務複雜團隊較多,考慮到互操作性和集成成本,建議採用契約驅動開發模型,也就是開發時先定義Swagger契約,然後再通過契約生成服務端介面和客戶端,再實現服務端業務邏輯,這種開發模型能夠標準化介面,降低系統間集成成本,對於多團隊協同並行開發非常重要。

Spring Boot Logo

三、監控反饋組件

3.1 數據匯流排Kafka

最初由Linkedin研發併在其內部大規模成功應用,然後在Apache上開源的Kafka,是業內數據匯流排(Databus)一塊的標配,幾乎每一家互聯網公司都可以看到Kafka的身影。Kafka堪稱開源項目的一個經典成功案例,其創始人團隊從Linkedin離職後還專門成立了一家叫confluent的企業軟體服務公司,圍繞Kafka周邊提供配套和增值服務。在監控一塊,日誌和Metrics等數據可以通過Kafka做收集、存儲和轉發,相當於中間增加了一個大容量緩衝,能夠應對海量日誌數據的場景。除了日誌監控數據收集,Kafka在業務大數據分析,IoT等場景都有廣泛應用。如果對Kafka進行適當定製增強,還可以用於傳統消息中間件場景。

Kafka的特性是大容量,高吞吐,高可用,數據可重覆消費,可水平擴展,支持消費者組等。Kafka尤其適用於不嚴格要求實時和不丟數據的大數據日誌場景。

Kafka創始人三人組,離開Linkedin後,創立了基於Kafka的創業公司Confluent

3.2 日誌監控ELK

ELK(ElasticSearch/Logstash/Kibana)是日誌監控一塊的標配技術棧,幾乎每一家互聯網公司都可以看到ELK的身影,據稱攜程是國內ELK的最大用戶,每日增量日誌數據量達到80~90TB。ELK已經非常成熟,基本上是開箱即用,後續主要的工作在運維、治理和調優。ELK一般和Kafka配套使用,因為日誌分詞操作還是比較耗時的,Kafka主要作為前置緩衝,起到流量消峰作用,抵消日誌流量高峰和消費(分詞建索引)的不匹配問題。一旦反向索引建立,日誌檢索是非常快的,所以日誌檢索快和靈活是ElasticSearch的最大亮點。另外ELK還有大容量,高吞吐,高可用,可水平擴容等企業級特性。

創業公司起步期,考慮到資源時間限制,調用鏈監控和Metrics監控可以不是第一優先順序,但是ELK是必須搭一套的,應用日誌數據一定要收集並建立索引,基本能夠覆蓋大部分Trouble Shooting場景(業務,性能,程式bug等)。另外用好ELK的關鍵是治理,需要制定一些規則(比如只收集Warn級別以上日誌),對應用的日誌數據量做好監控,否則開發人員會濫用,什麼垃圾數據都往ELK裡頭丟,造成大量空間被浪費,嚴重的還可能造成性能可用性問題。

3.3 調用鏈監控CAT

Spring Cloud支持基於Zipkin的調用鏈監控,我個人基於實踐經驗認為Zipkin還不能算一款企業級調用鏈監控產品,充其量只能算是一個半成品,很多重要的企業級特性缺失。Zipkin最早是由Twitter在消化Google Dapper論文的基礎上研發,在Twitter內部有較成功應用,但是在開源出來的時候把不少重要的統計報表功能給閹割了(因為依賴於一些比較重的大數據分析平臺),只是開源了一個半成品,能簡單查詢和呈現可視化調用鏈,但是細粒度的調用性能數據報表沒有開源。

Google大致在2007年左右開始研發稱為Dapper的調用鏈監控系統,但在遠遠早於這個時間(大致在2002左右),eBay就已經有了自己的調用鏈監控系統CAL(Centralized Application Logging),Google和eBay的設計思路大致相同,但是也有一些差別。CAL在eBay有大規模成功應用,被稱為是eBay的四大神器之一(另外三個是DAL,Messaging和SOA)。開源調用鏈監控系統CAT的作者吳其敏(我曾經和他同事,習慣叫他老吳),曾經在eBay工作近十年,期間深入消化吸收了CAL的設計。2011年後老吳離開eBay去了點評,用三年時間在點評再造了一款調用鏈監控產品CAT(Centralized Application Tracking),CAT具有CAL的基因和影子,同時也融入了老吳在點評的探索實踐和創新。

CAT是一款更完整的企業級調用鏈監控產品,甚至已經接近一個APM(Application Performance Management)產品的範疇,它不僅支持調用鏈的查詢和可視化,還支持細粒度的調用性能數據統計報表,這塊是CAT和市面上其它開源調用鏈監控產品最本質的差異點,實際上開發人員大部分時間用CAT是看性能統計報表(主要是CAT的Transaction和Problem報表),這些報表相當於給了開發人員一把尺子,可以自助測量並持續改進應用性能。另外CAT還支持應用報錯大盤,自助告警等功能,也是企業級監控非常實用的功能。

CAT在點評,攜程,陸金所,拍拍貸等公司有成功落地案例,因為是國產調用鏈監控產品,界面展示和功能等更契合國內文化,更易於在國內公司落地。個人推薦CAT作為微服務調用鏈監控的首選。至於社區裡頭有人提到CAT的侵入性問題,我覺得是要一分為二看,有利有弊,有耦合性但是性能更好,一般企業中基礎架構團隊會使用CAT統一為基礎組件埋點,開發人員一般不用自己埋點;另外企業用了一款調用鏈監控產品以後,一般是不會換的,開發人員用習慣就好了,侵入不是大問題。

3.4 Metrics監控KairosDB

除了日誌和調用鏈,Metrics也是應用監控的重要關註點。互聯網應用提倡度量驅動開發(Metrics Driven Development),也就是說開發人員不僅要關註功能實現,做好單元測試(TDD),還要做好業務層(例如註冊,登錄和下單數等)和應用層(例如調用數,調用延遲等)的監控埋點,這個也是DevOps(開發即運維)理念的體現,DevOps要求開發人員必須關註運維需求,監控埋點是一種生產級運維需求。

Metrics監控產品底層依賴於時間序列資料庫(TSDB),最近比較熱的開源產品有Prometheus和InfluxDB,社區用戶數量和反饋都不錯,可以採納。但是這些產品分散式能力比較弱,定製擴展門檻比較高,一般建議剛起步量不大的公司採用。如果企業業務和團隊規模發展到一定階段,建議考慮支持分散式能力的時間序列監控產品,例如KairosDB或者OpenTSDB,我本人對這兩款產品都有一些實踐經驗,KariosDB基於Cassandra,相對更輕量一點,建議中大規模公司採用,如果你們公司已經採用Hadoop/HBase,則OpenTSDB也是不錯選擇。

KairosDB一般也和Kafka配套使用,Kafka作為前置緩衝。另外註意使用KariosDB打點的話tag的值不能太離散,否則會有查詢性能問題,這個和KariosDB底層存儲結構有關係。Grafana是Metrics展示標配,可以和KariosDB無縫集成。

Grafana是Metrics展示標配,和主流時間序列資料庫都可以集成

3.5 健康檢查和告警ZMon

除了上述監控手段,我們仍需要健康檢查和告警系統作為配套的監控手段。ZMon是德國電商公司Zalando開源的一款健康檢查和告警平臺,具備強大靈活的監控告警能力。ZMon本質上可以認為是一套分散式監控任務調度平臺,它提供眾多的Check腳本(也可以自己再定製擴展),能夠對各種硬體資源或者目標服務(例如HTTP埠,Spring的Actuator端點,KariosDB中的Metrics,ELK中的錯誤日誌等等)進行定期的健康檢查和告警,它的告警邏輯和策略採用Python腳本實現,開發人員可以實現自助式告警。ZMon同時適用於系統,應用,業務,甚至端用戶體驗層的監控和告警。

ZMon分散式監控告警系統架構,底層基於KairosDB時間序列資料庫

3.6 限流熔斷和流聚合Hystrix+Turbine

2010年左右,Netflix也飽受分散式微服務系統中雪崩效應(Cascading Failure)的困擾,於是專門啟動了一個叫做彈性工程的項目來解決這個問題,Hystrix就是彈性工程最終落地下來的一個產品。Hystrix在Netflix微服務系統中大規模推廣應用後,雪崩效應問題基本得到解決,整個體統更具彈性。之後Netflix把Hystrix開源貢獻給了社區,短期獲得社區的大量正面反饋,目前Hystrix在github上有超過1.3萬顆星,據說支持奧巴馬總統選舉的系統也曾使用Hystrix進行限流熔斷保護[參考附錄2],可見限流熔斷是分散式系統穩定性的強需求,Netflix很好的抓住了這個需求並給出了經過生產級驗證的解決方案。Hystrix已經被納入Spring Cloud體系,它是Java社區中限流熔斷組件的首選(目前還看不到第二個更好的產品)。

Turbine是和Hystrix配套的一個流聚合服務,能夠對Hystrix監控數據流進行聚合,聚合以後可以在Hystrix Dashboard上看到集群的流量和性能情況。

Hystrix在英文中是豪豬獸的意思,豪豬獸通過身上的刺保護自己,Netflix為限流熔斷組件起名Hystrix,寓意Hystrix能夠保護微服務調用。

四、結論

  1. 技術棧沒有好壞之分,只有適合一說。本文推薦的技術棧主要基於我個人的實踐和總結,但是未必適合所有場景,畢竟每個企業的上下文各不相同。作為架構師你可以參考我推薦的技術棧,但不可拘泥照搬,你必須在深入理解分佈系統原理的基礎上,再結合企業實際場景靈活應用。

  2. 本文推薦的技術棧主要面向微服務基礎架構,在整個互聯網基礎技術平臺體系中,還有消息,任務,數據訪問層,發佈系統,容器雲平臺,分散式事務,分散式一致性,測試,CI/CD等其它重要主題。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • Long Parameter List(過長參數列) Divergent Change(發散式變化) Shotgun Surgery(散彈式修改) Feature Envy(依戀情結) Data Clumps(數據泥團) Primitive Obsession(基本型別偏執) Switch Stat... ...
  • 在Flask中鉤子函數是使用特定的裝飾器的函數。為什麼叫做鉤子函數呢,是因為鉤子函數可以在正常執行的代碼中,插入一段自己想要執行的代碼,那麼這種函數就叫做鉤子函數。 before_first_request:Flask項目第一次部署後會執行的鉤子函數。 before_request:請求已經到達了F ...
  • 博客園是面向開發者的知識分享社區,不允許發佈任何推廣、廣告、政治方面的內容。 博客園首頁(即網站首頁)只能發佈原創的、高質量的、能讓讀者從中學到東西的內容。 如果博文質量不符合首頁要求,會被工作人員移出首頁,望理解。如有疑問,請聯繫[email protected]。 ...
  • 大家好,併發編程 進入第十章。好了,今天的內容其實還挺多的,我準備了三天,到今天才整理完畢。希望大家看完,有所收穫的,能給小明一個贊。這就是對小明最大的鼓勵了。為了更好地銜接這一節,我們先來回顧一下上一節的內容。 上一節「」,我們首先介紹了,如何創建一個協程對象.主要有兩種方法 通過async關鍵字 ...
  • 在瞭解完了 Python函數基礎篇 之後,本篇的存在其實是為了整合知識,由於該篇的知識是否雜亂,故大家可以通過點開點連接直接進入其詳細介紹,該篇主要大致的介紹一下幾個知識點: 一、Python的迭代器和生成器 二、Python的內置函數 三、Python的open函數之文件處理 四、Python的遞 ...
  • 1 flask script擴展庫 概念 : 是一個flask終端運行的解析器 ,因為項目完成以後,代碼改動會有風險,所以藉助終端完成不同啟動項的配置 安裝 使用 執行程式需要在啟動項輸入命令 2 Blueprint藍圖 概念 : Blueprint通過把實現不同功能的module分開,實現分類功能 ...
  • GOPATH設置 僅僅安裝好msi是不夠的,還需要配置一些東西:`GOPATH` Go從1.1版本到1.7必須設置這個變數,而且不能和Go的安裝目錄一樣。 這個目錄用來存放Go源碼,Go的可運行文件,以及相應的編譯之後的包文件。 所以這個目錄下麵有三個子目錄:src、bin、pkg 從go 1.8開... ...
  • 將網站根目錄配置到項目的web目錄 打開網站訪問的是web/index.php這時打開預設頁面 訪問一下其他頁面,發現瀏覽器地址的url攜帶了一個參數 http://www.test.com/index.php?r=site%2Fabout r=site/about,這是一個路由參數 site應該是 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...