<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                企業??AI智能體構建引擎,智能編排和調試,一鍵部署,支持知識庫和私有化部署方案 廣告
                # Hoverfly – 微服務虛擬化示例 > [https://howtodoinjava.com/microservices/hoverfly-microservices-virtualization-tutorial/](https://howtodoinjava.com/microservices/hoverfly-microservices-virtualization-tutorial/) [微服務](https://howtodoinjava.com/microservices/microservices-definition-principles-benefits/)虛擬化是一種模擬異構組件基于應用程序(例如 API 驅動的應用程序,基于云的應用程序或面向服務的體系結構)中特定組件行為的技術。 詳細了解[服務虛擬化](https://en.wikipedia.org/wiki/Service_virtualization)概念,并研究流行且有用的服務虛擬化工具 – [Hoverfly](https://hoverfly.io/) 。 另請參閱如何在 Hoverfly 將以仿真模式運行時如何使用 Hoverfly 以代理模式捕獲請求/響應并使用那些捕獲的響應。 ## 什么是微服務虛擬化? 如今,[云](https://howtodoinjava.com/cloud/java-cloud-development-introduction-and-tools/)應用程序使用大量微服務,這些微服務相互交互以完成某些業務功能。 在開發這類生態系統時,我們有時會遇到一些普遍的問題,這些問題通常會影響整個團隊的生產力,例如 * 生態系統中的所有服務目前可能不可用。 可能是其他團隊也在開發這些。 * 一些舊版服務并非免費擁有開發環境,否則可能會很昂貴,并且由于明顯的原因,我們不能使用正式版進行測試。 * 由于某些原因,某些服務可能會關閉。 * 管理測試數據的問題。 通常,要編寫適當的測試,您需要對模擬或存根中的數據進行細粒度的控制。 與多個團隊一起在大型項目中管理測試數據會引入影響交付時間的瓶頸。 因此,我們可以很容易地理解到,上述問題將影響當前產品的開發,并可能影響交付時間表,這與該產品的開發成本成正比。 那么有什么解決方案呢? * [我們可以考慮使用一些流行的模擬框架來模擬這些服務](https://howtodoinjava.com/powermock/mock-testing-using-powermock-with-junit-and-mockito/)。 它也有一些缺點,例如模擬通常是特定于場景的,并且要為這些服務創建模擬響應需要花費很多精力,并且模擬僅在單元測試階段才最適合([Junit](https://howtodoinjava.com/junit-5-tutorial/))。 * 我們可以使用存根(stubbed)服務,在其中我們將開發一些偽造的服務以及硬編碼的響應 – 同樣,這些偽造也是沒有意義的,因為我們需要開發一些東西來使這項工作有效。 * 現在又是幾天,我們需要在開發時進行持續集成,在這種情況下,模擬和存根服務都不是很好的選擇。 基于我們討論的常見問題,我們針對這些類型的相似技術,撰寫了一篇非常好的[ infoq 文章](https://www.infoq.com/articles/stubbing-mocking-service-virtualization-differences)。 由于模擬服務和存根服務都無法有效使用,因此,為了解決上述問題,我們采用了一種稱為服務虛擬化的技術,可以捕獲/模擬實際服務。 Hoverfly 是一種這樣的工具,它是使用新的 JVM 語言 GO 新開發的,它提供了非常簡單而現實的步驟來解決該問題。 為了更好的理解,下面是運行虛擬化服務時的時序圖。 ![](https://img.kancloud.cn/c1/b6/c1b68166a0ed41ec67fbd800c9822776_702x278.jpg) 捕獲模式下的 Hoverfly – 充當真實服務的代理服務 ![](https://img.kancloud.cn/09/83/0983d72398e1112fd9537cad92b2aa76_442x219.jpg) 模擬模式下的 Hoverfly – 無需實際服務即可直接響應 ## 示例概述 我們將按照給定的步驟演示 Hoverfly 作為服務垂直化工具的用法。 * 我們將創建一個小型的微服務生態系統,它們將彼此交互。 * 當處于捕獲模式時,我們將使用 Hoverfly 攔截實際的請求/響應。 * 最后,我們將了解 Hoverfly 如何在模擬模式下充當服務虛擬化服務器以發送回已捕獲的請求/響應。 * 我們還將檢查基本服務停機時間不會對我們的開發產生太大影響。 * 我們還將看到我們如何輕松切換 Hoverfly 以返回捕獲模式并將請求傳遞給實際服務。 #### 先決條件 在開始演示 Hoverfly 功能之前,請確保已安裝以下先決條件: * Hoverfly [安裝指南](https://hoverfly.readthedocs.io/en/latest/pages/introduction/downloadinstallation.html) * [JDK 8](https://howtodoinjava.com/java-8-tutorial/) * Eclipse * [Maven](https://howtodoinjava.com/maven/) ## 創建下游服務 讓我們[使用 Spring Boot](https://howtodoinjava.com/spring/spring-boot/spring-boot-tutorial-with-hello-world-example/) 創建服務,以縮短開發時間。 請按照以下步驟啟動此服務。 #### 創建 Spring Boot 項目 從[ spring 初始化器頁面](https://start.spring.io/)創建一個具有相關性(即`Web`和`Rest Repositories`)的 Spring Boot 項目。 如下所示,給出其他 Maven GAV 坐標并下載項目。 將項目解壓縮并將其作為`existing maven project`導入 Eclipse。 在此步驟中,使用命令`mvn clean install`重新構建 Maven,以便正確下載所有 Maven 依賴項。 #### 添加一個簡單的 REST 端點 添加一個`RestController`類,它將公開一個簡單的端點`/service/hoverfly`。 此端點將由我們在此之后開發的第二項服務消耗。 為簡單起見,我們只是返回一些硬編碼的值,并在響應中添加了響應時間。 ```java package com.example.hoverflyactualservice; import java.util.Date; import java.util.UUID; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @SpringBootApplication public class HoverflyActualServiceApplication { public static void main(String[] args) { SpringApplication.run(HoverflyActualServiceApplication.class, args); } } @RestController 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()); } } 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; } } ``` #### 驗證服務 使用屬性`server.port = 9080`將應用程序端口更改為`9080`。 通過運行命令`java -jar target\hoverfly-actual-service-0.0.1-SNAPSHOT.jar`作為 spring boot 應用程序啟動該項目。 服務器啟動后,轉到瀏覽器并測試此端點是否正常工作 – `http://localhost:9080/service/hoverfly` ![](https://img.kancloud.cn/ea/23/ea2346f56d544bc2a7452ad785c90c83_760x209.jpg) 瀏覽器中的下游服務響應 因此,我們的第一個下游微服務已啟動并正在運行。 現在,我們將創建第二個微服務,該微服務將調用該服務。 ## 創建客戶服務 再次按照上述步驟創建此服務。 在 eclipse 中導入項目后,添加控制器代碼。 #### 添加 REST 端點 添加一個`RestController`類,它將公開一個簡單的端點`/invoke`。 該終結點方法將在內部調用我們剛剛開發的下游服務(`hoverfly-actual-service`)。 另外,我們在通過使用一個稱為`mode`的系統屬性創建`RestTemplate` bean 時添加了邏輯。 如果我們在啟動服務時傳遞`mode=proxy`,則對此的所有請求將首先通過 Hoverfly 代理路由。 如果我們通過`mode=production`,則對此的所有請求將直接轉到實際服務中。 請仔細觀察`restTemplate()`方法以了解代理模式。 注意 Hoverfly 代理服務器將在`http://localhost:8500`上運行。 ```java package com.example.hoverflyactualserviceclient; import java.net.InetSocketAddress; import java.net.Proxy; import java.net.Proxy.Type; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.context.annotation.Bean; import org.springframework.core.ParameterizedTypeReference; import org.springframework.http.HttpMethod; import org.springframework.http.client.SimpleClientHttpRequestFactory; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.client.RestTemplate; @SpringBootApplication public class HoverflyActualServiceClientApplication { public static void main(String[] args) { SpringApplication.run(HoverflyActualServiceClientApplication.class, args); } } @RestController class TestController { private static final int HOVERFLY_PORT = 8500; private static final String HOVERFLY_HOST = "localhost"; private static final String PROXY = "proxy"; @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; } @Bean public 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 hoverfly server!!!!"); template = new RestTemplate(requestFactory); } else { System.out.println("######### Running application in PRODUCTION mode so that we can use simulated hoverfly server!!!!"); template = new RestTemplate(); } return template; } @Autowired RestTemplate restTemplate; } ``` #### 驗證服務 該服務在本地的默認端口`8080`中運行。 使用命令`mvn clean install`進行 Maven 構建,并通過運行命令`java -jar -Dmode=proxy target\hoverfly-actual-service-client-0.0.1-SNAPSHOT.jar`作為 Spring Boot 應用程序啟動該項目。 在代理模式下啟動服務時,請不要傳遞`-Dmode=proxy`。 在生產等實際環境中,我們不會傳遞此參數。 在瀏覽器中調用 API。 `http://localhost:8080/invoke` ![](https://img.kancloud.cn/35/41/3541491579c9c649e6ff81960d227473_609x243.jpg) 客戶端服務以代理方式運行 因此,我們還開發了客戶端應用程序,我們還可以測試客戶端服務并從下游服務獲得響應。 我們還在客戶端代碼中正確配置了 Hoverfly 代理服務器,以便接下來可以輕松集成 hoverfly。 ## Hoverfly 演示 現在,我們將在本地啟動 Hoverfly,并測試不同的模式,并查看它在服務停機時的實際作用。 Hoverfly 提供 4 種不同的模式,`capture`,`simulate`,`modify`和`synthesize`。 在此演示中,我們僅尋找`capture`和`simulate`模式。 #### 在捕獲模式下啟動 Hoverfly 打開一個指向 Hoverfly 目錄(未壓縮目錄)的命令窗口,然后鍵入`hoverctl start`命令。 它將在`proxy mode`的本地工作站中啟動 hoverfly,并在`8888`的端口中啟動 admin UI,并在`8500`的端口中啟動代理服務器。 現在,在同一命令提示符中鍵入`hoverctl mode capture`以更改 hoverfly 模式以捕獲。 在這兩個命令之后,命令提示符窗口將類似于: ![](https://img.kancloud.cn/99/5d/995d6256528f2aca63c26575b42e6b23_701x206.jpg) 在捕獲模式下啟動 Hoverfly 現在轉到瀏覽器`http://localhost:8888/dashboard`,它將顯示管理 UI,我們還可以在其中更改模式,還可以看到已捕獲或模擬了多少個請求。 ![](https://img.kancloud.cn/4a/ac/4aacb5145edd51da626013dc64a0faec_1365x702.jpg) Hoverfly 管理員界面 #### 捕獲請求/響應 現在有了這些設置,當 hoverfly 處于捕獲模式時,在瀏覽器窗口中運行[客戶端服務](http://localhost:8080/invoke)幾次。 現在,再次進入管理用戶界面,請注意,捕獲計數器已增加到您在瀏覽器中訪問客戶端服務應用程序的次數。 ![](https://img.kancloud.cn/c9/99/c999edbbf549d5fa39c9a77ccafd3f4c_1365x705.jpg) Hoverfly 已捕獲事務 #### 導出/導入捕獲的請求 將模擬的請求和響應存儲在其他位置是個好主意,因此我們不必一直運行 Hoverfly。 每當我們需要它時,我們都將導入保存的請求/響應并開始模擬服務。 現在,我們將捕獲的請求導出到 JSON 文件中,然后將該文件導入 Hoverfly,并以仿真模式啟動 Hoverfly。 要導出,請打開 Hoverfly 命令窗口并鍵入`hoverctl export simulations.json`命令,這將已捕獲(在本例中為 3 個事務)連同所有 URL,請求等一起導出到 json 文件`simulations.json`中。導出后,該文件將被導出。 在 hoverfly 的主目錄中創建。 ![](https://img.kancloud.cn/1a/ac/1aac5abe71d111d650adc7f09514dd34_862x316.jpg) 導出到 JSON 文件 要導入回`simulations.json`文件,可以鍵入`hoverctl import simulations.json`命令以導入捕獲的定義。 導入后,我們將通過`hoverctl mode simulate`命令將 Hoverfly 模式更改為`simulate`。 我們也可以從 Hoverfly 管理員界面頁面執行此操作。 ![](https://img.kancloud.cn/70/3d/703df76ac2b7225bf86061958cb0a6c3_883x346.jpg) 導入/導出和模擬命令 現在我們準備將 Hoverfly 模式切換為`simulate`并進行測試。 #### 在模擬模式下測試 使用此命令`hoverctl mode simulate`進入模擬模式。 執行以下簡單步驟: * 在瀏覽器中打開[客戶端應用程序](http://localhost:8080/invoke),然后點擊刷新按鈕,查看響應在瀏覽器中沒有變化(注意響應時間和事務 ID 字段),這意味著 Hoverfly 處于活動狀態,并正在發送響應給所有與導入文件匹配的 URL 模式。 * 無需進入 Hoverfly 管理界面并查看**模擬計數器已增加**到在模擬模式下訪問客戶端應用程序的次數。 * 現在停止下游服務并單擊客戶端應用程序,您可以輕松地看到 Hoverfly 代表模擬的下游服務進行響應。 在我們要在實際服務中斷時測試功能的實際情況中,這很棒,并且確實有幫助。 * 再次啟動下游服務,并將 Hoverfly 的模式從命令提示符或管理界面更改為`capture`,并看到對客戶端服務的任何請求都被往返,直到下游服務和 Hoverfly 的捕獲計數器增加。 因此,很容易在`capture`與`simulate`模式之間進行切換,這對于我們要捕獲下游服務的新型請求是必需的。 ![](https://img.kancloud.cn/64/9e/649ea9870905af60ee1e24d0f31d551c_1355x671.jpg) Hoverfly 模擬響應 ## 總結 因此,今天我們了解了如何有效,輕松地使用服務虛擬化工具 Hoverfly 并將其集成到我們的微服務生態系統中。 我們只看到了極少數的 Hoverfly 功能,有關更多詳細信息,請訪問其漂亮的[文檔](https://hoverfly.readthedocs.io/en/latest/index.html)。 我建議您在下一個應用程序設計中考慮它。 你會喜歡它。 [下載源碼](https://howtodoinjava.com/wp-content/uploads/2017/08/Hoverfly.zip) 學習愉快!
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看