大綱
? 發(fā)現(xiàn)問題:服務(wù)開發(fā)過程中的痛點(diǎn)
? 以史鑒今:從服務(wù)框架的演進(jìn)歷程中找到規(guī)律
? 大道至簡:大型微服務(wù)框架的設(shè)計(jì)要點(diǎn)
? 精雕細(xì)琢:框架關(guān)鍵實(shí)現(xiàn)細(xì)節(jié)
復(fù)雜業(yè)務(wù)開發(fā)過程中的痛點(diǎn)
痛點(diǎn)
? 時(shí)間緊、任務(wù)多、團(tuán)隊(duì)大躏惋、業(yè)務(wù)增?快另玖,如何還能保證架構(gòu)穩(wěn)定可靠彪标?
? 研發(fā)水平參差不其鸠真、項(xiàng)木壓力自顧不暇,如何保證質(zhì)量基線不被突破膘怕?
? 公司有各種?具平臺想诅、 SDK、最佳實(shí)踐岛心,如何盡可能的在業(yè)務(wù)中使用来破?
?用什么“框架”可以解決問題?
從服務(wù)框架的演進(jìn)歷程中找到規(guī)律
讓我們先來看下服務(wù)框架的進(jìn)化史
標(biāo)志性的服務(wù)框架
Web 服務(wù)框架: MVC 架構(gòu)
? ASP.Net(since 2002):傳統(tǒng) C/S 開發(fā)模式在 Web 上的應(yīng)?
? Ruby on Rails(since 2005): MVC 框架的巔峰忘古, “約定?于配置”
? Web 服務(wù)框架: SaaS 與 RESTful
? Sinatra(since 2007):純路由框架徘禁,諸多框架的靈感源泉
? 微服務(wù)框架: RPC 服務(wù)
? Thrift(since 2007):開源 IDL-based 框架的?祖
? 微服務(wù)架構(gòu):容器化與 FaaS
? Serverless(since 2015):基于云計(jì)算平臺,回歸框架本質(zhì)
? Istio(since 2018):專注于解決網(wǎng)絡(luò)問題髓堪、
服務(wù)框架的演進(jìn)趨勢
服務(wù)框架正在演變成新的“操作系統(tǒng)”
? 學(xué)習(xí)曲線: Exponential Rise(漸進(jìn)式) → Sigmoid(階躍式)
? 風(fēng)格:配置 → 約定 → DSL → 容器化
? 業(yè)務(wù)代碼與框架代碼的關(guān)系: Is-a → Has-a → Duck-typing
? 工具鏈: IDE → 代碼?成器 → 編譯器
大型微服務(wù)框架的設(shè)計(jì)要點(diǎn)
站在全局視?觀察微服務(wù)架構(gòu)
大型微服務(wù)框架的設(shè)計(jì)目標(biāo)
框架即一款面向開發(fā)人員的效率產(chǎn)品送朱,基于公司的基礎(chǔ)設(shè)施量身定制
? 目標(biāo)用戶:來不不同背景、具有基本業(yè)務(wù)研發(fā)能?的開發(fā)者
? 設(shè)計(jì)要點(diǎn):讓開發(fā)人員專注于業(yè)務(wù)開發(fā)本身干旁,無需關(guān)注滴滴各種基礎(chǔ)設(shè)施底層細(xì)節(jié)
? 設(shè)計(jì)原則:直觀驶沼、簡潔、智能疤孕、個(gè)性化
? 預(yù)期收益:提升?效商乎,降低維護(hù)成本;提升整體架構(gòu)穩(wěn)定性和可伸縮性祭阀;簡化技術(shù)升級難度
大型微服務(wù)框架的設(shè)計(jì)要點(diǎn)
完全屏蔽業(yè)務(wù)無關(guān)的通用技術(shù)細(xì)節(jié)
? 功能:服務(wù)治理、虛擬化鲜戒、水平擴(kuò)容专控、問題定位、性能壓測遏餐、系統(tǒng)監(jiān)控伦腐、兼容遺留系統(tǒng)……
? 工具鏈:項(xiàng)目模板、代碼生成器失都、文檔生成器柏蘑、發(fā)布打包腳本……
? 設(shè)計(jì)?格: Interceptors幸冻、組合模式、依賴注入……
? 讓不可靠的調(diào)?變得可靠
? RPC 調(diào)用 ≈ 函數(shù)調(diào)用
? 訪問基礎(chǔ)服務(wù) ≈ 訪問本地存儲
? 服務(wù)拆分/合并 ≈ 類拆分/合并
框架關(guān)鍵實(shí)現(xiàn)細(xì)節(jié)
業(yè)務(wù)實(shí)踐
業(yè)務(wù)背景:復(fù)雜的業(yè)務(wù)流程咳焚,快速增漲與迭代洽损,異構(gòu)服務(wù)架構(gòu),跨國多機(jī)房部署
? 核心能力
? 隔離層封裝:各種存儲革半、隊(duì)列碑定、平臺服務(wù)封裝
? 透明支持各種運(yùn)維基礎(chǔ)設(shè)施:構(gòu)建、發(fā)布又官、多機(jī)房配置延刘、 metrics
? 提供效率和測試?具:?志采集树灶、問題?動跟蹤杉女、全鏈路壓測由捎、 mock萄传、接?測試
? 應(yīng)?層協(xié)議隔離:?持 thrift/http 協(xié)議 interceptor
? 工具鏈:模板携悯、代碼?成器缔恳、依賴管理仰冠、版本管理蜕依、發(fā)布腳本
站在巨人肩膀上:滴滴基礎(chǔ)平臺建設(shè)現(xiàn)狀
? Odin:運(yùn)維平臺典勇,提供 metrics 上報(bào)劫哼、多維度監(jiān)控、報(bào)警割笙、服務(wù)樹等功能
? 把脈:日志平臺权烧,提供日志采集通道、基于 traceid 的全鏈路?志查詢能?
? DiSF:服務(wù)注冊平臺伤溉,提供高可用的服務(wù)名字服務(wù)般码、管理服務(wù)分組
? RDS:提供高可用、透明水平擴(kuò)展的 MySQL 集群乱顾,支持?jǐn)?shù)據(jù)總線板祝、分身等能力
? DDMQ:低延遲高可用的消息隊(duì)列服務(wù),單機(jī) TPS 吞吐超過百萬走净,支持延時(shí)消息
? Fusion:基于 rocksdb 的高性能高可用分布式持久化存儲方案券时,完全兼容 Redis 協(xié)議
? 彈性云:基于 k8s,高效伏伯、可伸縮的集群管理平臺橘洞,服務(wù)自動容錯(cuò),基礎(chǔ)設(shè)施免運(yùn)維
整體架構(gòu)
實(shí)現(xiàn)要點(diǎn):框架與業(yè)務(wù)正交
實(shí)現(xiàn)思路
? 傳統(tǒng)框架的 MVC说搅、 middleware炸枣、 AOP、執(zhí)行流程……都不存在也不需要
? 框架是一個(gè)執(zhí)行環(huán)境,由一堆不關(guān)聯(lián)的基礎(chǔ)庫組成高度可擴(kuò)展适肠,業(yè)務(wù)可獨(dú)立于框架運(yùn)行
如何實(shí)現(xiàn)
? 提供工具鏈霍衫,用于生成最初的項(xiàng)?模板并通過代碼生成器實(shí)現(xiàn)類似 AOP 的效果
? 基于 Go interface 的 duck-typing 特性和運(yùn)行時(shí)反射,動態(tài)生成業(yè)務(wù)路由
收益
? 業(yè)務(wù)開發(fā)?需關(guān)注框架本身侯养,
? 框架本身的升級可以做到完全透明敦跌,方便所有服務(wù)統(tǒng)一框架版本
框架的啟動邏輯
實(shí)現(xiàn)要點(diǎn):隔離層屏蔽業(yè)務(wù)與底層的聯(lián)系
如何實(shí)現(xiàn)
? 為所有基礎(chǔ)服務(wù)(mysql/redis/mq/es/...)定義 interface,業(yè)務(wù)只允許調(diào)用 interface 的方法
? 基于 SPI 設(shè)計(jì)思路沸毁,提供基礎(chǔ)服務(wù)的工廠峰髓,動態(tài)實(shí)例化對應(yīng) interface
收益
? 可透明的升級服務(wù)驅(qū)動,快速在大量服務(wù)中實(shí)現(xiàn)共性邏輯或者修復(fù)共性問題
? 透明的管理基礎(chǔ)服務(wù)的資源(長連接息尺、 mysql cursor 等)携兵,避免出現(xiàn)資源泄露
? 統(tǒng)?控制重試、超時(shí)搂誉、服務(wù)發(fā)現(xiàn)徐紧、故障摘除邏輯,業(yè)務(wù)?感知且不易出錯(cuò)炭懊,提升整體穩(wěn)定性
? 對所有基礎(chǔ)服務(wù)提供了 mock 能力并级,可以實(shí)現(xiàn) AOP 能力
案例: Redis 接口設(shè)計(jì)
實(shí)現(xiàn)要點(diǎn):協(xié)議劫持
如何實(shí)現(xiàn)
? HTTP 協(xié)議:包裝 http.Handler,用責(zé)任鏈模式處理 http.Request 和 http.ResponseWriter
? RPC 協(xié)議:劫持協(xié)議序列化流程侮腹,用FSM(有限狀態(tài)機(jī))來跟蹤序列化過程并適時(shí)修改數(shù)據(jù)
收益
? 將業(yè)務(wù)數(shù)據(jù)和服務(wù)框架數(shù)據(jù)充分隔離嘲碧,避免互相?擾
? 實(shí)現(xiàn)接口熱補(bǔ)丁和 in/out 數(shù)據(jù)錄制與重放,方便測試
? 可透明的增強(qiáng)服務(wù)能力父阻,為實(shí)現(xiàn)跨服務(wù)邊界的 context 打好基礎(chǔ)
使用FSM 劫持 thrift protocol
FSM 實(shí)現(xiàn)思路
? 利用 Go interface 特性愈涩,實(shí)現(xiàn)一個(gè) interfaceproxy,代理并劫持部分感興趣的接口
? 維護(hù)一個(gè) FSM 狀態(tài)機(jī)加矛,當(dāng) protocol read/write走到感興趣的地?時(shí)候篡改 read/write 數(shù)據(jù)
實(shí)現(xiàn)要點(diǎn):跨服務(wù)邊界的 context
如何實(shí)現(xiàn)
? 實(shí)現(xiàn)符合 context.Context 接口的自定義 context履婉,支持序列化與反序列化,支持超時(shí)控制
? 結(jié)合協(xié)議劫持斟览,透明的從服務(wù)框架數(shù)據(jù)中提取必要信息進(jìn)行反序列化毁腿,并在所有 RPC 調(diào)用前
透明的將最新 context 序列化并放在服務(wù)框架數(shù)據(jù)中傳輸給下游
? 需要重新實(shí)現(xiàn)一個(gè)基于時(shí)間片輪轉(zhuǎn)的低精度 time.Timer,提升并發(fā)效率并避免 timer 泄露
收益
? 可透明的在服務(wù)間傳遞上下文信息苛茂,從而實(shí)現(xiàn)流量染色已烤、調(diào)用跟蹤、防雪崩等功能
低精度 timer 實(shí)現(xiàn)原理
實(shí)現(xiàn)要點(diǎn):防雪崩
如何實(shí)現(xiàn)
? 通過跨服務(wù)邊界的 context 來傳遞上游超時(shí)預(yù)期味悄,并不斷記錄各個(gè)環(huán)節(jié)耗時(shí)
? 一旦框架發(fā)現(xiàn)自己的可用時(shí)間已經(jīng)耗盡草戈,主動終止后續(xù) rpc 調(diào)?并快速返回,防止請求積壓
收益
? 從根本上避免請求堆積造成的雪崩
跨服務(wù)邊界的超時(shí)時(shí)間控制
超時(shí)信息如何跨服務(wù)邊界傳遞
? 超時(shí)時(shí)間由最上游設(shè)置侍瑟,框架捕捉到超時(shí)信息并將時(shí)間記錄在 trace 里透明的傳播到下游每一個(gè)服務(wù)節(jié)點(diǎn)
? 每個(gè)節(jié)點(diǎn)從接收到請求開始后計(jì)時(shí),自動計(jì)算自己消耗的時(shí)間并計(jì)算當(dāng)前調(diào)用鏈路總耗時(shí)
? 當(dāng)鏈路總耗時(shí)超過超時(shí)時(shí)間,自動 fail-fast涨颜,快速返回失敗信息
? 利? Go context deadline 只會縮短不會提前的特性费韭,方便的用 context 管理超時(shí)
? 避免服務(wù)器之間的時(shí)鐘差異影響計(jì)時(shí),始終使用時(shí)間差來記錄號是庭瑰,而不使用絕對 deadline
業(yè)務(wù)收益
支撐規(guī)模
? 涉及開發(fā)人員近 100 人星持,上線 70+ 服務(wù),國內(nèi)外雙機(jī)房部署
? 可支撐百萬級日訂單規(guī)模弹灭、萬級并發(fā)長連接
業(yè)務(wù)收益
? 零成本:透明接?公司運(yùn)維督暂、發(fā)布、日志穷吮、壓測等平臺逻翁,支持服務(wù)注冊發(fā)現(xiàn)、彈性伸縮等能力
? 零事故:從未出現(xiàn)因?yàn)閱吸c(diǎn)故障造成的全局穩(wěn)定性事故
? 高質(zhì)量:快速實(shí)現(xiàn)全鏈路壓測常態(tài)化捡鱼,透明實(shí)現(xiàn)多環(huán)境部署八回、單測、集成測試等
? 易維護(hù):透明升級各種 driver驾诈,簡化代碼依賴管理過程
未來計(jì)劃
提升開發(fā)者體驗(yàn)
? 命令行工具缠诅,用于整合各種工具
? 進(jìn)一步與滴滴線上線下環(huán)境整合
? 整合更多的公司服務(wù)和框架
? 配置管理中?化
? 開源?
文章來源:滴滴出行 R lab 杜歡
開發(fā)這么多年也收集了一套架構(gòu)技術(shù)文檔乍迄!
里面的知識點(diǎn)有:高并發(fā)管引、分布式、高性能闯两、spring褥伴、mybatis、微服務(wù)等非常適合開發(fā)1-5年的Java開發(fā)者查閱生蚁;現(xiàn)在免費(fèi)送給各位噩翠!
關(guān)注+轉(zhuǎn)發(fā)后私信我【架構(gòu)資料】即可免費(fèi)獲取邦投!