我們團(tuán)隊(duì)在結(jié)合自身技術(shù)棧、成本、穩(wěn)定性、易用性、可維護(hù)性、業(yè)務(wù)場(chǎng)景等等因素綜合考慮后,覺(jué)得我們面臨的大多數(shù)場(chǎng)景中,HTTP 和 RPC 的性能差別并不是主要問(wèn)題。

再加上下圖所示的 HTTP 性能測(cè)試結(jié)果作為佐證,我們完全可以采用 HTTP API 的方式來(lái)進(jìn)行微服務(wù) API 開(kāi)發(fā)。

再者,當(dāng)業(yè)務(wù)發(fā)展到一定的程度,如果某些業(yè)務(wù)功能的性能壓力變大時(shí),我們還是可以使用 RPC 小范圍地進(jìn)行改造。這也是符合敏捷思想的一個(gè)決定。

下圖是對(duì) helloworld 頁(yè)面進(jìn)行 10000 次連續(xù)請(qǐng)求的測(cè)試結(jié)果,總耗時(shí) 1.504 秒,平均每個(gè)請(qǐng)求耗時(shí) 0.15 毫秒。

測(cè)試環(huán)境:原生 Tomcat7(沒(méi)有任何優(yōu)化)運(yùn)行在本地虛擬機(jī)上

下面是對(duì) helloworld 頁(yè)面以 100 并發(fā)數(shù)進(jìn)行 10 萬(wàn)次請(qǐng)求的測(cè)試結(jié)果,平均每個(gè)請(qǐng)求耗時(shí) 11.9 毫秒。

測(cè)試環(huán)境:原生 Tomcat7(沒(méi)有任何優(yōu)化)運(yùn)行在本地虛擬機(jī)上

所以,按照上面的測(cè)試結(jié)果,HTTP API 方式的性能完全足以支撐絕大多數(shù)的微服務(wù) API 開(kāi)發(fā)。讓我們把 RPC 方式留給那些可能出現(xiàn)雙十一業(yè)務(wù)量的大型互聯(lián)網(wǎng)公司去玩。

RESTful API 適用于開(kāi)放 API 的場(chǎng)景

這是另一個(gè)折磨人的問(wèn)題。相對(duì)于 HTTP API,RESTful API 在 HTTP API 的基礎(chǔ)上增加了一些非常抽象晦澀的概念,例如資源(Resource)、表述(REpresentation)、狀態(tài)轉(zhuǎn)移(State Transfer)、統(tǒng)一接口(Uniform Interface)……。

在經(jīng)歷了一次又一次的折磨,例如“l(fā)ogin/logout 是什么 RESTful 方法?”、“批量刪除該怎么實(shí)現(xiàn)?”、“RESTful 的 resource 究竟該怎么定義?”之后,越來(lái)越感覺(jué)這是一個(gè)形而上學(xué)的問(wèn)題,太過(guò)于抽像。

我們不該盲從于時(shí)髦的技術(shù),需要加上技術(shù)人的基于自身情況的理性思考。所以,RESTful 雖好,但不是我們團(tuán)隊(duì)的菜。

再者,即使團(tuán)隊(duì)中有些人可以理解并正確地實(shí)踐,也很難或者說(shuō)不可能讓整個(gè)團(tuán)隊(duì)來(lái)正確地實(shí)踐這樣一種方法。

所以,我們?cè)谝环瑨暝螅x擇了 HTTP API 方式,原來(lái)怎么開(kāi)發(fā),現(xiàn)在還是怎么開(kāi)發(fā),把主要精力放到了 API 的監(jiān)控和治理上面。

API 治理

API 文檔

API 存在的意義在于有人調(diào)用它,如果調(diào)用方在調(diào)用 API 的時(shí)候很麻煩,甚至不能正確地調(diào)用,那么團(tuán)隊(duì)內(nèi)部及團(tuán)隊(duì)之間的溝通成本及配合程度就會(huì)大受影響。

我們是通過(guò)文檔來(lái)溝通的,項(xiàng)目開(kāi)始的時(shí)候還好,但隨著時(shí)間的推移,文檔的更新變得不是那么及時(shí)(這其實(shí)是個(gè)自我辯解的說(shuō)法,事實(shí)是大部分情況下文檔都不更新了),API 變更時(shí),也不容易找出哪些模塊調(diào)用了這個(gè) API。

所以,得先解決 文檔不及時(shí)更新 的問(wèn)題。雖然我們可以通過(guò)流程管理的方式來(lái)強(qiáng)制大家更新文檔,但這對(duì)于開(kāi)發(fā)人員來(lái)說(shuō),顯然是不夠科學(xué)或人性化的,因?yàn)樽兏粋€(gè) API,就要在兩個(gè)地方進(jìn)行修改,一是 API 代碼,二是 API 文檔,程序員的思維就得在代碼和文檔之間不斷切換,工作效率必然受影響。

我們就想,能不能只需要在同一個(gè)地方修改,如果能做到,API 文檔的更新就沒(méi)有那么麻煩了,于人于已都是好事。

經(jīng)過(guò)調(diào)研,我們選擇使用 Swagger 來(lái)編寫(xiě)文檔,按照 Swagger 的規(guī)范,在 API 上加一些描述性的 Annotation 就可以了。

通過(guò)以上的 Annotation,將自動(dòng)生成以下在線(xiàn) API 文檔。

調(diào)用方可以在 API 文檔界面填入?yún)?shù)并點(diǎn)擊“Try it out!”按鈕嘗試調(diào)用這個(gè) API。這樣,在沒(méi)有 API 提供方支持的情況下,即可以自行完成絕大部分的 API 調(diào)用,是不是很爽?

調(diào)用鏈管理

API 開(kāi)發(fā)出來(lái)了,API 文檔也寫(xiě)好了,接下來(lái)就是被調(diào)用了。前篇文章講到,通過(guò) Spring Cloud 的 Eureka + Ribbon + Zuul 可以很方便地調(diào)用到這些 API。

那么,如何來(lái)追蹤 API 被誰(shuí)調(diào)用了,調(diào)用是否出錯(cuò)及出錯(cuò)原因,調(diào)用鏈路里各個(gè) API 的性能怎么樣,是不是存在僵尸 API……這些都是關(guān)于 API 治理的問(wèn)題。

實(shí)現(xiàn)這個(gè)目標(biāo),有一個(gè)比較取巧的方法,就是在 Ribbon 的客戶(hù)端里做點(diǎn)文章,在調(diào)用 API 之前記錄一下開(kāi)始時(shí)間,API 調(diào)用返回后,記錄 API 調(diào)用耗時(shí)、調(diào)用狀態(tài),如果有錯(cuò)則記錄一下錯(cuò)誤原因。

如果還想追蹤調(diào)用鏈,可以在請(qǐng)求頭里加上一個(gè)調(diào)用鏈 ID,這樣就來(lái)把調(diào)用關(guān)系都串連起來(lái)。

下邊是我們自己研發(fā)的調(diào)用鏈管理組件(DCTrace)的幾個(gè)效果圖:

查看微服務(wù)之間的調(diào)用關(guān)系,調(diào)用性能

查看調(diào)用失敗原因

圖形化查看調(diào)用關(guān)系,太亂 ,下次迭代改進(jìn)一下 [攤手]

站在技術(shù)管理者的角度,可以從調(diào)用鏈里看出來(lái),哪些模塊之間發(fā)生了不正當(dāng)關(guān)系 [噗嗤];哪些模塊之間本該有關(guān)系的,事實(shí)卻沒(méi)有;通過(guò)對(duì)比 Swagger 和調(diào)用鏈的 API 清單,找出僵尸 API……

API 測(cè)試

使用微服務(wù)架構(gòu)后,API 是每個(gè)微服務(wù)的 唯一能力出口。由于互聯(lián)網(wǎng)行業(yè)的快速發(fā)展,軟件需求變更變得越來(lái)越頻繁,迭代升級(jí)的速度變得越來(lái)越快。

對(duì)于提供方來(lái)說(shuō),需要保證變更和迭代的過(guò)程中,不影響之前承諾的功能(包括正確性、穩(wěn)定性和性能等)。

對(duì)于調(diào)用方來(lái)說(shuō),同樣需要確保自身依賴(lài)的 API 能正常使用,不能因?yàn)槠渌K的錯(cuò)誤而導(dǎo)致自身業(yè)務(wù)受到影響(包括正確性、穩(wěn)定性和性能等)。

畢竟,從組織角度來(lái)看,系統(tǒng)出錯(cuò)就是出錯(cuò),不管原因是自身導(dǎo)致的還是服務(wù)提供方導(dǎo)致的,所以 服務(wù)調(diào)用方就需要對(duì)服務(wù)提供方進(jìn)行管理。

這也就是前幾年契約測(cè)試(Pact)方法大行其道的原因。有興趣的朋友可以去看看這種測(cè)試方法。

對(duì)于 API 白盒測(cè)試,推薦使用基于 Java 的 REST-Assured 測(cè)試框架,用起來(lái)特別方便。

https://github.com/rest-assured/rest-assured

更進(jìn)一步,基于 HTTP 協(xié)議、JSON/XML 報(bào)文的規(guī)范性,完全可以開(kāi)發(fā)一個(gè) API 測(cè)試小工具(暫且叫它 小鷹 吧)來(lái)替換 REST-Assured。我們也暫未實(shí)踐,只是覺(jué)得會(huì)很有用,供大家參考。

基礎(chǔ)步驟是:

  1. 服務(wù)提供方開(kāi)發(fā) API,并正確書(shū)寫(xiě) Swagger 文檔。
  2. 服務(wù)提供方在小鷹的界面上選擇需要測(cè)試的 API,并填寫(xiě)測(cè)試參數(shù)。(API 清單和參數(shù)都可以通過(guò)調(diào)用 Swagger 的 API 獲取)
  3. 服務(wù)調(diào)用方根據(jù)自已的理解,也將對(duì)自己有用的服務(wù)方提供的 API 配置到小鷹上。
  4. 小鷹 7*24 小時(shí)為服務(wù)提供方和調(diào)用方巡視這些 API,并在異常出現(xiàn)時(shí)發(fā)送警報(bào)。

寫(xiě)在最后

所以,對(duì)于微服務(wù) API 開(kāi)發(fā),我們

文章轉(zhuǎn)自微信公眾號(hào)@InfoQ

熱門(mén)推薦
一個(gè)賬號(hào)試用1000+ API
助力AI無(wú)縫鏈接物理世界 · 無(wú)需多次注冊(cè)
3000+提示詞助力AI大模型
和專(zhuān)業(yè)工程師共享工作效率翻倍的秘密
返回頂部
上一篇
4種主流的API架構(gòu)風(fēng)格對(duì)比
下一篇
如何實(shí)現(xiàn) OpenAPI 多語(yǔ)言 SDK 開(kāi)發(fā)?
国内精品久久久久影院日本,日本中文字幕视频,99久久精品99999久久,又粗又大又黄又硬又爽毛片
精品成人私密视频| 老司机午夜精品| 日韩精品一区二区三区中文精品| 亚洲男人的天堂在线aⅴ视频| 亚洲va欧美va人人爽| 精品夜夜嗨av一区二区三区| 成人国产精品免费观看动漫| 国产亚洲一区二区三区四区| 成人福利视频在线看| 国产69精品久久久久777| 亚洲综合男人的天堂| 欧美日韩成人高清| 性做久久久久久久免费看| 一本久久a久久精品亚洲| 欧美一级国产精品| 91在线无精精品入口| 亚洲人精品一区| 国产精品久久影院| 成人免费视频网站在线观看| 欧美日韩精品欧美日韩精品 | 欧美区在线观看| 中文字幕一区二区三区四区不卡| 麻豆一区二区在线| 欧美放荡的少妇| 一区二区欧美视频| 91丨porny丨在线| 亚洲国产高清在线| 成人黄色a**站在线观看| 久久久亚洲精品一区二区三区 | 美女视频网站黄色亚洲| 欧美精品电影在线播放| 亚洲国产一二三| 欧美三级在线视频| 亚洲高清视频在线| 欧美日韩国产一区二区三区地区| 亚洲一区在线视频观看| 亚洲综合色区另类av| 91国模大尺度私拍在线视频| 欧美va日韩va| 97aⅴ精品视频一二三区| 奇米综合一区二区三区精品视频| 欧美xxxxxxxxx| 亚洲精品第一国产综合野| 欧美日韩国产大片| 亚洲精品免费播放| 国产人久久人人人人爽| 国产一区二区三区黄视频| 日韩欧美www| 麻豆国产精品官网| 国产日产欧美一区| 91在线精品一区二区| 狠狠色2019综合网| 亚洲综合免费观看高清完整版| 在线不卡一区二区| 99精品视频在线免费观看| 久久99久久99精品免视看婷婷| 综合久久久久久| 欧美日韩一卡二卡| 色婷婷精品久久二区二区蜜臂av| 精品一区二区三区不卡| 国产一区二区三区日韩| 不卡视频一二三| 中文无字幕一区二区三区| 国产欧美日韩卡一| www成人在线观看| 94色蜜桃网一区二区三区| 91精品国产色综合久久不卡蜜臀| 色综合 综合色| 精品国产乱码久久久久久闺蜜 | 亚洲欧美激情在线| 91久久一区二区| 亚洲精品精品亚洲| 日韩视频免费观看高清完整版在线观看 | 一区二区三区在线观看动漫| 91成人免费在线| 免费高清不卡av| 久久久久久久综合狠狠综合| 91亚洲精品乱码久久久久久蜜桃 | 精品福利视频一区二区三区| 国产精品一区三区| 亚洲激情自拍视频| 欧美一区二区三区喷汁尤物| 福利91精品一区二区三区| 亚洲男人的天堂av| 日韩欧美亚洲国产精品字幕久久久| 国产精品一色哟哟哟| 亚洲综合偷拍欧美一区色| 日韩女优电影在线观看| 99久久99久久综合| 免费久久99精品国产| 欧美国产国产综合| 91精品国产91综合久久蜜臀| 色先锋aa成人| 欧美性色综合网| 日本一区中文字幕| 国产亚洲一区字幕| 欧美另类高清zo欧美| 成人一道本在线| 久久九九影视网| a美女胸又www黄视频久久| 日韩激情视频网站| 亚洲欧洲美洲综合色网| 久久精品视频免费观看| 91精品国模一区二区三区| 91精品福利视频| 精品久久久久久久久久久久久久久 | 亚洲最新在线观看| 欧美日韩亚洲另类| 亚洲最大成人综合| 久久影院电视剧免费观看| 经典三级一区二区| 成人黄色av电影| 捆绑紧缚一区二区三区视频| 性久久久久久久| 亚洲人成亚洲人成在线观看图片| 久久奇米777| 欧美变态口味重另类| 337p亚洲精品色噜噜| 欧美一区二区三区啪啪| 欧美人xxxx| av电影在线不卡| 欧美日韩免费一区二区三区视频| 精品国产乱码久久久久久老虎| 韩国一区二区三区| 国内精品自线一区二区三区视频| 日韩成人午夜精品| 色哦色哦哦色天天综合| 国产精品久久久久久久久晋中| 亚洲同性gay激情无套| 337p亚洲精品色噜噜噜| 国产精品久久福利| 日韩一区二区电影| 国产喂奶挤奶一区二区三区| 久久久亚洲综合| 国产精品国产自产拍高清av| 成人动漫一区二区在线| 亚洲午夜国产一区99re久久| 在线观看三级视频欧美| 日本在线不卡视频一二三区| 26uuu国产电影一区二区| 国产精品一级片| 亚洲国产视频一区| 国产自产v一区二区三区c| 亚洲欧洲在线观看av| 国产乱妇无码大片在线观看| 日本韩国一区二区三区| 亚洲欧美欧美一区二区三区| 国内一区二区在线| 蜜桃av一区二区在线观看| 亚洲欧美另类久久久精品 | 日韩一区二区三区免费看 | 一区二区三区成人| 香蕉久久夜色精品国产使用方法 | 不卡av免费在线观看| 免费的国产精品| 国产精品电影一区二区| 26uuu国产电影一区二区| 欧美日韩国产电影| 日本乱人伦aⅴ精品| 日韩一区二区电影| 国产成人aaaa| 青青草97国产精品免费观看| 日韩电影在线一区| 麻豆专区一区二区三区四区五区| 亚洲午夜久久久久久久久电影网| 中文在线免费一区三区高中清不卡| 欧美激情一二三区| 国产精品情趣视频| 日韩专区中文字幕一区二区| 精品一区二区影视| 国产一区91精品张津瑜| 欧美日韩一区二区不卡| 亚洲女人小视频在线观看| 亚洲成人av资源| 久久综合九色欧美综合狠狠| 欧美人妇做爰xxxⅹ性高电影 | 亚洲大片在线观看| 精品一区二区日韩| 国产麻豆精品一区二区| 成人app网站| 欧美日韩一区二区三区不卡| 欧美成人bangbros| 亚洲一线二线三线久久久| 精品亚洲成av人在线观看| 欧美日韩国产高清一区| 国产精品久久久久久久久免费丝袜| 日韩av中文在线观看| www.日本不卡| 欧美高清视频不卡网| 亚洲色图视频免费播放| 视频在线在亚洲| 在线观看亚洲a| 亚洲国产成人一区二区三区| 久热成人在线视频| 欧美日韩国产色站一区二区三区| 亚洲免费资源在线播放| 国产成人自拍在线| 国产亚洲精品资源在线26u| 精品一区二区综合| 欧美一级免费大片|