微服务API模拟框架frock介绍
本文來源于我在InfoQ中文站翻譯的文章,原文地址是:http://www.infoq.com/cn/news/2016/02/introducing-frock
Urban Airship是一家?guī)椭I(lǐng)導(dǎo)品牌吸引其移動(dòng)用戶的公司,他們能夠幫助這些公司在客戶下載完應(yīng)用后就與公司建立起高價(jià)值的關(guān)系。
眼下,Urban Airship已經(jīng)有了數(shù)量龐大的客戶群,涵蓋的領(lǐng)域有零售業(yè)、媒體與娛樂、運(yùn)動(dòng)與旅游、醫(yī)療等。這些公司都通過Urban Airship來增強(qiáng)其與客戶的連結(jié)性。近日。來自于Urban Airship的開發(fā)人員開源了他們所使用的一款開發(fā)工具:frock。該框架用于簡化模擬服務(wù)套件的管理。
假設(shè)你在工作中使用了面向服務(wù)的架構(gòu),那么frock是很值得你去嘗試的一個(gè)工具。
解決開發(fā)環(huán)境的復(fù)雜性
Urban Airship使用了微服務(wù),這對于一家SaaS公司來說是很常見的模式:我們有許多服務(wù),每一個(gè)服務(wù)都包裝了少量的功能,而且每一個(gè)服務(wù)都能通過定義良好的協(xié)議為其它服務(wù)所請求。這對于可伸縮性與穩(wěn)定性來說是很棒的,只是對于開發(fā)人員與其環(huán)境來說卻產(chǎn)生了問題。我們的團(tuán)隊(duì)從事Go的開發(fā)工作(Go是Urban Airship Engagement儀表盤產(chǎn)品),它是最早期的Urban Airship代碼基之中的一個(gè),包括了大量的功能:消息生成與報(bào)告、賬單與使用報(bào)告。以及服務(wù)管理(比方說前不久公布的Urban Airship Connect)。
Go會(huì)調(diào)用大量的服務(wù)。這導(dǎo)致團(tuán)隊(duì)的開發(fā)環(huán)境產(chǎn)生了許多問題。之前,我們的環(huán)境包括了一個(gè)單體的、執(zhí)行于Vagrant之上的虛擬機(jī)。它依賴于儀表盤的全部服務(wù)。這么做有許多問題:
- 速度很慢。服務(wù)與依賴的數(shù)量許多,包括幾種不同的數(shù)據(jù)庫都須要保持在執(zhí)行狀態(tài)才行。 
- 很脆弱。我們的團(tuán)隊(duì)缺少JVM專家。上游對服務(wù)的改動(dòng)會(huì)破壞我們的開發(fā)環(huán)境,導(dǎo)致我們許多人都不敢更新。 
- 導(dǎo)致開發(fā)人員無法繼續(xù)工作。當(dāng)開發(fā)人員的環(huán)境被破壞后,他們經(jīng)常無法繼續(xù)工作。環(huán)境的復(fù)雜性意味著這樣的破壞是會(huì)經(jīng)常發(fā)生的。這會(huì)浪費(fèi)大量的時(shí)間。并導(dǎo)致開發(fā)人員很沮喪。 
- 難以將數(shù)據(jù)導(dǎo)入到環(huán)境中。在開發(fā)階段。你須要多種多樣的數(shù)據(jù)來測試代碼。 之前的環(huán)境通常要求你手工執(zhí)行測試數(shù)據(jù)。這是通過與持有數(shù)據(jù)的服務(wù)進(jìn)行直接的通信來做到的。 
frock就是用來幫助我們解決上述全部難題的優(yōu)秀工具。
何為frock?
我們能夠通過frock使用自己定義的數(shù)據(jù)來模擬服務(wù),使用團(tuán)隊(duì)習(xí)慣的語言與執(zhí)行時(shí)來編寫模擬服務(wù):JavaScript與Node.js。
frock的核心僅僅提供了例如以下一些功能:
- 高度可配置的路由,這使得我們能夠輕松攔截對服務(wù)的調(diào)用。
- 基于插件的架構(gòu),它并未對怎樣編寫模擬服務(wù)進(jìn)行強(qiáng)制性約束。
- 針對常見任務(wù)的開箱即用的通用插件。即一個(gè)靜態(tài)文件server與一個(gè)代理server。
- 支持HTTP與Socket服務(wù)。
- HTTP中間件支持,能夠自己定義服務(wù)或路由的行為。比方說,它提供了一個(gè)延遲中間件,能夠延遲請求的時(shí)間。
全部這一切都是通過一個(gè)JSON配置文件(依據(jù)約定,該文件名稱為frockfile.json)來配置的。而且通過包括了全部自己定義模擬服務(wù)的倉庫進(jìn)行共享。frock從grunt與gulp獲得了靈感,其配置就位于你的項(xiàng)目其中。對于HTTP模擬來說,一個(gè)frockfile會(huì)包括一個(gè)簡單的服務(wù)與路由定義。比方說:
{"servers": [{"port": 8080,"routes": [{"path": "/api/devices","methods": ["GET"],"handler": "frock-static","options": {"file": "./fixtures/devices.json","contentType": "application/json"}},{"path": "*","methods": "any","handler": "frock-proxy","options": {"url": "http://localhost:8052"}}]}] }這是我們frockfile中服務(wù)定義的一個(gè)高度簡化的版本號(hào)。在訪問Go儀表盤時(shí)。你實(shí)際上會(huì)命中一個(gè)高可用的代理:該代理會(huì)在內(nèi)部將流量導(dǎo)向不同的服務(wù),其中的主服務(wù)是Go。只是一些API路由則是由二級(jí)服務(wù)所處理的。
相比于在本地執(zhí)行這個(gè)二級(jí)服務(wù),我們能夠通過frock選擇這個(gè)路由,并使用模擬的版本號(hào)將其替換掉。在上述代碼演示樣例中,模擬的僅僅是個(gè)靜態(tài)文件,它由frock-static通用靜態(tài)server插件所處理。全部其它的請求則會(huì)直接轉(zhuǎn)向本地執(zhí)行的Go開發(fā)server,server的端口是8052。
編寫frock插件
實(shí)際上。frock是我們解決這一問題的第2個(gè)平臺(tái),第1個(gè)平臺(tái)是個(gè)名為“multimock”的工具。它是個(gè)單體Python應(yīng)用,能夠創(chuàng)建出多個(gè)服務(wù)線程,并在到達(dá)自己定義處理器之前將其傳遞給一些通用的轉(zhuǎn)換函數(shù)。它能夠解決不少問題,只是我們還是重寫了它,最后才有了frock。為什么要這么做呢?這是由于在multimock中編寫插件是很困難的事情。在編寫frock時(shí),我們的核心原則是“插件的編寫應(yīng)該保持簡單,內(nèi)建的假設(shè)越少越好”。frock通過對插件施加極少的限制來實(shí)現(xiàn)這個(gè)目標(biāo),而且將Node.js HTTP模塊的簡單性直接應(yīng)用到了實(shí)現(xiàn)中。例如以下代碼展示了最簡單的一個(gè)frock HTTP插件,它僅僅是向命中路由的不論什么請求響應(yīng)了“hello world!”而已:
// file ./hello-world.js module.exports = createPluginfunction createPlugin (frock, logger, options) {return handlerfunction handler (req, res) {res.end('hello world!')} }假設(shè)之前編寫過Node.js的請求處理器。那么上述代碼就很easy理解了;該frock插件僅僅包括了一個(gè)返回路由處理器的工廠函數(shù)。
在上述frockfile演示樣例中。我們將這個(gè)插件替換為靜態(tài)文件server:
{"servers": [{"port": 8080,"routes": [{"path": "/api/devices","methods": ["GET"],"handler": "./hello-world"},{"path": "*","methods": "any","handler": "frock-proxy","options": {"url": "http://localhost:8052"}}]}] }如今,對http://localhost:8080/api/devices的不論什么請求都會(huì)返回“hello world!”。
frock對我們的幫助作用
大的特性公布經(jīng)常都是很復(fù)雜的:你經(jīng)常要等待依賴的服務(wù)就緒。還要閱讀怎樣使用這些服務(wù)的規(guī)范。在快節(jié)奏的項(xiàng)目中,這意味著你要不斷追趕集成的日期。當(dāng)終于全部組件都就位后。你希望他們能夠彼此調(diào)用成功。
Connect就是這樣一個(gè)項(xiàng)目,frock能夠幫助Web團(tuán)隊(duì)構(gòu)建出令我們充滿自信的項(xiàng)目,而且能夠很好地實(shí)現(xiàn)集成。
事實(shí)上。上面所介紹的關(guān)于frock的一切都不是什么革命性的功能,只是frock卻能夠幫助我們以一種更簡單的方式做到這些。
建議各位讀者嘗試一下,你會(huì)發(fā)現(xiàn)它在你的開發(fā)環(huán)境中是很實(shí)用的。frock README包括了一個(gè)高速起步指南,另一個(gè)內(nèi)容豐富的文檔與演示樣例代碼,能夠幫助你高速起步。在項(xiàng)目中使用frock并實(shí)現(xiàn)自己的插件。
總結(jié)
以上是生活随笔為你收集整理的微服务API模拟框架frock介绍的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: 命令tree
- 下一篇: SSM + AJAX + JSON 动态
