微服務 2.0 技術棧選型手冊
點選上方“芋道原始碼”,選擇“設為星標”
做積極的人,而不是積極廢人!
原始碼精品專欄
來源:http://t.cn/R14nyRW
一、前言
二、選型準側
三、微服務基礎架構核心關注點
四、服務框架選型
五、執行時支撐服務選型
六、服務監控選型
七、服務容錯選型
八、後臺服務選型
九、服務安全選型
十、服務部署平臺選型
十一、寫在最後
一、前言
2014年可以認為是微服務1.0的元年,當年有幾個標誌性事件,一是Martin Fowler在其部落格上發表了“Microservices”一文,正式提出微服務架構風格;二是Netflix微服務架構經過多年大規模生產驗證,最終抽象落地形成一整套開源的微服務基礎元件,統稱NetflixOSS,Netflix的成功經驗開始被業界認可並推崇;三是Pivotal將NetflixOSS開源微服務元件整合到其Spring體系,推出Spring Cloud微服務開發技術棧。
一晃三年過去,微服務技術生態又發生了巨大變化,容器,PaaS,Cloud Native,gRPC,ServiceMesh,Serverless等新技術新理念你方唱罷我登場,不知不覺我們又來到了微服務2.0時代。基於近年在微服務基礎架構方面的實戰經驗和平時的學習積累,我想總結並提出一些構建微服務2.0技術棧的選型思路,供各位在一線實戰的架構師、工程師參考借鑑。對於一些暫時還沒有成熟開源產品的微服務支撐模組,我也會給出一些定製自研的設計思路。
二、選型準側
對於技術選型,我個人有很多標準,其中下面三項是最重要的:
1. 生產級
我們選擇的技術棧是要解決實際業務問題和上生產抗流量的(選擇不慎可能造成生產級事故),而不是簡單做個POC或者Demo展示,所以生產級(Production Ready),可運維(Ops Ready),可治理,成熟穩定的技術才是我們的首選;
2. 一線網際網路公司落地產品
我們會盡量採用在一線網際網路公司落地並且開源的,且在社群內形成良好口碑的產品,它們已經在這些公司經過流量衝擊,坑已經基本被填平,且被社群接受形成一個良好的社群生態(本文附錄部分會給出所有推薦使用或參考的開源專案的github連結。)。
3. 開源社群活躍度
Github上的stars的數量是一個重要指標,同時會參考其程式碼和文件更新頻率(尤其是近年),這些指標直接反應開源產品的社群活躍度或者說生命力。
另外,對於不同業務體量和團隊規模的公司,技術選型標準往往是不同的,創業公司的技術選型和BAT級別公司的技術選型標準可能完全不同。本文主要針對日流量千萬以上,研發團隊規模不少於50人的公司,如果小於這個規模我建議認真評估是否真的需要採用微服務架構。考慮到Java語言在國內的流行度和我個人的背景經驗,本文主要針對採用Java技術棧的企業。本文也假定自建微服務基礎架構,有些產品其實有對應的雲服務可以直接使用,自建和採用雲服務各有利弊,架構師需要根據場景上下文綜合權衡。
三、微服務基礎架構核心關注點
下面腦圖中芒果色標註的七個模組,我認為是構建微服務2.0技術棧的核心模組,本文後面的選型會分別基於這些模組展開。對於每個模組我也列出一些核心架構關注點,在選擇具體產品時,需要儘可能覆蓋到這些關注點。
下圖是在參考過華為技術專家王磊的《微服務的設計與生態系統》[附錄12.46]的基礎上,結合作者自身的實踐調整而來,我想同時分享給一線架構師或者工程師參考,其中粉紅色標註的模組是和微服務關係最密切的模組,大家在做技術選型時,可以同時對照這個體系。
四、服務框架選型
服務框架是一個比較成熟的領域,有太多可選項。Spring Boot/Cloud[附錄12.1]由於Spring社群的影響力和Netflix的背書,目前可以認為是構建Java微服務的一個社群標準,Spring Boot目前在github上有超過20k星。基於Spring的框架本質上可以認為是一種RESTful框架(不是RPC框架),序列化協議主要採用基於文字的JSON,通訊協議一般基於HTTP。RESTful框架天然支援跨語言,任何語言只要有HTTP客戶端都可以接入呼叫,但是客戶端一般需要自己解析payload。目前Spring框架也支援Swagger契約程式設計模型,能夠基於契約生成各種語言的強型別客戶端,極大方便不同語言棧的應用接入,但是因為RESTful框架和Swagger規範的弱契約特性,生成的各種語言客戶端的互操作性還是有不少坑的。
Dubbo[附錄12.2]是阿里多年構建生產級分散式微服務的技術結晶,服務治理能力非常豐富,在國內技術社群具有很大影響力,目前github上有超過16k星。Dubbo本質上是一套基於Java的RPC框架,噹噹Dubbox擴充套件了Dubbo支援RESTful介面暴露能力。Dubbo主要面向Java 技術棧,跨語言支援不足是它的一個弱項,另外因為治理能力太豐富,以至於這個框架比較重,完全用好這個框架的門檻比較高,但是如果你的企業基本上投資在Java技術棧上,選Dubbo可以讓你在服務框架一塊站在較高的起點上,不管是效能還是企業級的服務治理能力,Dubbo都做的很出色。新浪微博開源的Motan(github 4k stars)也不錯,功能和Dubbo類似,可以認為是一個輕量裁剪版的Dubbo。
gRPC[附錄12.3]是谷歌近年新推的一套RPC框架,基於protobuf的強契約程式設計模型,能自動生成各種語言客戶端,且保證互操作。支援HTTP2是gRPC的一大亮點,通訊層效能比HTTP有很大改進。Protobuf是在社群具有悠久歷史和良好口碑的高效能序列化協議,加上Google公司的背書和社群影響力,目前gRPC也比較火,github上有超過13.4k星。目前看gRPC更適合內部服務相互呼叫場景,對外暴露HTTP RESTful介面可以實現,但是比較麻煩(需要gRPC Gateway配合),所以對於對外暴露API場景可能還需要引入第二套HTTP RESTful框架作為補充。總體上gRPC這個東西還比較新,社群對於HTTP2帶來的好處還未形成一致認同,建議謹慎投入,可以做一些試點。
五、執行時支撐服務選型
執行時支撐服務主要包括服務註冊中心,服務路由閘道器和集中式配置中心三個產品。
服務註冊中心,如果採用Spring Cloud體系,則選擇Eureka[附錄12.4]是最佳搭配,Eureka在Netflix經過大規模生產驗證,支援跨資料中心,客戶端配合Ribbon可以實現靈活的客戶端軟負載,Eureka目前在github上有超過4.7k星;Consul[附錄12.5]也是不錯選擇,天然支援跨資料中心,還支援KV模型儲存和靈活健康檢查能力,目前在github上有超過11k星。
服務閘道器也是一個比較成熟的領域,有很多可選項。如果採用Spring Cloud體系,則選擇Zuul[附錄12.6]是最佳搭配,Zuul在Netflix經過大規模生產驗證,支援靈活的動態過濾器指令碼機制,非同步效能不足(基於Netty的非同步Zuul遲遲未能推出正式版)。Zuul閘道器目前在github上有超過3.7k星。基於Nginx/OpenResty的API閘道器Kong[附錄12.7]目前在github上比較火,有超過14.1k星。因為採用Nginx核心,Kong的非同步效能較強,另外基於lua的外掛機制比較靈活,社群外掛也比較豐富,從安全到限流熔斷都有,還有不少開源的管理介面,能夠集中管理Kong叢集。
配置中心,Spring Cloud自帶Spring Cloud Config[附錄12.8](github 0.75k stars),個人認為算不上生產級,很多治理能力缺失,小規模場景可以試用。個人比較推薦攜程的Apollo[附錄12.9]配置中心,在攜程經過生產級驗證,具備高可用,配置實時生效(推拉結合),配置審計和版本化,多環境多叢集支援等生產級特性,建議中大規模需要對配置集中進行治理的企業採用。Apollo目前在github上有超過3.4k星。
六、服務監控選型
主要包括日誌監控,呼叫鏈監控,Metrics監控,健康檢查和告警通知等產品。
ELK目前可以認為是日誌監控的標配,功能完善開箱即用,Elasticsearch[附錄12.10]目前在github上有超過28.4k星。Elastalert[附錄12.11] (github 4k stars)是Yelp開源的針對ELK的告警通知模組。
呼叫鏈監控目前社群主流是點評CAT[附錄12.12](github 4.3k stars),Twitter之前開源現在由OpenZipkin社群維護的Zipkin[附錄12.13](github 7.5k stars)和Naver開源的Pinpoint[附錄12.14](github 5.3k stars)。個人比較推薦點評開源的CAT,在點評和國內多家網際網路公司有落地案例,生產級特性和治理能力較完善,另外CAT自帶告警模組。下面是我之前對三款產品的評估表,供參考。
Metrics監控主要依賴於時間序列資料庫(TSDB),目前較成熟的產品是StumbleUpon公司開源的基於HBase的OpenTSDB[附錄12.15](基於Cassandra的KariosDB[附錄12.16]也是一個選擇,github 1.1k stars,它基本上是OpenTSDB針對Cassandra的一個改造版),OpenTSDB具有分散式能力可以橫向擴充套件,但是相對較重,適用於中大規模企業,OpenTSDB目前在github上有近2.9k星。OpenTSDB 本身不提供告警模組,Argus[附錄12.17](github 0.29k星)是Salesforce開源的基於OpenTSDB的統一監控告警平臺,支援豐富的告警函式和靈活的告警配置,可以作為OpenTSDB的告警補充。近年也出現一些輕量級的TSDB,如InfluxDB[附錄12.18](github 12.4k stars)和Prometheus[附錄12.19](github 14.3k stars),這些產品函式報表能力豐富,自帶告警模組,但是分散式能力不足,適用於中小規模企業。Grafana[附錄12.20](github 19.9k stars)是Metrics報表展示的社群標配。
社群還有一些通用的健康檢查和告警產品,例如Sensu[附錄12.21](github 2.7k stars),能夠對各種服務(例如spring boot暴露的健康檢查端點,時間序列資料庫中的metrics,ELK中的錯誤日誌等)定製靈活的健康檢查(check),然後使用者可以針對check結果設定靈活的告警通知策略。Sensu在Yelp等公司有落地案例。其它類似產品還有Esty開源的411[附錄12.22](github 0.74k星)和Zalando的ZMon[附錄12.23] (github 0.15k星),它們是分別在Esty和Zalando落地的產品,但是定製check和告警配置的使用門檻比較高,社群不熱,建議有定製自研能力的團隊試用。ZMon後臺採用KairosDB儲存,如果企業已經採用KariosDB作為時間序列資料庫,則可以考慮ZMon作為告警通知模組。
七、服務容錯選型
針對Java技術棧,Netflix的Hystrix[附錄12.24](github 12.4k stars)把熔斷、隔離、限流和降級等能力封裝成元件,任何依賴呼叫(資料庫,服務,快取)都可以封裝在Hystrix Command之內,封裝後自動具備容錯能力。Hystrix起源於Netflix的彈性工程專案,經過Netflix大規模生產驗證,目前是容錯元件的社群標準,github上有超12k星。其它語言棧也有類似Hystrix的簡化版本元件。
Hystrix一般需要在應用端或者框架內埋點,有一定的使用門檻。對於採用集中式反向代理(邊界和內部)做服務路由的公司,則可以集中在反向代理上做熔斷限流,例如採用nginx[附錄12.25](github 5.1k stars)或者Kong[附錄12.7](github 11.4k stars)這類反向代理,它們都有外掛支援靈活的限流容錯配置。Zuul閘道器也可以整合Hystrix實現閘道器層集中式限流容錯。集中式反向代理需要有一定的研發和運維能力,但是可以對限流容錯進行集中治理,可以簡化客戶端。
八、後臺服務選型
後臺服務主要包括訊息系統,分散式快取,分散式資料訪問層和任務排程系統。後臺服務是一個相對比較成熟的領域,很多開源產品基本可以開箱即用。
訊息系統,對於日誌等可靠性要求不高的場景,則Apache頂級專案Kafka[附錄12.26](github 7.2k stars)是社群標配。對於可靠性要求較高的業務場景,kafka其實也是可以勝任,但企業需要根據具體場景,對 Kafka的監控和治理能力進行適當定製完善,Allegro公司開源的hermes[附錄12.27](github 0.3k stars)是一個可參考專案,它在Kafka基礎上封裝了適合業務場景的企業級治理能力。阿里開源的RocketMQ[附錄12.28](github 3.5k星)也是一個不錯選擇,具備更多適用於業務場景的特性,目前也是Apache頂級專案。RabbitMQ[附錄12.29](github 3.6k星)是老牌經典的MQ,佇列特性和文件都很豐富,效能和分散式能力稍弱,中小規模場景可選。
對於快取治理,如果傾向於採用客戶端直連模式(個人認為快取直連更簡單輕量),則SohuTv開源的cachecloud[附錄12.30](github 2.5k stars)是一款不錯的Redis快取治理平臺,提供諸如監控統計,一鍵開啟,自動故障轉移,線上伸縮,自動化運維等生產級治理能力,另外其文件也比較豐富。如果傾向採用中間層Proxy模式,則Twitter開源的twemproxy[附錄12.31](github 7.5k stars)和CodisLab開源的codis[附錄12.32](github 6.9k stars)是社群比較熱的選項。
對於分散式資料訪問層,如果採用Java技術棧,則噹噹開源的shardingjdbc[附錄12.33](github 3.5k stars)是一個不錯的選項,分庫分表邏輯做在客戶端jdbc driver中,客戶端直連資料庫比較簡單輕量,建議中小規模場景採用。如果傾向採用資料庫訪問中間層proxy模式,則從阿里Cobar演化出來的社群開源分庫分表中介軟體MyCAT[附錄12.34](github 3.6k stars)是一個不錯選擇 。proxy模式運維成本較高,建議中大規模場景,有一定框架自研和運維能力的團隊採用。
任務排程系統,個人推薦徐雪裡開源的xxl-job[附錄12.35](github 3.4k stars),部署簡單輕量,大部分場景夠用。噹噹開源的elastic-job[附錄12.36](github 3.2k stars)也是一個不錯選擇,相比xxl-job功能更強一些也更復雜。
九、服務安全選型
對於微服務安全認證授權機制一塊,目前業界雖然有OAuth和OpenID connect等標準協議,但是各傢俱體實現的做法都不太一樣,企業一般有很多特殊的定製需求,整個社群還沒有形成通用生產級開箱即用的產品。有一些開源授權伺服器產品,比較知名的如Apereo CAS[附錄12.37](github 3.6k stars),JBoss開源的keycloak[附錄12.38](github 1.9 stars),spring cloud security[附錄12.39]等,大都是opinionated(一家觀點和做法)的產品,同時因支援太多協議造成產品複雜,也缺乏足夠靈活性。個人建議基於OAuth和OpenID connect標準,在參考一些開源產品的基礎上(例如Mitre開源的OpenID-Connect-Java-Spring-Server[附錄12.40],github 0.62k stars),定製自研輕量級授權伺服器。Wso2提出了一種微服務安全的參考方案[附錄12.45],建議參考,該方案的關鍵步驟如下:
使用支援OAuth 2.0和OpenID Connect標準協議的授權伺服器(個人建議定製自研);
使用API閘道器作為單一訪問入口,統一實現安全治理;
客戶在訪問微服務之前,先通過授權伺服器登入獲取access token,然後將access token和請求一起傳送到閘道器;
閘道器獲取access token,通過授權伺服器校驗token,同時做token轉換獲取JWT token。
閘道器將JWT Token和請求一起轉發到後臺微服務;
JWT中可以儲存使用者會話資訊,該資訊可以傳遞給後臺的微服務,也可以在微服務之間傳遞,用作認證授權等用途;
每個微服務包含JWT客戶端,能夠解密JWT並獲取其中的使用者會話資訊。
整個方案中,access token是一種by reference token,不包含使用者資訊可以直接暴露在公網上;JWT token是一種by value token,可以包含使用者資訊但不暴露在公網上。
十、服務部署平臺選型
容器已經被社群接受為交付微服務的一種理想手段,可以實現不可變(immutable)釋出模式。一個輕量級的基於容器的服務部署平臺主要包括容器資源排程,釋出系統,映象治理,資源治理和IAM等模組。
叢集資源排程系統:遮蔽容器細節,將整個叢集抽象成容器資源池,支援按需申請和釋放容器資源,物理機發生故障時能夠實現自動故障遷移(fail over)。目前Google開源的kubernetes[附錄12.41],在Google背書和社群的強力推動下,基本已經形成市場領導者地位,github上有31.8k星,社群的活躍度已經遠遠超過了mesos[附錄12.42](github 3.5k stars)和swarm等競爭產品,所以容器資源排程建議首選k8s。當然如果你的團隊有足夠定製自研能力,想深度把控底層排程演算法,也可以基於mesos做定製自研。
映象治理:基於docker registry,封裝一些輕量級的治理功能。vmware開源的harbor[附錄12.43] (github 3.5k stars)是目前社群比較成熟的企業級產品,在docker registry基礎上擴充套件了許可權控制,審計,映象同步,管理介面等治理能力,可以考慮採用。
資源治理:類似於CMDB思路,在容器雲環境中,企業仍然需要對應用app,組織org,容器配額和數量等相關資訊進行輕量級的治理。目前這塊還沒有生產級的開源產品,一般企業需要根據自己的場景定製自研。
釋出平臺:面向使用者的釋出管理控制檯,支援釋出流程編排。它和其它子系統對接互動,實現基本的應用釋出能力,也實現如藍綠,金絲雀和灰度等高階釋出機制。目前這塊生產級的開源產品很少,Netflix開源的spinnaker[附錄12.44](github 4.2k stars)是一個,但是這個產品比較複雜重量(因為它既要支援適配對接各種CI系統,同時還要適配對接各種公有云和容器雲,使得整個系統異常複雜),一般企業建議根據自己的場景定製自研輕量級的解決方案。
IAM:是identity & access management的簡稱,對釋出平臺各個元件進行身份認證和安全訪問控制。社群有不少開源的IAM產品,比較知名的有Apereo CAS(github 3.6k stars),JBoss開源的keycloak(github 1.9 stars)等。但是這些產品一般都比較複雜重量,很多企業考慮到內部各種系統靈活對接的需求,都會考慮定製自研輕量級的解決方案。
考慮到服務部署平臺目前還沒有端到端生產級解決方案,企業一般需要定製整合,下面給出一個可以參考的具備輕量級治理能努力的釋出體系:
簡化釋出流程如下:
應用通過CI整合後生成映象,使用者將映象推到映象治理中心;
使用者在資產治理中心申請釋出,填報應用,釋出和配額相關資訊,然後等待審批通過;
釋出審批通過,開發人員通過釋出控制檯釋出應用;
釋出系統通過查詢資產治理中心獲取釋出規格資訊;
釋出系統向容器雲發出啟動容器例項指令;
容器雲從映象治理中心拉取映象並啟動容器;
容器內服務啟動後自注冊到服務註冊中心,並保持定期心跳;
使用者通過釋出系統呼叫服務註冊中心調撥流量,實現藍綠,金絲雀或灰度釋出等機制;
閘道器和內部微服務客戶端定期同步服務註冊中心上的服務路由表,將流量按負載均衡策略分發到新的服務例項上。
另外,持續交付流水線(CD Pipeline)也是微服務釋出重要環節,這塊主要和研發流程相關,一般需要企業定製,下面是一個可供參考的流水線模型,在映象治理中心上封裝一些輕量級的治理流程,例如只有通過測試環境測試的映象才能升級釋出到UAT環境,只有通過UAT環境測試的映象才能升級釋出到生產環境,通過在流水線上設定一些質量門,保障應用高質量交付到生產。
十一、寫在最後
注意,本文限於篇幅,對測試和CI等環節沒有涉及,但它們同樣是構建微服務架構的重要環節,也有眾多成熟的開源成熟產品可選。
技術選型雖然重要,但還只是微服務建設的一小部分工作,選型後的產品要在企業內部真正落地,形成完整的微服務技術棧體系,則後續還有大量整合、定製、治理、運維和推廣等工作。
本文僅限個人經驗視角,選型思路僅供參考借鑑。每個企業的具體上下文(業務場景,團隊組織,技術架構等)各不相同,每個架構師的背景經驗也各不相同,大家要結合實際自己做出選型,沒有最好的技術棧,只有相對較合適的技術棧。另外,好的技術選型是相互借鑑甚至PK出來的,歡迎大家討論,給出自己的微服務2.0技術棧選型意見。
歡迎加入我的知識星球,一起探討架構,交流原始碼。加入方式,長按下方二維碼噢:
已在知識星球更新原始碼解析如下:
如果你喜歡這篇文章,喜歡,轉發。
生活很美好,明天見(。・ω・。)ノ♡
相關文章
- SpringCloud微服務技術選型SpringGCCloud微服務
- 微服務專案搭建之技術選型微服務
- 微服務技術棧:常見註冊中心元件,對比分析微服務元件
- 微服務之架構技術選型與設計微服務架構
- Spring Cloud微服務-全棧技術與案例解析SpringCloud微服務全棧
- 投票:OAuth2.0 技術選型你會怎麼選OAuth
- 一名架構師,他要如何做微服務技術選型?架構微服務
- xhEditor技術手冊
- 微服務技術棧:API閘道器中心,落地實現方案微服務API
- 微服務技術棧:流量整形演算法,服務熔斷與降級微服務演算法
- 技術選型指南
- Blog 技術選型
- 聊聊技術選型
- 面經手冊 · 第1篇《認知自己的技術棧盲區》
- 微服務實踐手冊-服務的拆分策略微服務
- 技術選型的藝術
- 微服務技術棧簡單介紹,Eureka和Ribbon的引入和使用微服務
- 微服務架構技術棧:程式設計師必須掌握的微服務架構框架詳細解析微服務架構程式設計師框架
- 微服務下的註冊中心如何選擇微服務
- 微服務框架Demo.MicroServer執行手冊微服務框架ROSServer
- 服務發現技術選型那點事兒
- 2021雲主機選型:比拼技術和服務能力
- 微服務學習與思考(04):微服務技術體系微服務
- 關於技術的選型
- 微服務平臺技術架構微服務架構
- 微服務架構之「 容器技術 」微服務架構
- 微服務框架相關技術整理微服務框架
- 純乾貨:微服務開發手冊之GRPC微服務RPC
- Spring Boot 定時任務的技術選型對比Spring Boot
- 2-如何檢視技術手冊
- 技術選型的藝術---湖北技術價值分享會
- SpringCloud微服務治理技術入門(SCN)SpringGCCloud微服務
- 技術選型之Docker容器引擎Docker
- 【React技術棧】從零開始手寫reduxReactRedux
- dotnet core微服務框架Jimu ~ 會員註冊微服務微服務框架
- 前端技術選型及背後思考前端
- 從零搭建Spring Boot腳手架(1):開篇以及技術選型Spring Boot
- 剖析公司技術棧