1. 程式人生 > >微服務詳解(六):部署與測試

微服務詳解(六):部署與測試

獨立部署和使用諸如Docker的容器來部署微服務,使用Docker將專案部署到AWS上。

可以利用Docker或者任何其他容器,可以簡化部署;

1.使用Netflix OSS的微服務架構概述

Netflix是微服務架構中的先鋒,通過他們的開放原始碼軟體中心(Open Source Software Center,OOS)開源它們的大多數微服務工具,為推廣微服務做出了巨大的貢獻;

Spring藉此機會,將許多Netflix開方原始碼軟體專案,如Zuul、Ribbon、Hystrix、Eureka Server和Turbine,都整合到Spring Cloud中。這是Spring Cloud能夠為開發可用於生產的微服務提供現成平臺的原因之一;

  1. 邊緣伺服器:使用Netflix Zuul Server作為邊緣伺服器;
  2. 負載均衡:Netflix Ribbon作為負載均衡;
  3. 電路斷路器:Netflix Hystrix用作電路斷路器和幫助保持系統執行;
  4. 服務發現和註冊:Netflix Eureka伺服器用於服務發現和註冊;
  5. 監控儀表板:Hystrix儀表板與Netflix Turbine結合用於微服務監控。它提供了一個儀表板來檢查執行中的微服務的健康狀況;

2.負載均衡

如果要以速度快、容量利用率最大化的方式為請求提供服務,就需要實現負載均衡,這樣可以確保沒有伺服器的請求超負荷。如果一臺伺服器出現故障,負載均衡器會將請求定位到其餘的主機伺服器上。在微服務架構中,微服務可以為內部或者外部請求提供服務。在此基礎上,我們可以有兩種型別的負載均衡——客戶端負載均衡和伺服器端的負載均衡;

1.客戶端的負載均衡

微服務需要在程序之間進行通訊,以便服務可以互相交流。Spring  Cloud使用Netflix Ribbon承擔負載均衡器這個至關重要的角色。並可以處理HTTP和TCP客戶端負載。

在Spring Cloud中,Ribbon在預設情況下與Eureka伺服器整合。這種整合提供以下功能:

Spring Cloud中有使用Ribbon的不同客戶端,如RestTemplate或者FeignClient。這些客戶端允許微服務間相互通訊。使用Eureka伺服器的時候,客戶端使用例項ID代替主機名和埠用於HTTP向服務例項發出呼叫。客戶端把服務ID傳給Ribbon,Ribbon然後使用負載均衡器獲取Eureka伺服器例項;

如果存在多個Eureka的例項,則Ribbon基於負載均衡的演算法,只為請求獲取一個例項;

可以使用DiscoverClient來查詢Eureka伺服器中可用的服務的所有例項;

2.伺服器端的負載均衡

Netflix Zuul Server作為邊緣伺服器,Zuul是一個基於JVM的路由器和伺服器端的負載均衡器。Zuul支援用任何JVM語言來編寫規則和過濾條件並具有內建的Java和Groovy的支援;

UI和其他客戶端呼叫邊緣伺服器,它使用application.yml中定義的路由,呼叫內部服務並提供響應。它充當代理伺服器、承擔內部網路的閘道器,併為定義和配置的路由呼叫內部服務。

在Spring Cloud中配置和使用邊緣伺服器非常的簡單。

步驟如下:

  1. 在pom.xml中定義zuul伺服器依賴項:

spring-cloud-starter-zuul

  1. 在應用程式中使用@EnableZuulProxy註解。它還會在內部使用@EnableDiscoveryClient:因此它也會自動註冊到Eureka伺服器。
  2. 在application.yml中更新zuul的配置:

zuul:ignoredServices:這跳過服務的自動新增。

zuul:routes:這包含定義URI模式的path屬性;

3.電路斷路器與監控

在微服務中,使用這個概念,稱為電路斷路器的設計模式。它跟蹤Eureka伺服器等外部服務、餐館服務等API服務的可用性,並防止服務使用者在任何不可用的服務上執行任何操作;

這是微服務架構的另一個方面,當服務不能響應服務者的時候的一項安全措施(故障安全機制)——電路斷路器;

使用Netflix Hystrix作為電路斷路器,在發生故障的時候(由於通訊錯誤或者超時),它呼叫服務使用者的內部回退方法,它嵌入在其服務的使用者中執行。

1.使用Hystrix的回退方法

為了實現回退的方法,需要採取三個步驟:

  1. 啟用斷路器:使用其他服務的微服務的主類應該使用@EnableCircuitBreaker註解
  2. 配置回退的方法:使用@HystrixCommand註解來配置fallbackMethod
  3. 定義回退方法:處理故障和安全執行步驟的一個方法,此方法就是fallbackMethod指定的方法;

這些步驟就可以完成對服務呼叫的故障保護,並向服務使用者返回更為合適的響應;

2.監控

Hystrix提供web使用者介面的儀表板,

Netflix Turbine是一個web應用程式,它連線到叢集中Hystrix應用程式的例項並會實時聚合資訊。Turbine使用一個稱為Turbine流的流來提供資訊。

Netflix Hystrix和Turbine使用RabbitMQ這個開源訊息佇列軟體。RabbitMQ使用高階訊息佇列協議(Advance Messaging Queue Protocal,AMQP)工作。可以在這個軟體中定義任何型別的資訊。可以在RabbitMQ佇列中儲存訊息,直到接收應用程式連線到它並接收此訊息為止(將訊息從佇列中取走);

Hystrix使用RabbitMQ來發送饋送給Turbine的度量資料。

在配置Hystrix和Turbine前,請在你的平臺上安裝RabbitMQ應用程式。Hystrix和Turbine使用RabbitMQ在兩者之間進行通訊;

3.設定Hystrix儀表板

在Spring Cloud中配置Hystrix儀表板只需要以下幾步:

  1. 在pom.xml中定義Hystrix儀表板的依賴:

spring-cloud-starter-hystrix-dashboard

  1. 使用主Java類中的@EnableHystrixDashboard註解完成了全部的工作。也是用@Controller註解把來自根的請求轉發到Hystrix;
  2. 在application.yml中更新Dashboard應用程式配置;

4.設定Turbine

步驟如下:

  1. 為Turbine再建立一個Maven依賴項。spring-cloud-starter-turbine-amqp
  2. 在應用程式類中使用@EnableTurbineAmqp註解;定義一個返回RabbitMQ的工廠bean
  3. 在application.yml中更新Turbine配置;

server:port:HTTP使用的主埠

management:port:Turbine執行器端點的埠

4.使用容器部署微服務

Docker容器提供輕量級的執行時環境,它由虛擬機器的核心功能和一個稱為Docker映像的隔離的作業系統組成。Docker使得包裝和執行微服務更加容器、順暢。每個作業系統可以有多個Docker,並且每個Docker都可以執行多個應用程式;

1.安裝和配置

如果不是Linux作業系統,那麼Docker需要一臺虛擬化的伺服器。可以安裝VirtualBox或者類似的工具。

首先在平臺上安裝Docker

1.具有4GB記憶體的Docker機器

預設情況下建立的機器都具有2G的記憶體,可以設定具有4G的記憶體的Docker;

2.使用Maven構建Docker映像

有各種Docker maven外掛可以用來構建映像:

  1. https://github.com/rhuss/docker-maven-plugin
  2. https://github.com/alexec/docker-maven-plugin
  3. https://github.com/spotify.docker-maven-plugin

推薦使用第一種,它提供了很多額外的功能;

在討論docker-maven-plugin的配置之前,我們首先需要介紹application.yml中的Docker Spring配置檔案。在為各種平臺構建服務的時候,它將使我們的工作變得更加容易。

需要配置如下四個屬性:在application.yml中

  1. 使用確定為Docker的Spring配置檔案;
  2. 嵌入式Tomcat的埠之間不會有任何衝突,因為服務將在自己各自的容器內執行。
  3. 在Eureka中使用服務的IP地址,因此Eureka例項屬性preferIpAddress將被設定為true;
  4. 在serviceUrl:defaultZone中使用Eureka伺服器主機名;

在生成Docker容器JAR的時候,還將在pom.xml中新增以下程式碼來啟用Spring配置檔案Docker

構建服務的時候只需要使用Maven Docker配置檔案:

mvn -P docker clean package

配置docker-maven-plugin生成微服務的映像。

這個外掛必須首先建立一個Dockerfile。Dockerfile是在兩個地方配置的,一個是pom.xml和docker-assembly.xml中。

在pom.xml中可以建立一個基於某一個Java版本的映像的Dockerfile

配置docker-assembly.xml,它告訴外掛應將哪些檔案放入到容器中。

【生成Docker映像】

mvn docker:build

【使用命令驗證本地儲存庫中的映像】

docker run -it -p 8080:8080 sourabhh/

使用-it代替-d在前臺執行此命令;

3.使用Maven執行Docker

如果要使用Maven來執行Docker映像,需要在pom.xml中新增以下的配置項。把<run>塊放在pom.xml檔案docker-maven-plugin部分的image塊下標記To Do的地方

Docker Maven外掛通過輪詢管理的ping URL,直到它接收到一個回覆可以檢測容器是否已經完成啟動;

注意:如果是在Windows或者Mac OS上使用DockerToolBox,Docker主機不是localhost,可以通過docker-mechine ip default檢查Docker映像的IP,它也在啟動的時候顯示;

Docker容器準備就緒,使用Maven來啟動:

mvn docker:start

4.使用Docker執行整合測試

啟動和停止Docker容器可以通過將以下執行塊繫結到早pom.xml中的docker-maven-plugin生命週期階段來完成;

一個簡單的整合測試程式碼:

@Category(DockerIntegrationTest.class)

5.把映像推送到登錄檔

在docker-maven-plugin下新增下列標記把Docker映像釋出到Docker Hub:

<execution>

       <id>push-to-docker-registry</id>

       <phase>deploy</phase>

       <goals>

              <goal>push</goal>

</goals>

</execution>

可以配置maven-deploy-plugin跳過JAR釋出

在Docker Hub釋出一個Docker映像需要一個使用者民和密碼

也可以將一個Docker映像推送到自己的Docker寄存處中。需要新增docker.registry.name標記。

6.管理Docker容器

每個微服務都將有自己的Docker容器。因此,我們將使用Docker Compose這個Docker容器管理器來管理我們的容器;

Docker Compose將幫助我們指定容器的數量和如何執行這些容器。

我們可以指定Docker映像、埠和每個容器到其他Docker容器的連結;

如果你還沒有設定docker本地寄存處,請先做這個工作,以便問題較少或者更順暢的執行;

構建docker的本地寄存:

然後對本地映像執行push和pull命令

最後執行docker-compose

一旦所有的微服務容器都被配置完成,我們就可以使用單個命令啟動所有的Docker容器;