Hoverfly - 微服务虚拟化示例
微服務(wù)虛擬化是一種模擬基于異構(gòu)組件的應(yīng)用程序(如API驅(qū)動的應(yīng)用程序,基于云的應(yīng)用程序或面向服務(wù)的體系結(jié)構(gòu))中特定組件行為的技術(shù)。
Hoverfly是一個輕量的API服務(wù)模擬工具(有時候也被稱作服務(wù)虛擬化工具)。 使用Hoverfly,您可以創(chuàng)建應(yīng)用程序依賴的API的真實模擬。
什么是微服務(wù)虛擬化?
目前云應(yīng)用程序大量使用微服務(wù),這些微服務(wù)相互交互以實現(xiàn)某些業(yè)務(wù)能力。在開發(fā)這種類型的生態(tài)系統(tǒng)時,我們有時會遇到一些常見問題,這些問題通常會影響整個團隊的生產(chǎn)力,例如:
- 目前,生態(tài)系統(tǒng)中的所有服務(wù)可能都不可用。也許是其他團隊正在開發(fā)著。
- 一些遺留的服務(wù)不處于開發(fā)環(huán)境,并且由于顯而易見的原因,我們無法使用生產(chǎn)版本進行測試。
- 由于某些原因,某些服務(wù)可能會停機。
- 管理測試數(shù)據(jù)的問題。通常,要編寫適當(dāng)?shù)臏y試,您需要對模擬或存根中的數(shù)據(jù)進行細(xì)粒度控制。管理具有多個團隊的大型項目的測試數(shù)據(jù)會帶來影響交付時間的瓶頸。
因此,我們可以很容易地理解,上述問題將影響當(dāng)前產(chǎn)品的開發(fā),并可能影響交付時間表,這與該產(chǎn)品的開發(fā)成本成正比。那么有什么解決方案呢?
- 我們可以考慮使用一些流行的模擬框架來mock這些服務(wù)。但它也有一些缺點,例如,模擬通常是特定于場景的,并且需要花費很多精力來為這些服務(wù)創(chuàng)建模擬響應(yīng),并且模擬最好只適用于單元測試階段(Junit)。
- 我們可以使用存根服務(wù),我們將使用硬編碼響應(yīng)來開發(fā)一些虛假服務(wù) - 同樣這些也需要我們開發(fā)一些東西來使這項工作運轉(zhuǎn)起來。
- 現(xiàn)在,我們需要在開發(fā)過程中進行持續(xù)集成,在這些情況下,Mocking和Stubbed服務(wù)都不是很好的候選者。
由于模擬和存根服務(wù)在有效使用方面都存在一些缺陷,因此為了解決上述問題,我們有一種稱為服務(wù)虛擬化的技術(shù),我們可以捕獲/模擬實際服務(wù)。Hoverfly就是一種這樣的工具,它使用新GO語言開發(fā),提供了非常簡單和現(xiàn)實的步驟來解決問題。
Hoverfly的特征:
- 創(chuàng)建可重復(fù)使用的虛擬服務(wù),在CI環(huán)境中替代緩慢和不穩(wěn)定的外部或第三方服務(wù)
- 模擬網(wǎng)絡(luò)延遲,隨機故障或速率限制以測試邊緣情況
- 使用多種編程語言擴展和自定義, 包括Go,Java,Javascript,Python
- 導(dǎo)出,共享,編輯和導(dǎo)入API模擬數(shù)據(jù)
- Java和Python的語言綁定
- REST API
- 輕巧,高性能,隨處運行
- 采用 Apache 2許可證
下面我們通過序列圖來更好地理解虛擬化服務(wù)的運行過程:
Hoverfly處于捕獲模式 - 作為實際服務(wù)的代理服務(wù)
模擬模式下的Hoverfly - 直接響應(yīng),無需進入實際服務(wù)
演示說明
我們將按照一定的步驟演示Hoverfly作為服務(wù)虛擬化工具的用法。
- 我們將創(chuàng)建一個小型微服務(wù)生態(tài)系統(tǒng),它們將相互調(diào)用。
- 我們將使用Hoverfly在捕獲模式下攔截實際的請求/響應(yīng)。
- 最后,我們將看到Hoverfly如何充當(dāng)服務(wù)虛擬化服務(wù)器,以便在模擬模式下發(fā)回已捕獲的請求/響應(yīng)。
- 我們還將檢查基礎(chǔ)服務(wù)停機時對我們的開發(fā)沒有太大影響。
- 此外,我們將看到我們可以輕松切換Hoverfly以返回捕獲模式并將請求傳遞給實際服務(wù)。
準(zhǔn)備工作
首先需要下載Hoverfly。官網(wǎng)地址,提供MacOS、Windows、Linux版本以及Docker鏡像。
Windows版本下載地址
Windows版本下載后解壓到任意目錄下即可。里面包含了兩個可執(zhí)行文件:hoverctl.exe 和 hoverfly.exe。
- hoverctl是一個命令行工具,可用于配置和控制Hoverfly。它允許你將Hoverfly作為守護程序運行。
- Hoverfly是完成大部分工作的應(yīng)用程序。它提供代理服務(wù)器和Web服務(wù)器以及API端點。
可以使用以下命令查看版本號
hoverctl version hoverfly -version運行Hoverfly實例
hoverctl start查看日志
hoverctl logs停止Hoverfly
hoverctl stop創(chuàng)建微服務(wù)
讓我們使用spring boot來創(chuàng)建服務(wù),以加快開發(fā)速度。
應(yīng)用服務(wù)
添加一個Rest端點
創(chuàng)建一個RestController類,公開端點/service/hoverfly。這個端點被我們在此之后開發(fā)的客戶服務(wù)調(diào)用。為簡單起見,我們只返回一些硬編碼值,并在響應(yīng)中添加響應(yīng)時間。
@RestController public class MyRestController {@RequestMapping(value = "/service/hoverfly")public HoverflyServiceResponse getSampleResponse() {System.out.println("Inside HoverflyActualServiceApplication::getSampleResponse()");return new HoverflyServiceResponse("returned value from HoverflyActualServiceApplication",new Date().toString(), UUID.randomUUID().toString());} }響應(yīng)對象
public class HoverflyServiceResponse {private String message;private String responseTime;private String transactionid;public HoverflyServiceResponse(String message, String responseTime, String transactionid) {super();this.message = message;this.responseTime = responseTime;this.transactionid = transactionid;}public String getMessage() {return message;}public void setMessage(String message) {this.message = message;}public String getResponseTime() {return responseTime;}public void setResponseTime(String responseTime) {this.responseTime = responseTime;}public String getTransactionid() {return transactionid;}public void setTransactionid(String transactionid) {this.transactionid = transactionid;} }驗證服務(wù)
將應(yīng)用程序端口更改為9080。在application.properties文件中設(shè)置屬性
server.port = 9080啟動服務(wù)后,通過瀏覽器訪問http://localhost:9080/service/hoverfly可得到如下響應(yīng)
{"message":"returned value from HoverflyActualServiceApplication","responseTime":"Thu Jan 17 17:03:52 CST 2019","transactionid":"56f3dec0-ce1f-4a94-95b7-2dee47b4b7fd" }客戶服務(wù)
同樣的方式新建一個消費者,創(chuàng)建一個RestController類公開端點/invoke。此端點方法將在內(nèi)部調(diào)用我們剛剛開發(fā)的服務(wù)(hoverfly-actual-service)。
此外,我們在RestTemplate通過調(diào)用一個系統(tǒng)屬性mode來在創(chuàng)建bean時添加了一定的邏輯。如果mode=proxy,那么所有的請求將首先通過Hoverfly代理進行路由。否則所有對此的請求將直接進入實際服務(wù)。
請仔細(xì)觀察restTemplate()了解代理模式的方法。注意Hoverfly代理服務(wù)器將在http://localhost:8500上運行。
@RestController public class ClientController {private static final int HOVERFLY_PORT = 8500;private static final String HOVERFLY_HOST = "localhost";private static final String PROXY = "proxy";@AutowiredRestTemplate restTemplate;@RequestMapping("/invoke")public String invoke() {System.out.println("inside TestController::invoke()");String url = "http://localhost:9080/service/hoverfly";String response = restTemplate.exchange(url, HttpMethod.GET, null, new ParameterizedTypeReference<String>() {}).getBody();System.out.println("Actual Response : " + response);return response;}@Beanpublic RestTemplate restTemplate() {String mode = System.getProperty("mode");System.out.println("##################### Mode ################# " + mode);SimpleClientHttpRequestFactory requestFactory = new SimpleClientHttpRequestFactory();Proxy proxy = new Proxy(Type.HTTP, new InetSocketAddress(HOVERFLY_HOST, HOVERFLY_PORT));requestFactory.setProxy(proxy);RestTemplate template = null;if (mode != null && mode.equalsIgnoreCase(PROXY)) {System.out.println("######### Running application in PROXY mode so that we can use simulated hoveryfly server!!!!");template = new RestTemplate(requestFactory);} else {System.out.println("######### Running application in PRODUCTION mode so that we can use simulated hoveryfly server!!!!");template = new RestTemplate();}return template;} }驗證服務(wù)
此服務(wù)在本地的8080端口中運行。啟動時要注意帶上參數(shù)-Dmode=proxy。
訪問http://localhost:8080/invoke,得到響應(yīng):
Hoverfly演示
我們現(xiàn)在啟動本地Hoverfly,并將測試不同的模式,并將了解它在服務(wù)停機時的實際幫助。Hoverfly提供6種不同模式Capture,Simulate,Spy,Modify,Synthesize和Diff。我們只會在此演示中展示Capture和Simulate模式。
在捕獲模式下啟動Hoverfly
打開Hoverfly目錄(解壓縮目錄)的cmd窗口并鍵入hoverctl start命令。它將在本地工作站中啟動hoverfly,proxy mode在8500端口中啟動代理服務(wù)器,并將在8888端口啟動管理UI 。
現(xiàn)在鍵入命令以更改要捕獲的hoverfly模式。
hoverctl mode capture現(xiàn)在轉(zhuǎn)到瀏覽器http://localhost:8888/dashboard,它將顯示管理UI,我們也可以在其中更改模式,還可以看到已捕獲或模擬了多少請求。
捕獲請求
現(xiàn)在在瀏覽器窗口中運行客戶端服務(wù)幾次,而hoverfly處于捕獲模式。再次轉(zhuǎn)到管理界面,注意Capture計數(shù)器已增加到你在瀏覽器中訪問客戶端服務(wù)應(yīng)用程序的次數(shù)。
導(dǎo)出/導(dǎo)入捕獲的請求
將模擬請求和響應(yīng)存儲在其他地方是個好主意,我們不需要一直運行Hoverfly。每當(dāng)我們需要它時,我們將導(dǎo)回已保存的請求/響應(yīng)并開始模擬服務(wù)。
要導(dǎo)出,打開Hoverfly命令窗口并輸入命令:
hoverctl export simulations.json這將導(dǎo)出已捕獲的(在我們的情況下為3個事務(wù))事務(wù)以及所有URL,請求等。一旦導(dǎo)出,文件將在主目錄中創(chuàng)建json文件simulations.json。
{"data": {"pairs": [{"request": {"path": [{"matcher": "exact","value": "/service/hoverfly"}],"method": [{"matcher": "exact","value": "GET"}],"destination": [{"matcher": "exact","value": "localhost:9080"}],"scheme": [{"matcher": "exact","value": "http"}],"body": [{"matcher": "exact","value": ""}],"query": {}},"response": {"status": 200,"body": "{\"message\":\"returned value from HoverflyActualServiceApplication\",\"responseTime\":\"Thu Jan 17 15:34:29 CST 2019\",\"transactionid\":\"012fe955-2259-494d-a548-88c232c35881\"}","encodedBody": false,"headers": {"Content-Length": ["167"],"Content-Type": ["application/json;charset=UTF-8"],"Date": ["Thu, 17 Jan 2019 07:34:29 GMT"],"Hoverfly": ["Was-Here"]},"templated": false}}],"globalActions": {"delays": []}},"meta": {"schemaVersion": "v5","hoverflyVersion": "v0.17.7","timeExported": "2019-01-17T15:38:30+08:00"} }要導(dǎo)入simulations.json文件,可以鍵入命令以導(dǎo)入捕獲的定義。
hoverctl import simulations.json在模擬模式下測試
可使用命令轉(zhuǎn)到模擬模式,也可以在控制臺切換
hoverctl mode simulate然后可以做以下的步驟
- 在瀏覽器中打開客戶端應(yīng)用程序并點擊刷新按鈕,看到瀏覽器中的響應(yīng)沒有變化(通知響應(yīng)時間和事務(wù)ID字段),這意味著Hoverfly處于活動狀態(tài)并發(fā)送與導(dǎo)入文件匹配的所有URL模式的響應(yīng)。
- 轉(zhuǎn)到Hoverfly管理界面,看到模擬計數(shù)器已增加到在模擬模式下訪問客戶端應(yīng)用程序的次數(shù)。
- 現(xiàn)在停止服務(wù)提供者并點擊客戶端應(yīng)用程序,你可以很容易地看到Hoverfly模擬服務(wù)做出響應(yīng)。在我們想要在實際服務(wù)停機時進行測試的實際場景中,這非常有用。
總結(jié)
今天我們已經(jīng)學(xué)習(xí)了如何有效和輕松地使用服務(wù)虛擬化工具Hoverfly,并將其集成到我們的微服務(wù)生態(tài)系統(tǒng)中。我們只看到了Hoverfly的一些功能,更多細(xì)節(jié)請訪問官方文檔。
總結(jié)
以上是生活随笔為你收集整理的Hoverfly - 微服务虚拟化示例的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ObserveIT Client安装后屏
- 下一篇: 写模拟挂用什么工具?