唯品會微服務(wù)架構(gòu)演進之路
唯品會是業(yè)界在服務(wù)化走得比較徹底的一家公司,主要體現(xiàn)有兩方面,一是在徹底落地,二是純自研。從2015年開始建設(shè)至今,微服務(wù)基礎(chǔ)中臺已經(jīng)成為唯品會最為重要的技術(shù)基礎(chǔ)設(shè)施之一,在唯品會所有關(guān)鍵業(yè)務(wù)場景全面深入落地,并承載著幾乎全部用戶流量的請求處理和后端服務(wù)調(diào)用。在體系內(nèi)注冊的獨立服務(wù)數(shù)超過3000,獨立方法數(shù)萬級別,高峰時每小時承載著千億次服務(wù)調(diào)用,服務(wù)化網(wǎng)關(guān)作為流量入口承載著百萬級別QPS。
單體架構(gòu)
特點:
- 采用LAMP技術(shù)棧。
- 所有功能模塊都集成在一個應(yīng)用程序中。
- 數(shù)據(jù)庫存在單點故障風(fēng)險。
問題:
- 隨著業(yè)務(wù)增長,應(yīng)用變得復(fù)雜,維護困難。
- 數(shù)據(jù)庫負(fù)載過高,擴展性差。
垂直應(yīng)用架構(gòu)
特點:
- 將單體應(yīng)用拆分為多個獨立的垂直應(yīng)用。
- 每個應(yīng)用有獨立的數(shù)據(jù)庫。
圖片
垂直應(yīng)用架構(gòu)
特點:
- 將單體應(yīng)用拆分為多個獨立的垂直應(yīng)用。
- 每個應(yīng)用有獨立的數(shù)據(jù)庫。
問題:
- 數(shù)據(jù)一致性難以保證。
- 應(yīng)用之間的依賴關(guān)系復(fù)雜,導(dǎo)致維護成本高。
圖片
微服務(wù)架構(gòu)
特點:
- 將垂直應(yīng)用進一步拆分為更小的微服務(wù)。
- 每個微服務(wù)獨立部署,獨立數(shù)據(jù)庫。
- 通過API進行通信。
實踐:
- 訂單服務(wù)化:將訂單處理拆分為多個獨立的微服務(wù),如查詢訂單、取消訂單、退款等。
- 服務(wù)能力開放:通過API網(wǎng)關(guān)開放服務(wù)能力,構(gòu)建生態(tài)系統(tǒng)。
圖片
為什么要這么分呢?
1.分層清晰:
架構(gòu)圖按照功能層次劃分,每一層都有明確的職責(zé)和邊界,確保了系統(tǒng)的模塊化 和可維護性。
2.服務(wù)獨立:
基礎(chǔ)服務(wù)、聚合服務(wù)和流程服務(wù)之間的依賴關(guān)系明確,每個服務(wù)都可以獨立開發(fā)、部署和擴展,提升了系統(tǒng)的靈活性和可靠性。
3.復(fù)用性高:
基礎(chǔ)服務(wù)提供了最基本的業(yè)務(wù)功能,聚合服務(wù)通過調(diào)用基礎(chǔ)服務(wù)實現(xiàn)更高層次的業(yè)務(wù)功能,提高了服務(wù)的復(fù)用性,減少了重復(fù)開發(fā)工作。
4.面向用戶的聚合API服務(wù):
頂層的聚合API服務(wù)面向不同的業(yè)務(wù)線,提供統(tǒng)一的接口,方便前端應(yīng)用調(diào)用。這種設(shè)計確保了用戶操作的統(tǒng)一性和一致性。
訂單服務(wù)化
圖片
服務(wù)模塊職責(zé)明確,售前、售后、履約、定時任務(wù)和公共服務(wù)等各自獨立,避免了職責(zé)混亂,提高了系統(tǒng)的可維護性和擴展性。各個服務(wù)模塊可以獨立開發(fā)、部署和擴展,方便根據(jù)需求進行調(diào)整和優(yōu)化,提升系統(tǒng)的靈活性。定時任務(wù)和公共服務(wù)的獨立設(shè)計,使得系統(tǒng)在高并發(fā)和復(fù)雜場景下也能保持高可用性,減少了單點故障的風(fēng)險,通過分層設(shè)計,將復(fù)雜的業(yè)務(wù)邏輯分解為多個小的模塊,減少了單個模塊的負(fù)載,提高了整體系統(tǒng)的性能。各個模塊獨立管理,方便運維和監(jiān)控,可以快速定位和解決問題,提高系統(tǒng)的運維效率,通過將自營訂單服務(wù)和第三方訂單服務(wù)分開設(shè)計,支持多種業(yè)務(wù)模式,方便企業(yè)拓展不同的業(yè)務(wù)渠道。
訂單服務(wù)化和取消訂單相關(guān)服務(wù)交互
圖片
服務(wù)能力開放共建生態(tài)
圖片
微服務(wù)整體架構(gòu)
圖片
微服務(wù)架構(gòu)最佳實踐
圖片
1. 業(yè)務(wù)驅(qū)動原則
- 識別核心業(yè)務(wù)域,形成基礎(chǔ)業(yè)務(wù)能力:首先要識別和理解業(yè)務(wù)的核心部分,確保微服務(wù)的設(shè)計和實現(xiàn)是圍繞這些關(guān)鍵業(yè)務(wù)能力展開的。
- 根據(jù)業(yè)務(wù)定位、范圍、邊界進行服務(wù)的劃分:根據(jù)業(yè)務(wù)需求和功能進行合理的服務(wù)劃分,確保每個微服務(wù)有明確的邊界和職責(zé)。
- 首先關(guān)注服務(wù)的業(yè)務(wù)范圍,而不是服務(wù)的數(shù)量、粒度:重點在于服務(wù)的功能和作用,而不是追求將系統(tǒng)拆分為盡可能多的小服務(wù)。
2. 服務(wù)分層原則
- 劃分基礎(chǔ)、聚合、流程服務(wù):將服務(wù)劃分為基礎(chǔ)服務(wù)(提供基本功能)、聚合服務(wù)(組合多個基礎(chǔ)服務(wù))、流程服務(wù)(實現(xiàn)復(fù)雜業(yè)務(wù)流程)。
- 基礎(chǔ)服務(wù)貼近業(yè)務(wù)實體,提供業(yè)務(wù)的基礎(chǔ)能力:基礎(chǔ)服務(wù)直接支持業(yè)務(wù)實體,提供基本的業(yè)務(wù)操作和數(shù)據(jù)管理。
- 聚合服務(wù)聚合基本業(yè)務(wù)場景,滿足高一層業(yè)務(wù)場景并可復(fù)用:聚合服務(wù)通過組合基礎(chǔ)服務(wù),實現(xiàn)更復(fù)雜的業(yè)務(wù)功能,支持更高層次的業(yè)務(wù)需求。
- 流程服務(wù)面向復(fù)雜業(yè)務(wù)流程實現(xiàn),通過驅(qū)動多個聚合/基礎(chǔ)服務(wù)實現(xiàn)一個完整的業(yè)務(wù)流程:流程服務(wù)負(fù)責(zé)協(xié)調(diào)多個服務(wù),完成復(fù)雜的業(yè)務(wù)流程。
3. 服務(wù)松耦合原則
- 服務(wù)職責(zé)單一,一個服務(wù)聚焦在特定業(yè)務(wù)的有限范圍內(nèi),有助于敏捷開發(fā)和獨立發(fā)布:每個服務(wù)應(yīng)該有明確的職責(zé)范圍,避免職責(zé)過于寬泛,以便獨立開發(fā)和部署。
- 區(qū)分核心業(yè)務(wù)服務(wù)和非主核心業(yè)務(wù)服務(wù):核心業(yè)務(wù)服務(wù)是系統(tǒng)的關(guān)鍵部分,非主核心業(yè)務(wù)服務(wù)則是輔助性的功能。
- 區(qū)分穩(wěn)定服務(wù)和易變服務(wù):將頻繁變化的服務(wù)和穩(wěn)定的服務(wù)分開管理,減少變化對系統(tǒng)整體的影響。
- 每個服務(wù)只能訪問自己的數(shù)據(jù):服務(wù)之間通過API進行通信,避免直接訪問其他服務(wù)的數(shù)據(jù),增強系統(tǒng)的模塊化和獨立性。
4. 服務(wù)獨立部署原則
- 服務(wù)獨立部署,能夠獨立發(fā)布或取消發(fā)布:每個服務(wù)都可以獨立部署,不依賴于其他服務(wù),發(fā)布和回滾都非常靈活。
- 服務(wù)可水平擴展,并支持單獨擴展:服務(wù)能夠根據(jù)需求進行水平擴展,支持彈性伸縮。
- 實現(xiàn)持續(xù)集成和自動發(fā)布:通過持續(xù)集成和自動化工具,實現(xiàn)服務(wù)的自動化構(gòu)建、測試和部署。
- 實現(xiàn)服務(wù)的技術(shù)和業(yè)務(wù)監(jiān)控:對服務(wù)的運行狀態(tài)進行實時監(jiān)控,確保系統(tǒng)的穩(wěn)定性和性能。
5. 兼容性原則
- 接口契約先行,提供最新在線服務(wù)文檔:服務(wù)之間的接口要有明確的契約,并提供最新的文檔,確保各服務(wù)之間的兼容性。
- 服務(wù)版本管理,保證向前兼容:通過版本管理,確保新版本的服務(wù)能夠兼容舊版本,平滑過渡。