滴滴出行架構(gòu)大神分享:大型微服務(wù)框架設(shè)計(jì)實(shí)踐

大綱

? 發(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)獲取邦投!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末伤锚,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子志衣,更是在濱河造成了極大的恐慌屯援,老刑警劉巖,帶你破解...
    沈念sama閱讀 210,978評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件念脯,死亡現(xiàn)場離奇詭異狞洋,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)绿店,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,954評論 2 384
  • 文/潘曉璐 我一進(jìn)店門吉懊,熙熙樓的掌柜王于貴愁眉苦臉地迎上來庐橙,“玉大人,你說我怎么就攤上這事借嗽√睿” “怎么了?”我有些...
    開封第一講書人閱讀 156,623評論 0 345
  • 文/不壞的土叔 我叫張陵恶导,是天一觀的道長浆竭。 經(jīng)常有香客問我,道長惨寿,這世上最難降的妖魔是什么邦泄? 我笑而不...
    開封第一講書人閱讀 56,324評論 1 282
  • 正文 為了忘掉前任,我火速辦了婚禮裂垦,結(jié)果婚禮上顺囊,老公的妹妹穿的比我還像新娘。我一直安慰自己缸废,他們只是感情好包蓝,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,390評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著企量,像睡著了一般测萎。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上届巩,一...
    開封第一講書人閱讀 49,741評論 1 289
  • 那天硅瞧,我揣著相機(jī)與錄音,去河邊找鬼恕汇。 笑死腕唧,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的瘾英。 我是一名探鬼主播枣接,決...
    沈念sama閱讀 38,892評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼缺谴!你這毒婦竟也來了但惶?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,655評論 0 266
  • 序言:老撾萬榮一對情侶失蹤湿蛔,失蹤者是張志新(化名)和其女友劉穎膀曾,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體阳啥,經(jīng)...
    沈念sama閱讀 44,104評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡添谊,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了察迟。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片斩狱。...
    茶點(diǎn)故事閱讀 38,569評論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡耳高,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出喊废,到底是詐尸還是另有隱情祝高,我是刑警寧澤栗弟,帶...
    沈念sama閱讀 34,254評論 4 328
  • 正文 年R本政府宣布污筷,位于F島的核電站,受9級特大地震影響乍赫,放射性物質(zhì)發(fā)生泄漏瓣蛀。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,834評論 3 312
  • 文/蒙蒙 一雷厂、第九天 我趴在偏房一處隱蔽的房頂上張望惋增。 院中可真熱鬧,春花似錦改鲫、人聲如沸诈皿。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,725評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽稽亏。三九已至,卻和暖如春缕题,著一層夾襖步出監(jiān)牢的瞬間截歉,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,950評論 1 264
  • 我被黑心中介騙來泰國打工烟零, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留瘪松,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,260評論 2 360
  • 正文 我出身青樓锨阿,卻偏偏與公主長得像宵睦,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子墅诡,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,446評論 2 348