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