插: 前些天發(fā)現(xiàn)了一個(gè)巨牛的人工智能學(xué)習(xí)網(wǎng)站凫岖,通俗易懂汪疮,風(fēng)趣幽默门岔,忍不住分享一下給大家烂叔。點(diǎn)擊跳轉(zhuǎn)到網(wǎng)站。
堅(jiān)持不懈固歪,越努力越幸運(yùn)蒜鸡,大家一起學(xué)習(xí)鴨~~~
以下文章來源于美團(tuán)技術(shù)團(tuán)隊(duì) ,作者充澤 志洋 李敏
美團(tuán)技術(shù)團(tuán)隊(duì)
10000+工程師牢裳,如何支撐中國(guó)領(lǐng)先的生活服務(wù)電子商務(wù)平臺(tái)逢防?數(shù)億消費(fèi)者、數(shù)百萬商戶蒲讯、2000多個(gè)行業(yè)忘朝、幾千億交易額背后是哪些技術(shù)在支撐?這里是美團(tuán)判帮、大眾點(diǎn)評(píng)局嘁、美團(tuán)外賣、美團(tuán)配送晦墙、美團(tuán)優(yōu)選等技術(shù)團(tuán)隊(duì)的對(duì)外窗口悦昵。
總第450篇
2021年 第020篇
在微服務(wù)架構(gòu)下,服務(wù)拆分會(huì)讓API的規(guī)模成倍增長(zhǎng)晌畅,使用API網(wǎng)關(guān)來管理API逐漸成為一種趨勢(shì)但指。美團(tuán)統(tǒng)一API網(wǎng)關(guān)服務(wù)Shepherd就是在這種背景下應(yīng)運(yùn)而生,適用于美團(tuán)業(yè)務(wù)且完全自研抗楔,用于替換傳統(tǒng)的Web層網(wǎng)關(guān)應(yīng)用棋凳,業(yè)務(wù)研發(fā)人員通過配置的方式即可對(duì)外開放功能和數(shù)據(jù)。本文將介紹美團(tuán)統(tǒng)一API網(wǎng)關(guān)誕生的背景连躏、關(guān)鍵的技術(shù)設(shè)計(jì)和實(shí)現(xiàn)剩岳,以及API網(wǎng)關(guān)未來的規(guī)劃,希望能給大家?guī)硪恍椭蛘邌l(fā)入热。
一拍棕、背景介紹
1.1 API網(wǎng)關(guān)是什么疲迂?
1.2 為什么要做Shepherd API網(wǎng)關(guān)?
1.3 使用Shepherd帶來的收益是什么莫湘?
二尤蒿、技術(shù)設(shè)計(jì)與實(shí)現(xiàn)
2.1 整體架構(gòu)
2.2 高可用設(shè)計(jì)
2.3 易用性設(shè)計(jì)
2.4 可擴(kuò)展性設(shè)計(jì)
三、未來規(guī)劃
3.1 云原生架構(gòu)演進(jìn)
3.2 靜態(tài)網(wǎng)站托管
3.3 組件市場(chǎng)
作者簡(jiǎn)介
招聘信息
一幅垮、背景
1.1 API網(wǎng)關(guān)是什么腰池?
API網(wǎng)關(guān)是隨著微服務(wù)(Microservice)概念興起的一種架構(gòu)模式。原本一個(gè)龐大的單體應(yīng)用(All in one)業(yè)務(wù)系統(tǒng)被拆分成許多微服務(wù)(Microservice)系統(tǒng)進(jìn)行獨(dú)立的維護(hù)和部署忙芒,服務(wù)拆分帶來的變化是API的規(guī)模成倍增長(zhǎng)示弓,API的管理難度也在日益增加,使用API網(wǎng)關(guān)發(fā)布和管理API逐漸成為一種趨勢(shì)呵萨。一般來說奏属,API網(wǎng)關(guān)是運(yùn)行于外部請(qǐng)求與內(nèi)部服務(wù)之間的一個(gè)流量入口,實(shí)現(xiàn)對(duì)外部請(qǐng)求的協(xié)議轉(zhuǎn)換潮峦、鑒權(quán)囱皿、流控、參數(shù)校驗(yàn)忱嘹、監(jiān)控等通用功能嘱腥。
1.2 為什么要做Shepherd API網(wǎng)關(guān)?
在沒有Shepherd API網(wǎng)關(guān)之前拘悦,美團(tuán)業(yè)務(wù)研發(fā)人員如果要將內(nèi)部服務(wù)輸出為對(duì)外的HTTP API接口齿兔。通常要搭建一個(gè)Web應(yīng)用,用于完成基礎(chǔ)的鑒權(quán)础米、限流分苇、監(jiān)控日志、參數(shù)校驗(yàn)屁桑、協(xié)議轉(zhuǎn)換等工作医寿,同時(shí)需要維護(hù)代碼邏輯、基礎(chǔ)組件的升級(jí)掏颊,研發(fā)效率相對(duì)比較低糟红。此外,每個(gè)Web應(yīng)用都需要維護(hù)機(jī)器乌叶、配置、數(shù)據(jù)庫(kù)等柒爸,資源利用率也非常差准浴。
美團(tuán)內(nèi)部一些業(yè)務(wù)線苦于沒有現(xiàn)成的解決方案,根據(jù)自身業(yè)務(wù)特點(diǎn)捎稚,研發(fā)了業(yè)務(wù)相關(guān)的API網(wǎng)關(guān)乐横。放眼業(yè)界求橄,亞馬遜、阿里巴巴葡公、騰訊等公司也都有成熟的API網(wǎng)關(guān)解決方案罐农。
因此,Shepherd API網(wǎng)關(guān)項(xiàng)目正式立項(xiàng)催什,我們目標(biāo)是為美團(tuán)提供高性能涵亏、高可用、可擴(kuò)展的統(tǒng)一API網(wǎng)關(guān)解決方案蒲凶,讓業(yè)務(wù)研發(fā)人員通過配置的方式即可對(duì)外開放功能和數(shù)據(jù)气筋。
圖 1
1.3 使用Shepherd帶來的收益是什么?
從業(yè)務(wù)研發(fā)人員的角度來看旋圆,接入Shepherd API網(wǎng)關(guān)宠默,能帶來哪些收益呢?簡(jiǎn)而言之包括三個(gè)方面灵巧。
提升研發(fā)效率
業(yè)務(wù)研發(fā)人員只需要通過配置的方式即可快速開放服務(wù)接口搀矫。
Shepherd統(tǒng)一提供鑒權(quán)、限流刻肄、熔斷等非業(yè)務(wù)基礎(chǔ)能力艾君。
Shepherd支持業(yè)務(wù)研發(fā)人員通過開發(fā)自定義組件的方式擴(kuò)展API網(wǎng)關(guān)能力。
降低溝通成本
業(yè)務(wù)研發(fā)人員配置好API肄方,可以自動(dòng)生成API的前后端交互文檔和客戶端SDK冰垄,方便前后端開發(fā)人員進(jìn)行交互、聯(lián)調(diào)权她。
提升資源利用率
基于Serverless的架構(gòu)思想虹茶,實(shí)現(xiàn)API全托管,業(yè)務(wù)研發(fā)人員無需關(guān)心機(jī)器資源問題隅要。
二蝴罪、技術(shù)設(shè)計(jì)與實(shí)現(xiàn)
2.1 整體架構(gòu)
我們先來看看Shepherd API網(wǎng)關(guān)的整體架構(gòu),如下圖所示:
圖 2
Shepherd API網(wǎng)關(guān)的控制面由Shepherd管理平臺(tái)和Shepherd監(jiān)控中心組成步清。管理平臺(tái)主要完成API的全生命周期管理以及配置下發(fā)的工作要门,監(jiān)控中心完成API請(qǐng)求監(jiān)控?cái)?shù)據(jù)的收集和業(yè)務(wù)告警功能。
Shepherd API網(wǎng)關(guān)的配置中心主要完成控制面與數(shù)據(jù)面的信息交互廓啊,通過美團(tuán)統(tǒng)一配置服務(wù)Lion來實(shí)現(xiàn)欢搜。
Shepherd API網(wǎng)關(guān)的數(shù)據(jù)面也就是Shepherd 服務(wù)端。一次完整的API請(qǐng)求谴轮,可能是從移動(dòng)應(yīng)用炒瘟、Web應(yīng)用,合作伙伴或內(nèi)部系統(tǒng)發(fā)起第步,經(jīng)過Nginx負(fù)載均衡系統(tǒng)后疮装,到達(dá)服務(wù)端缘琅。服務(wù)端集成了一系列的基礎(chǔ)功能組件和業(yè)務(wù)自定義組件,通過泛化調(diào)用請(qǐng)求后端RPC服務(wù)廓推、HTTP服務(wù)刷袍、函數(shù)服務(wù)或服務(wù)編排服務(wù),最后返回響應(yīng)結(jié)果樊展。
下面我們將針對(duì)這三個(gè)主要模塊做詳細(xì)的介紹呻纹。
2.1.1 控制面
使用API網(wǎng)關(guān)的控制面,業(yè)務(wù)研發(fā)人員可以輕松的完成API的全生命周期管理滚局,如下圖所示:
圖 3
業(yè)務(wù)研發(fā)人員從創(chuàng)建API開始居暖,完成參數(shù)錄入、DSL腳本生成藤肢;接著可以通過文檔和MOCK功能進(jìn)行API測(cè)試太闺;API測(cè)試完成后,為了保證上線穩(wěn)定性嘁圈,Shepherd管理平臺(tái)提供了發(fā)布審批省骂、灰度上線、版本回滾等一系列安全保證措施最住;API運(yùn)行期間會(huì)監(jiān)控API的調(diào)用失敗情況钞澳、記錄請(qǐng)求日志,一旦發(fā)現(xiàn)異常及時(shí)發(fā)出告警涨缚;最后轧粟,對(duì)于不再使用的API進(jìn)行下線操作后,會(huì)回收API所占用的各類資源并等待重新啟用脓魏。
整個(gè)生命周期兰吟,全部通過配置化、流程化的方式茂翔,由業(yè)務(wù)研發(fā)人員全自助管理混蔼,上手時(shí)間基本在10分鐘以內(nèi),極大地提升了研發(fā)效率珊燎。
2.1.2 配置中心
API網(wǎng)關(guān)的配置中心存放API的相關(guān)配置信息——使用自定義的DSL(Domain-Specific Language惭嚣,領(lǐng)域?qū)S谜Z言)來描述,用于向API網(wǎng)關(guān)的數(shù)據(jù)面下發(fā)API的路由悔政、規(guī)則晚吞、組件等配置變更。
配置中心的設(shè)計(jì)上使用統(tǒng)一配置管理服務(wù)Lion和本地緩存結(jié)合的方式卓箫,實(shí)現(xiàn)動(dòng)態(tài)配置载矿,不停機(jī)發(fā)布。API的配置如下圖所示:
圖 4
API配置的詳細(xì)說明:
- Name烹卒、Group:名字闷盔、所屬分組。
- Request:請(qǐng)求的域名旅急、路徑逢勾、參數(shù)等信息。
- Response:響應(yīng)的結(jié)果組裝藐吮、異常處理溺拱、Header、Cookies信息谣辞。
- Filters迫摔、FilterConfigs:API使用到的功能組件和配置信息。
- Invokers:后端服務(wù)(RPC/HTTP/Function)的請(qǐng)求規(guī)則和編排信息泥从。
2.1.3 數(shù)據(jù)面
API路由
API網(wǎng)關(guān)的數(shù)據(jù)面在感知到API配置后句占,會(huì)在內(nèi)存中建立請(qǐng)求路徑與API配置的路由信息。通常HTTP請(qǐng)求路徑上躯嫉,會(huì)包含一些路徑變量纱烘,考慮到性能問題,Shepherd沒有采用正則匹配的方式祈餐,而是設(shè)計(jì)了兩種數(shù)據(jù)結(jié)構(gòu)來存儲(chǔ)擂啥。如下圖所示:
圖 5
一種是不包含路徑變量的直接映射的MAP結(jié)構(gòu)。其中帆阳,Key就是完整的域名和路徑信息哺壶,Value是具體的API配置。
另外一種是包含路徑變量的前綴樹數(shù)據(jù)結(jié)構(gòu)蜒谤。通過前綴匹配的方式山宾,先進(jìn)行葉子節(jié)點(diǎn)精確查找,并將查找節(jié)點(diǎn)入棧處理芭逝,如果匹配不上塌碌,則將棧頂節(jié)點(diǎn)出棧,再將同級(jí)的變量節(jié)點(diǎn)入棧旬盯,如果仍然找不到台妆,則繼續(xù)回溯,直到找到(或沒找到)路徑節(jié)點(diǎn)并退出胖翰。
功能組件
當(dāng)請(qǐng)求流量命中API請(qǐng)求路徑進(jìn)入服務(wù)端接剩,具體處理邏輯由DSL中配置的一系列功能組件完成。網(wǎng)關(guān)提供了豐富的功能組件集成萨咳,包括鏈路追蹤懊缺、實(shí)時(shí)監(jiān)控、訪問日志、參數(shù)校驗(yàn)鹃两、鑒權(quán)遗座、限流、熔斷降級(jí)俊扳、灰度分流等途蒋,如下圖所示:
圖 6
協(xié)議轉(zhuǎn)換&服務(wù)調(diào)用
API調(diào)用的最后一步,就是協(xié)議轉(zhuǎn)換以及服務(wù)調(diào)用了馋记。網(wǎng)關(guān)需要完成的工作包括:獲取HTTP請(qǐng)求參數(shù)号坡、Context本地參數(shù),拼裝后端服務(wù)參數(shù)梯醒,完成HTTP協(xié)議到后端服務(wù)的協(xié)議轉(zhuǎn)換宽堆,調(diào)用后端服務(wù)獲取響應(yīng)結(jié)果并轉(zhuǎn)換為HTTP響應(yīng)結(jié)果。
圖 7
上圖以調(diào)用后端RPC服務(wù)為例茸习,通過JsonPath表達(dá)式獲取HTTP請(qǐng)求不同部位的參數(shù)值畜隶,替換RPC請(qǐng)求參數(shù)相應(yīng)部位的Value,生成服務(wù)參數(shù)DSL逮光,最后借助RPC泛化調(diào)用完成本次服務(wù)調(diào)用代箭。
2.2 高可用設(shè)計(jì)
Shepherd API網(wǎng)關(guān)作為接入層的基礎(chǔ)組件,高可用性一直是業(yè)務(wù)研發(fā)人員非常關(guān)心的部分涕刚。接下來嗡综,我們就來探索一下Shepherd在高可用設(shè)計(jì)方面的實(shí)踐。
2.2.1 排除性能隱患
一個(gè)高可用的系統(tǒng)杜漠,預(yù)防故障的發(fā)生极景,首先要排除性能隱患,保證高性能驾茴。
Shepherd對(duì)API請(qǐng)求做了全異步化處理盼樟,請(qǐng)求通過Jetty IO線程異步提交到業(yè)務(wù)處理線程池,調(diào)用后端服務(wù)使用RPC或HTTP框架的異步方式锈至,釋放了由于網(wǎng)絡(luò)等待引起的線程占用晨缴,使線程數(shù)不再成為網(wǎng)關(guān)的瓶頸。下圖是使用Jetty容器時(shí)峡捡,服務(wù)端的請(qǐng)求線程處理邏輯:
圖 8
我們通過域名壓測(cè)網(wǎng)關(guān)單機(jī)的端到端QPS击碗,發(fā)現(xiàn)QPS在超過2000時(shí),會(huì)出現(xiàn)很多超時(shí)錯(cuò)誤们拙,而網(wǎng)關(guān)的服務(wù)端負(fù)載與性能卻非常富余稍途。調(diào)研發(fā)現(xiàn),公司內(nèi)其他的Web應(yīng)用都存在這個(gè)問題砚婆,與Oceanus團(tuán)隊(duì)進(jìn)行聯(lián)合排查后械拍,發(fā)現(xiàn)是Nginx與Web應(yīng)用之間的長(zhǎng)連接功能沒有打開,且無法配置。Oceanus團(tuán)隊(duì)經(jīng)過緊急排期坷虑,研發(fā)并上線長(zhǎng)連接功能后甲馋,Shepherd端到端的QPS成功提升到了10000以上。
另外猖吴,我們對(duì)Shepherd服務(wù)端進(jìn)行了API請(qǐng)求預(yù)熱的優(yōu)化摔刁,使得網(wǎng)關(guān)啟動(dòng)時(shí)能立刻達(dá)到最佳性能挥转,減少毛刺的發(fā)生海蔽。然后,通過壓測(cè)時(shí)的CPU熱點(diǎn)排查绑谣,將性能瓶頸找出党窜,減少主鏈路上的本地日志打印,對(duì)請(qǐng)求日志進(jìn)行異步化借宵、遠(yuǎn)程化改造幌衣。Shepherd端到端的QPS再次提升30%以上。
在Shepherd服務(wù)上線穩(wěn)定運(yùn)行一年以后壤玫,我們?cè)俅螌?duì)性能進(jìn)行優(yōu)化豁护,并且做了一次網(wǎng)絡(luò)框架升級(jí),將Jetty容器全面替換為Netty網(wǎng)絡(luò)框架欲间,性能提升10%以上楚里,Shepherd端到端的QPS成功提升到15000以上。下圖是使用Netty框架時(shí)猎贴,服務(wù)端的請(qǐng)求線程處理邏輯:
圖 9
2.2.2 服務(wù)隔離
集群隔離
借鑒公司緩存班缎、任務(wù)調(diào)度等成熟組件的經(jīng)驗(yàn),Shepherd在設(shè)計(jì)之初她渴,就考慮了按業(yè)務(wù)線維度進(jìn)行集群隔離达址,也支持重要業(yè)務(wù)獨(dú)立部署。如下圖所示:
圖10
請(qǐng)求隔離
服務(wù)節(jié)點(diǎn)維度趁耗,Shepherd支持請(qǐng)求的快慢線程池隔離沉唠。快慢線程池隔離主要用于一些使用了同步阻塞組件的API苛败,例如SSO鑒權(quán)满葛、自定義鑒權(quán)等改备,可能導(dǎo)致長(zhǎng)時(shí)間阻塞共享業(yè)務(wù)線程池香嗓。
快慢隔離的原理是統(tǒng)計(jì)API請(qǐng)求的處理時(shí)間,將請(qǐng)求處理耗時(shí)較長(zhǎng)棍矛,超過容忍閾值的API請(qǐng)求隔離到慢線程池儡遮,避免影響其他正常API的調(diào)用乳蛾。
除此之外,Shepherd也支持業(yè)務(wù)研發(fā)人員配置自定義線程池進(jìn)行隔離。具體的線程隔離模型如下圖所示:
圖 11
2.2.3 穩(wěn)定性保障
Shepherd提供了一些常規(guī)的穩(wěn)定性保障手段肃叶,來保證自身和后端服務(wù)的可用性蹂随。如下圖所示:
圖12
- 流量管控:從用戶自定義UUID限流、App限流因惭、IP限流岳锁、集群限流等多個(gè)維度提供流量保護(hù)。
- 請(qǐng)求緩存:對(duì)于一些冪等的蹦魔、查詢頻繁的激率、數(shù)據(jù)及時(shí)性不敏感的請(qǐng)求,業(yè)務(wù)研發(fā)人員可開啟請(qǐng)求緩存功能勿决。
- 超時(shí)管理:每個(gè)API都設(shè)置了處理超時(shí)時(shí)間乒躺,對(duì)于超時(shí)的請(qǐng)求,進(jìn)行快速失敗的處理低缩,避免資源占用嘉冒。
- 熔斷降級(jí):支持熔斷降級(jí)功能,實(shí)時(shí)監(jiān)控請(qǐng)求的統(tǒng)計(jì)信息咆繁,達(dá)到配置的失敗閾值后讳推,自動(dòng)熔斷,返回默認(rèn)值玩般。
2.2.4 請(qǐng)求安全
請(qǐng)求安全是API網(wǎng)關(guān)非常重要的能力银觅,Shepherd集成了豐富的安全相關(guān)的系統(tǒng)組件,包括有基礎(chǔ)的請(qǐng)求簽名壤短、SSO單點(diǎn)登錄设拟、基于SSO鑒權(quán)的UAC/UPM訪問控制、用戶鑒權(quán)Passport久脯、商家鑒權(quán)EPassport纳胧、商家權(quán)益鑒權(quán)、反爬等等帘撰。業(yè)務(wù)研發(fā)人員只需要簡(jiǎn)單配置跑慕,即可使用。
2.2.5 可灰度
API網(wǎng)關(guān)作為請(qǐng)求入口摧找,往往肩負(fù)著請(qǐng)求流量灰度驗(yàn)證的重任核行。
灰度場(chǎng)景
Shepherd在灰度能力上,支持灰度API自身邏輯蹬耘,也支持灰度下游服務(wù)芝雪,也可以同時(shí)灰度API自身邏輯和下游服務(wù)。如下圖所示:
圖 13
灰度API自身邏輯時(shí)综苔,通過將流量分流到不同的API版本實(shí)現(xiàn)灰度能力惩系;灰度下游服務(wù)時(shí)位岔,通過給流量打標(biāo),分流到指定的下游灰度單元中堡牡。
灰度策略
Shepherd支持豐富的灰度策略抒抬,可以按照比例數(shù)灰度,也可以按照特定條件灰度晤柄。
2.2.6 監(jiān)控告警
立體化監(jiān)控
Shepherd提供360度的立體化監(jiān)控擦剑,從業(yè)務(wù)指標(biāo)、機(jī)器指標(biāo)芥颈、JVM指標(biāo)提供7x24小時(shí)的專業(yè)守護(hù)惠勒,如下表:
多維度告警
有了全面的監(jiān)控體系,自然少不了配套的告警機(jī)制浇借,主要的告警能力包括:
2.2.7 故障自愈
Shepherd服務(wù)端接入了彈性伸縮模塊捉撮,可根據(jù)CPU等指標(biāo)進(jìn)行快速擴(kuò)容、縮容妇垢。除此之外,還支持快速摘除問題節(jié)點(diǎn)肉康,以及更細(xì)粒度的問題組件摘除闯估。
圖 14
2.2.8 可遷移
對(duì)于一些已經(jīng)在對(duì)外提供API的Web服務(wù),業(yè)務(wù)研發(fā)人員為了減少運(yùn)維成本和后續(xù)的研發(fā)提效吼和,考慮將其遷移到Shepherd API網(wǎng)關(guān)涨薪。
對(duì)于一些非核心API,可以考慮使用Oceanus的灰度發(fā)布功能直接遷移炫乓。但是對(duì)于一些核心API刚夺,上面的灰度發(fā)布功能是機(jī)器級(jí)別的,粒度較大末捣,不夠靈活侠姑,不能很好的支持灰度驗(yàn)證過程。
解決方案
Shepherd為業(yè)務(wù)研發(fā)人員提供了一個(gè)灰度SDK箩做,接入SDK的Web服務(wù)莽红,可在識(shí)別灰度流量后轉(zhuǎn)發(fā)到Shepherd API網(wǎng)關(guān)進(jìn)行驗(yàn)證。
灰度哪些API邦邦、灰度百分比可以在Shepherd管理端動(dòng)態(tài)調(diào)節(jié)安吁,實(shí)時(shí)生效,業(yè)務(wù)研發(fā)人員還可以通過SPI的方式自定義灰度策略燃辖」淼辏灰度驗(yàn)證通過后,再把API遷移到Shepherd API網(wǎng)關(guān)黔龟,保障遷移過程的穩(wěn)定性妇智。
灰度過程
灰度前:在Shepherd管理平臺(tái)創(chuàng)建API分組确沸,域名配置為目前使用的域名。在Oceanus上俘陷,原域名規(guī)則不變罗捎。
圖 15
灰度中:在Shepherd管理平臺(tái)開啟灰度功能,灰度SDK將灰度流量轉(zhuǎn)發(fā)到網(wǎng)關(guān)服務(wù)拉盾,進(jìn)行驗(yàn)證桨菜。
圖 16
灰度后:通過灰度流量驗(yàn)證Shepherd上的API配置符合預(yù)期后再遷移。
圖 17
2.3 易用性設(shè)計(jì)
Shepherd API網(wǎng)關(guān)的功能強(qiáng)大且復(fù)雜捉偏,易用性對(duì)業(yè)務(wù)研發(fā)人員來說至關(guān)重要倒得。我們著重來看下自動(dòng)生成DSL、API操作提效的解決方案夭禽。
2.3.1 自動(dòng)生成DSL
業(yè)務(wù)研發(fā)人員在實(shí)際使用網(wǎng)關(guān)管理平臺(tái)時(shí)霞掺,我們盡量通過圖形化的頁(yè)面配置來減輕DSL的編寫負(fù)擔(dān)。但服務(wù)參數(shù)轉(zhuǎn)換的DSL配置讹躯,仍然需要業(yè)務(wù)研發(fā)人員手工編寫菩彬。一般來說,生成服務(wù)參數(shù)DSL的流程是:
- 引入服務(wù)的接口包依賴潮梯。
- 拿到服務(wù)參數(shù)類定義。
- 編寫Testcase生成JSON模板。
- 填寫參數(shù)映射規(guī)則。
- 最后手工錄入管理平臺(tái)馆揉,發(fā)布API。
整個(gè)過程非常繁瑣,且容易出錯(cuò)沥割。如果需要錄入的API多達(dá)幾十上百個(gè)椒拗,全部由業(yè)務(wù)研發(fā)人員手工錄入的效率是非常低下的堵未。
解決方案
那么能不能將服務(wù)參數(shù)DSL的生成過程給自動(dòng)化呢拙徽?答案是可以的岛心,業(yè)務(wù)RD只需在網(wǎng)關(guān)錄入API文檔信息髓堪,然后錄入服務(wù)的Appkey炮沐、服務(wù)名轻要、方法名信息柏蘑,Shepherd管理端會(huì)從最新發(fā)布的服務(wù)框架控制臺(tái)獲取到服務(wù)參數(shù)的JSON Schema信息碑定,JSON Schema定義了服務(wù)參數(shù)的類型和結(jié)構(gòu)信息碘赖,管理端可根據(jù)這些信息,自動(dòng)生成服務(wù)參數(shù)的JSON Mock數(shù)據(jù)外构。
結(jié)合API文檔的信息普泡,自動(dòng)替換參數(shù)名相同的Value值。這套DSL自動(dòng)生成方案审编,使用過程中對(duì)業(yè)務(wù)透明撼班、標(biāo)準(zhǔn)化,業(yè)務(wù)方只需升級(jí)最新版本服務(wù)框架即可使用垒酬,極大提升研發(fā)效率砰嘁,目前受到業(yè)務(wù)研發(fā)人員的廣泛好評(píng)。
圖 18
2.3.2 API操作提效
快速創(chuàng)建API
API網(wǎng)關(guān)的核心能力是建立在API配置的基礎(chǔ)上的勘究,但提供強(qiáng)大功能的同時(shí)帶來了較高的復(fù)雜性矮湘,不少業(yè)務(wù)研發(fā)人員吐槽API配置太繁瑣,學(xué)習(xí)成本高乱顾“遄#快速創(chuàng)建API的功能應(yīng)運(yùn)而生,業(yè)務(wù)研發(fā)人員只需要提供少量的信息就可以創(chuàng)建API走净∪保快速創(chuàng)建API的功能當(dāng)前分為4種類型(后端RPC服務(wù)API孤里、后端HTTP服務(wù)API、SSO CallBack API橘洞、Nest API)捌袜,未來會(huì)根據(jù)業(yè)務(wù)應(yīng)用場(chǎng)景的不同,提供更多的快速創(chuàng)建API類型炸枣。
批量操作
業(yè)務(wù)研發(fā)人員在API網(wǎng)關(guān)上虏等,需要管理非常多的業(yè)務(wù)分組,每個(gè)業(yè)務(wù)分組适肠,最多可以有200個(gè)API配置霍衫,多個(gè)API可能有很多相同的配置,如組件配置侯养,錯(cuò)誤碼配置和跨域配置的敦跌。每個(gè)API對(duì)于相同的配置都要配置一遍,操作重復(fù)度很高逛揩。因此Shepherd支持批量操作多個(gè)API:勾選多個(gè)API后柠傍,通過【批量操作】功能可一次性完成多個(gè)API配置更新,降低業(yè)務(wù)重復(fù)配置的操作成本辩稽。
API導(dǎo)入導(dǎo)出
Shepherd提供在不同研發(fā)環(huán)境相互導(dǎo)入導(dǎo)出API的能力惧笛,業(yè)務(wù)研發(fā)人員在線下測(cè)試完成后,只需要使用API導(dǎo)入導(dǎo)出功能逞泄,即可將配置導(dǎo)出到線上生產(chǎn)環(huán)境患整,避免重復(fù)配置。
2.4 可擴(kuò)展性設(shè)計(jì)
一個(gè)設(shè)計(jì)良好的基礎(chǔ)組件喷众,除了能提供強(qiáng)大的基礎(chǔ)能力并级,還需要有良好的擴(kuò)展能力。Shepherd的可擴(kuò)展性主要體現(xiàn)在:支持自定義組件侮腹、服務(wù)編排的能力。
2.4.1 自定義組件
Shepherd提供了豐富的系統(tǒng)組件完成鑒權(quán)稻励、限流父阻、監(jiān)控能力,能夠滿足大部分的業(yè)務(wù)需求望抽。但仍有一些特殊的業(yè)務(wù)需求加矛,如自定義驗(yàn)簽、自定義結(jié)果處理等煤篙。Shepherd通過提供加載自定義組件能力斟览,支持業(yè)務(wù)完成一些自定義邏輯的擴(kuò)展。
下圖是自定義組件實(shí)現(xiàn)的一個(gè)實(shí)例辑奈。getName中填寫自定義組件申請(qǐng)時(shí)的名稱苛茂,invoke方法中實(shí)現(xiàn)自定義組件的業(yè)務(wù)邏輯已烤,如繼續(xù)執(zhí)行、進(jìn)行頁(yè)面跳轉(zhuǎn)妓羊、直接返回結(jié)果胯究、拋出異常等。
圖 19
目前Shepherd通過自定義組件已經(jīng)成功支持了美團(tuán)優(yōu)選躁绸、外賣裕循、餐飲、打車等重要業(yè)務(wù)净刮,接入的自定義組件數(shù)量有200多個(gè)剥哑。
2.4.2 服務(wù)編排
一般情況下,網(wǎng)關(guān)上配置的一個(gè)API對(duì)應(yīng)后端一個(gè)RPC或者HTTP服務(wù)淹父。如果調(diào)用端有聚合和編排后端服務(wù)的需求株婴,那么有多少后端服務(wù),就必須發(fā)起多少次HTTP的請(qǐng)求調(diào)用弹灭。由此就會(huì)帶來一些問題督暂,調(diào)用端的HTTP請(qǐng)求次數(shù)過多,效率低穷吮,在調(diào)用端聚合服務(wù)的邏輯過重逻翁。
服務(wù)編排的需求應(yīng)運(yùn)而生,服務(wù)編排是對(duì)既有服務(wù)進(jìn)行編排調(diào)用捡鱼,同時(shí)對(duì)獲取的數(shù)據(jù)進(jìn)行處理八回。主要應(yīng)用在數(shù)據(jù)聚合場(chǎng)景:一次HTTP請(qǐng)求返回的數(shù)據(jù)需要調(diào)用多個(gè)或多次服務(wù)(RPC或HTTP)才能獲取到完整的結(jié)果。
經(jīng)過前期調(diào)研驾诈,公司已經(jīng)有一套成熟的服務(wù)編排框架缠诅,由客服團(tuán)隊(duì)開發(fā)的海盜組件(參見《海盜中間件:美團(tuán)服務(wù)體驗(yàn)平臺(tái)對(duì)接業(yè)務(wù)數(shù)據(jù)的最佳實(shí)踐》一文)也是美團(tuán)公司內(nèi)部的公共服務(wù)。
因此我們與海盜團(tuán)隊(duì)合作乍迄,設(shè)計(jì)了Shepherd的服務(wù)編排支持方案管引。海盜通過獨(dú)立部署的方式提供服務(wù)編排能力,Shepherd與海盜之間通過RPC進(jìn)行調(diào)用闯两。這樣可以解耦Shepherd與海盜褥伴,避免因服務(wù)編排能力影響集群上的其他服務(wù),同時(shí)多一次RPC調(diào)用并不會(huì)有明顯耗時(shí)增加漾狼。使用上對(duì)業(yè)務(wù)研發(fā)人員也是透明的重慢,非常方便,業(yè)務(wù)研發(fā)人員在管理端配置好服務(wù)編排的API逊躁,通過配置中心同時(shí)下發(fā)到Shepherd服務(wù)端和海盜服務(wù)上似踱,即可開始使用服務(wù)編排能力。整體的交互架構(gòu)圖如下:
圖 20
三、未來規(guī)劃
目前接入Shepherd API網(wǎng)關(guān)的API數(shù)量超過18000多個(gè)核芽,線上運(yùn)行的集群數(shù)量90多個(gè)囚戚,日均總調(diào)用次數(shù)在百億以上。隨著Shepherd API網(wǎng)關(guān)業(yè)務(wù)規(guī)模的不斷增長(zhǎng)狞洋,對(duì)我們的可用性弯淘、易用性、可擴(kuò)展性必將提出更高的要求吉懊。未來一年庐橙,Shepherd的規(guī)劃重點(diǎn)包括有云原生架構(gòu)演進(jìn)、靜態(tài)網(wǎng)站托管借嗽、組件市場(chǎng)等态鳖。
3.1 云原生架構(gòu)演進(jìn)
Shepherd API網(wǎng)關(guān)的云原生架構(gòu)演進(jìn)有三個(gè)目標(biāo):簡(jiǎn)化接入網(wǎng)關(guān)步驟,提升業(yè)務(wù)研發(fā)人員的研發(fā)效率恶导;減小服務(wù)端War包大小浆竭,提升安全性和穩(wěn)定性;接入Serverless彈性惨寿,降低成本邦泄,提高資源利用率。
為了實(shí)現(xiàn)這個(gè)三個(gè)目標(biāo)裂垦,我們計(jì)劃整體遷移網(wǎng)關(guān)服務(wù)到公司的Serverless服務(wù)Nest(參見《美團(tuán)Serverless平臺(tái)Nest的探索與實(shí)踐》一文)上顺囊,同時(shí)通過抽取Shepherd核心功能到SDK的方式集成到業(yè)務(wù)的網(wǎng)關(guān)集群,業(yè)務(wù)研發(fā)人員可以只選擇自己需要使用的自定義組件蕉拢,從而大幅減小服務(wù)端的War包大小特碳。
圖 21
3.2 靜態(tài)網(wǎng)站托管
依托Shepherd API網(wǎng)關(guān)實(shí)現(xiàn)靜態(tài)網(wǎng)站托管的目標(biāo)是:建設(shè)通用的靜態(tài)網(wǎng)站托管解決方案,為開發(fā)者提供便捷晕换、穩(wěn)定午乓、高擴(kuò)展性的靜態(tài)網(wǎng)站托管服務(wù)。
靜態(tài)網(wǎng)站托管解決方案能為業(yè)務(wù)研發(fā)人員提供的主要功能包括:托管靜態(tài)網(wǎng)站資源闸准,包括存儲(chǔ)及訪問益愈;管理應(yīng)用生命周期,包括自定義域配置以及身份驗(yàn)證和授權(quán)夷家;CI/CD集成等腕唧。
圖 22
3.3 組件市場(chǎng)
Shepherd API網(wǎng)關(guān)組件市場(chǎng)的目標(biāo)是:合作共贏,形成開發(fā)生態(tài)瘾英,業(yè)務(wù)研發(fā)人員可將開發(fā)的自定義組件提供給其他有需要的業(yè)務(wù)研發(fā)團(tuán)隊(duì)使用。
我們希望讓業(yè)務(wù)研發(fā)人員參與到自定義組件的開發(fā)颂暇,完善使用文檔后設(shè)置為公共組件缺谴,開放給所有使用Shepherd的業(yè)務(wù)研發(fā)人員使用,避免重復(fù)造輪子。
作者簡(jiǎn)介
充澤湿蛔、志洋膀曾、李敏等,均來自美團(tuán)基礎(chǔ)技術(shù)部-基礎(chǔ)架構(gòu)團(tuán)隊(duì)阳啥。