簡體   English   中英

微服務 - 存根/模擬

[英]Microservices - Stubbing/Mocking

我正在使用微服務開發產品,但遇到了一些問題。 為了完成任何工作,我需要在本地開發環境中運行所有 9 個服務。 我正在使用 Cloud Foundry 來運行應用程序,但是在本地運行時,我只是在運行 Spring Boot Jars 本身。 有沒有辦法設置一個更輕量級的環境,這樣我就不需要一切都在運行? 理想情況下,我只希望我目前正在從事的服務必須是真實的。

我相信這是您的測試策略問題。 如果您的系統中有很多微服務,那么在開發時總是執行端到端測試是不明智的——這會降低您的生產力,而且設置通常很復雜(就像您觀察到的那樣)。

你真的應該考慮一下你想要測試的東西是什么。 在一個服務中,將核心邏輯和與其他服​​務的集成點解耦通常是好的。 理想情況下,您應該能夠為核心邏輯編寫簡單的單元測試。 如果您想測試與其他服務的集成點,請使用模擬庫(快速谷歌搜索表明這是有希望的http://spring.io/blog/2007/01/15/unit-testing-with-stubs-and-mocks / )

如果您還沒有,我強烈建議您設置一個單獨的暫存區,所有微服務都在運行。 在部署到生產之前,您應該在那里執行所有端到端測試。

Martin Fowler 的這篇文章對微服務測試策略有更全面的看法:

https://martinfowler.com/articles/microservice-testing

它歸結為您使用的測試技術。 這是我最近在另一個主題中的回答,您可以找到有用的https://stackoverflow.com/a/44486519/2328781

總的來說,我認為Wiremock是一個不錯的選擇,原因如下:

  1. 它具有Spring Boot開箱即用的支持
  2. 它具有Spring Cloud Contract的開箱即用支持,這使得使用一種稱為 消費者驅動合同的非常強大的技術成為可能。
  3. 它具有錄音功能 將您的 Wiremock 設置為代理並通過它發出請求。 這將根據您的請求和響應自動為您生成存根。

有多種工具可讓您創建微服務的模擬版本。

當我自己遇到這個確切的問題時,我決定創建自己的工具,該工具專為微服務測試量身定制。 目標是永遠不必一次運行所有微服務,只運行您正在處理的微服務。

您可以在此處閱讀有關該工具以及如何使用它來模擬微服務的更多信息: https ://mocki.io/mock-api-microservices。 如果您只想在本地運行它們,可以使用開源 CLI 工具

如果您的微服務允許與請求一起傳遞元數據,則可以解決這個問題。

好的微服務架構應該使用中央服務發現,每個服務也應該能夠獲取元數據映射和請求負載。 該地圖的已知字段可以由服務以某種方式解釋和修改,然后傳遞給下一個服務。

每個請求元數據最流行的用法是請求跟蹤(即收集用於處理此請求的節點樹和每個節點的時間),但它也可用於告訴整個系統要使用哪些節點

因此計划是

  1. 在開發環境服務發現中注冊您的本地節點
  2. 將請求連同元數據一起發送到系統的入口節點,告訴每個人使用您的本地服務實例而不是默認服務實例
  3. 元數據將傳播,您的本地節點將被開發環境調用,然后本地節點將處理后的結果傳遞回開發環境

或者:

  • 使用代碼生成進行服務間通信,以降低因 RPC 代碼錯誤而導致失敗的風險
  • 訴諸集成測試,模擬正在開發的微服務的所有客戶端 API
  • 將您的系統完全自動化地部署到您的本地機器。 您可能需要運行內存減少的節點(這通常是可以的,因為內存通常僅在負載下消耗)或購買更多 RAM。

一種方法是使用/部署一個將路徑/網址映射到 json 響應文件的應用程序。 我個人沒有使用過它,但我相信http://wiremock.org/可能會幫助你

對於 java 微服務,您應該嘗試Stybby4j 這將使用 Stubby 服務器模擬其他微服務的 json 響應。 如果您覺得mocking 不足以映射您的微服務的所有功能,您應該設置一個本地docker 環境來部署依賴的微服務。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM