Hoverfly - 微服务虚拟化示例
微服務虛擬化是一種模擬基于異構組件的應用程序(如API驅動的應用程序,基于云的應用程序或面向服務的體系結構)中特定組件行為的技術。
Hoverfly是一個輕量的API服務模擬工具(有時候也被稱作服務虛擬化工具)。 使用Hoverfly,您可以創建應用程序依賴的API的真實模擬。
什么是微服務虛擬化?
目前云應用程序大量使用微服務,這些微服務相互交互以實現某些業務能力。在開發這種類型的生態系統時,我們有時會遇到一些常見問題,這些問題通常會影響整個團隊的生產力,例如:
- 目前,生態系統中的所有服務可能都不可用。也許是其他團隊正在開發著。
- 一些遺留的服務不處于開發環境,并且由于顯而易見的原因,我們無法使用生產版本進行測試。
- 由于某些原因,某些服務可能會停機。
- 管理測試數據的問題。通常,要編寫適當的測試,您需要對模擬或存根中的數據進行細粒度控制。管理具有多個團隊的大型項目的測試數據會帶來影響交付時間的瓶頸。
因此,我們可以很容易地理解,上述問題將影響當前產品的開發,并可能影響交付時間表,這與該產品的開發成本成正比。那么有什么解決方案呢?
- 我們可以考慮使用一些流行的模擬框架來mock這些服務。但它也有一些缺點,例如,模擬通常是特定于場景的,并且需要花費很多精力來為這些服務創建模擬響應,并且模擬最好只適用于單元測試階段(Junit)。
- 我們可以使用存根服務,我們將使用硬編碼響應來開發一些虛假服務 - 同樣這些也需要我們開發一些東西來使這項工作運轉起來。
- 現在,我們需要在開發過程中進行持續集成,在這些情況下,Mocking和Stubbed服務都不是很好的候選者。
由于模擬和存根服務在有效使用方面都存在一些缺陷,因此為了解決上述問題,我們有一種稱為服務虛擬化的技術,我們可以捕獲/模擬實際服務。Hoverfly就是一種這樣的工具,它使用新GO語言開發,提供了非常簡單和現實的步驟來解決問題。
Hoverfly的特征:
- 創建可重復使用的虛擬服務,在CI環境中替代緩慢和不穩定的外部或第三方服務
- 模擬網絡延遲,隨機故障或速率限制以測試邊緣情況
- 使用多種編程語言擴展和自定義, 包括Go,Java,Javascript,Python
- 導出,共享,編輯和導入API模擬數據
- Java和Python的語言綁定
- REST API
- 輕巧,高性能,隨處運行
- 采用 Apache 2許可證
下面我們通過序列圖來更好地理解虛擬化服務的運行過程:
Hoverfly處于捕獲模式 - 作為實際服務的代理服務
模擬模式下的Hoverfly - 直接響應,無需進入實際服務
演示說明
我們將按照一定的步驟演示Hoverfly作為服務虛擬化工具的用法。
- 我們將創建一個小型微服務生態系統,它們將相互調用。
- 我們將使用Hoverfly在捕獲模式下攔截實際的請求/響應。
- 最后,我們將看到Hoverfly如何充當服務虛擬化服務器,以便在模擬模式下發回已捕獲的請求/響應。
- 我們還將檢查基礎服務停機時對我們的開發沒有太大影響。
- 此外,我們將看到我們可以輕松切換Hoverfly以返回捕獲模式并將請求傳遞給實際服務。
準備工作
首先需要下載Hoverfly。官網地址,提供MacOS、Windows、Linux版本以及Docker鏡像。
Windows版本下載地址
Windows版本下載后解壓到任意目錄下即可。里面包含了兩個可執行文件:hoverctl.exe 和 hoverfly.exe。
- hoverctl是一個命令行工具,可用于配置和控制Hoverfly。它允許你將Hoverfly作為守護程序運行。
- Hoverfly是完成大部分工作的應用程序。它提供代理服務器和Web服務器以及API端點。
可以使用以下命令查看版本號
hoverctl version hoverfly -version運行Hoverfly實例
hoverctl start查看日志
hoverctl logs停止Hoverfly
hoverctl stop創建微服務
讓我們使用spring boot來創建服務,以加快開發速度。
應用服務
添加一個Rest端點
創建一個RestController類,公開端點/service/hoverfly。這個端點被我們在此之后開發的客戶服務調用。為簡單起見,我們只返回一些硬編碼值,并在響應中添加響應時間。
@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());} }響應對象
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;} }驗證服務
將應用程序端口更改為9080。在application.properties文件中設置屬性
server.port = 9080啟動服務后,通過瀏覽器訪問http://localhost:9080/service/hoverfly可得到如下響應
{"message":"returned value from HoverflyActualServiceApplication","responseTime":"Thu Jan 17 17:03:52 CST 2019","transactionid":"56f3dec0-ce1f-4a94-95b7-2dee47b4b7fd" }客戶服務
同樣的方式新建一個消費者,創建一個RestController類公開端點/invoke。此端點方法將在內部調用我們剛剛開發的服務(hoverfly-actual-service)。
此外,我們在RestTemplate通過調用一個系統屬性mode來在創建bean時添加了一定的邏輯。如果mode=proxy,那么所有的請求將首先通過Hoverfly代理進行路由。否則所有對此的請求將直接進入實際服務。
請仔細觀察restTemplate()了解代理模式的方法。注意Hoverfly代理服務器將在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;} }驗證服務
此服務在本地的8080端口中運行。啟動時要注意帶上參數-Dmode=proxy。
訪問http://localhost:8080/invoke,得到響應:
Hoverfly演示
我們現在啟動本地Hoverfly,并將測試不同的模式,并將了解它在服務停機時的實際幫助。Hoverfly提供6種不同模式Capture,Simulate,Spy,Modify,Synthesize和Diff。我們只會在此演示中展示Capture和Simulate模式。
在捕獲模式下啟動Hoverfly
打開Hoverfly目錄(解壓縮目錄)的cmd窗口并鍵入hoverctl start命令。它將在本地工作站中啟動hoverfly,proxy mode在8500端口中啟動代理服務器,并將在8888端口啟動管理UI 。
現在鍵入命令以更改要捕獲的hoverfly模式。
hoverctl mode capture現在轉到瀏覽器http://localhost:8888/dashboard,它將顯示管理UI,我們也可以在其中更改模式,還可以看到已捕獲或模擬了多少請求。
捕獲請求
現在在瀏覽器窗口中運行客戶端服務幾次,而hoverfly處于捕獲模式。再次轉到管理界面,注意Capture計數器已增加到你在瀏覽器中訪問客戶端服務應用程序的次數。
導出/導入捕獲的請求
將模擬請求和響應存儲在其他地方是個好主意,我們不需要一直運行Hoverfly。每當我們需要它時,我們將導回已保存的請求/響應并開始模擬服務。
要導出,打開Hoverfly命令窗口并輸入命令:
hoverctl export simulations.json這將導出已捕獲的(在我們的情況下為3個事務)事務以及所有URL,請求等。一旦導出,文件將在主目錄中創建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"} }要導入simulations.json文件,可以鍵入命令以導入捕獲的定義。
hoverctl import simulations.json在模擬模式下測試
可使用命令轉到模擬模式,也可以在控制臺切換
hoverctl mode simulate然后可以做以下的步驟
- 在瀏覽器中打開客戶端應用程序并點擊刷新按鈕,看到瀏覽器中的響應沒有變化(通知響應時間和事務ID字段),這意味著Hoverfly處于活動狀態并發送與導入文件匹配的所有URL模式的響應。
- 轉到Hoverfly管理界面,看到模擬計數器已增加到在模擬模式下訪問客戶端應用程序的次數。
- 現在停止服務提供者并點擊客戶端應用程序,你可以很容易地看到Hoverfly模擬服務做出響應。在我們想要在實際服務停機時進行測試的實際場景中,這非常有用。
總結
今天我們已經學習了如何有效和輕松地使用服務虛擬化工具Hoverfly,并將其集成到我們的微服務生態系統中。我們只看到了Hoverfly的一些功能,更多細節請訪問官方文檔。
總結
以上是生活随笔為你收集整理的Hoverfly - 微服务虚拟化示例的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ObserveIT Client安装后屏
- 下一篇: 写模拟挂用什么工具?