1. 程式人生 > >微服務應用-基於Spring Cloud和Docker構建電影推薦微服務

微服務應用-基於Spring Cloud和Docker構建電影推薦微服務

前言

最近為了擴充套件自己對雲應用的理解,找了好多基於Spring Cloud的demo,下面推薦兩個開源社群專案:spring-cloud-microservice-example(基於Spring Cloud和Docker構建電影推薦微服務)和spring-cloud-event-sourcing-example(基於Spring Cloud和Reactor實現Event Sourcing構建網上商店微服務),我會相繼寫出作者專案部落格的翻譯文件,考慮外網問題,我將原英文文件pdf上傳到資源裡了,如果你對原文感興趣,可以下載看看。

使用Spring Cloud和Docker構建電影推薦微服務

如果你對雲應用很瞭解,可以直接移步下載執行專案(https://github.com/kbastani/spring-cloud-microservice-example),或跳轉到部署步驟。

本部落格系列將向你介紹一些使用Spring Cloud和Docker構建微服務平臺的基本概念。

什麼是Spring Cloud?

Spring Cloud 是Pivotal提供的用於簡化分散式系統構建的工具集。Spring Cloud引入了雲平臺聯結器(Cloud Connector)和服務聯結器(Service Connector)的概念。雲平臺聯結器是一個介面,需要由雲平臺提供者進行實現,以便庫中的其他模組可以與該雲平臺協同工作。

在Spring Cloud提供的解決方案中,你將會發現如下的內容:

Spring Boot

Spring Cloud最重要的一點是它可以和Spring Boot一起工作,Spring Boot可以幫助開發者更容易地建立基於Spring的應用程式和服務。

從Spring Boot專案名稱中的Boot就可以看出來,Spring Boot的作用在於建立和啟動新的基於Spring框架的專案。Spring Boot會選擇最適合的Spring子專案和第三方開源庫進行整合。大部分Spring Boot應用只需要非常少的配置就可以快速執行起來。Spring Boot包含的特性如下:

  • 建立可以獨立執行的Spring應用。
  • 直接嵌入Tomcat或Jetty伺服器,不需要部署WAR檔案。
  • 提供推薦的基礎POM檔案來簡化Apache Maven配置。
  • 儘可能的根據專案依賴來自動配置Spring框架。
  • 提供可以直接在生產環境中使用的功能,如效能指標、應用資訊和應用健康檢查。
  • 沒有程式碼生成,也沒有XML配置檔案。

服務發現和智慧路由

每一個服務都含有一個特定意義的微服務架構。當你在Spring Cloud上構建微服務架構時,這裡有幾個基本概念需要首先澄清下。首先,你需要要先建立Configuration Service和Discovery Service兩個基礎服務。如下圖所示:


上面的圖片說明了四個微服務以及各個服務之間的依賴關係:

  • Configuration service處於最頂端,黃色標識,而且被其它微服務所依賴;
  • Discovery service處於最低端,藍色標識,同時也被其它服務所依賴;
  • 綠色標識的兩個微服務是我們本系列博文中用到的兩個應用案例:電影和觀影建議。

配置服務

Configuration Service(配置服務)在微服務架構中是一個非常重要的元件。如12要素理論所說, 微服務應用的配置應該儲存在環境中,而不是本地專案中。Configuration service是一個必不可少的基礎元件的原因是因為它可以對所有通過點對點和檢索的基礎服務進行服務管理。

假設我們有多個部署環境。比如我們有一個臨時環境和一個生產環境,針對每個環境的配置將會是不同的。每一個configuration service 將會由一個獨立的Git倉庫來存放環境配置。沒有其它環境能夠訪問到這個配置倉庫,它只是提供該環境中執行的配置服務罷了。


當Configuration service啟動後,它將會指向那些根據配置檔案配置的路徑並啟動對應服務。每一個微服務通過讀取自己配置檔案中的具體環境來執行。在這一過程中,配置是通過版本管理來進行的內部和集中化管理,更改配置不需要重啟服務。

通過Spring Cloud提供的服務終端,你可以更改環境配置,並向Discovery service(發現服務)傳送一個重新整理訊號,所有的使用者都會收到新的配置通知。

發現服務

Discovery Service(發現服務)是另一個重要的微服務架構的元件。Discovery Service管理執行在容器中的眾多服務例項,而這些例項工作在叢集環境下。在這些應用中,我們使用客戶端的方式稱之為從服務到服務。舉個例子,我使用Spring Cloud Feign ,這是一個基於Restful風格的微服務提供的客戶端開源專案,它是從Netflix OSS project專案中派生出來的。

@FeignClient("movie")
public interface MovieClient {
@RequestMapping(method = RequestMethod.GET, value = "/movies")
PagedResources findAll();

@RequestMapping(method = RequestMethod.GET, value = "/movies/{id}")
Movie findById(@RequestParam("id") String id);

@RequestMapping(method = RequestMethod.POST, value = "/movies",
  produces = MediaType.APPLICATION_JSON_VALUE)
void createMovie(@RequestBody Movie movie);
}
在上面的例子中,我建立了一個Feign 客戶端,並映射了一個REST API方法來暴露電影服務。使用@FeignClient註解,可以宣告我想要為movie微服務而建立的客戶端API。接下來我聲明瞭一個我想要實現的服務對映。通過在方法上宣告一個URL規則來描述一個REST API的路由規則。

更令人興奮的是,這一切在Spring Cloud中都很容易,我所要做的僅僅是知道service ID來建立我的Feign 客戶端。服務的URL地址在執行時環境是自動配置的,因為每一個在叢集中的微服務將會在啟動時通過繫結serviceid的方式來進行註冊。

微服務架構中的其它服務,也是通過上面提到的方式執行。我只需要知道進行通訊服務的serviceid,所有的操作都是通過Spring自動繫結的。

API 閘道器

API Gateway 服務是Spring Cloud的另一個重要元件。它可以用來管理叢集服務中的領域實體。下圖的綠色六邊形是我們提供的資料驅動服務,主要用來管理自己的實體類和資料庫。通過新增API Gateway服務,我們可以為通過下面綠顏色的服務為每一個API路由建立一個代理暴露介面。


假設推薦服務和電影服務都暴露他們自己的REST API在自己管理的域實體上。API gataway通過discovery service和從其它服務注入的基於代理路由的 API方法。通過這種方式,包括推薦服務和電影服務將擁有一個完整定義的路由,通過暴露的REST API獲得本地的微服務。API Gateway將會重定義路由請求到服務例項,這些請求都是基於HTTP的。

示例專案

我已經在GitHub(https://github.com/kbastani/spring-cloud-microservice-example)上建立了一個例項專案,這個專案是一個端到端的原生雲平臺,使用Spring Cloud構建實際的微服務架構。

基本概念:

  • 使用Docker進行整合測試
  • 混合持久化
  • 微服務架構
  • 服務發現
  • API閘道器

Docker

使用Docker對每一個服務進行構建和部署。使用Docker Compose在一個開發機上進行端到端的整合測試。

混合持久化

混合持久化其實就是說使用多種資料庫來儲存。不同的微服務例項都會使用它們自己的資料庫,並通過REST服務或者訊息匯流排來通訊,舉個例子,你可以使用基於以下資料庫來構建微服務:

Neo4j(圖形化)

MongoDB(文件化)

MySQL(關聯)

微服務架構

這個例子演示瞭如何使用微服務建立一個新的應用。由於在專案中的每一個微服務只有一個單一的父專案。開發者為此得到的收益是可以在本機上執行和開發每一個微服務。新增一個新的微服務非常簡單,當發現微服務時將會自動發現執行時的叢集環境上。

發現服務

專案中包含兩個發現服務,一個是Netflix Eureka,另一個使用了Consul from Hashicorp。多種發現服務提供了多種選擇,一個是使用(Consul)來做DNS服務叢集,另一個是(Eureka)基於代理的API 閘道器。

API 閘道器

每一個微服務都關聯Eureka,在整個叢集中檢索API路由。使用這個策略,每一個在叢集上執行的微服務只需要通過一個共同的API閘道器進行負載均衡和暴 露介面,每一個服務也會自動發現並將路由請求轉發到自己的路由服務中。這個代理技術有助於開發使用者介面,作為平臺完整的API通過自己的主機對映為代理服 務。

Docker 例項

下面的例項將會通過Maven來構建,使用Docker為每一個微服務構建容器映象。我們可以很優雅的使用Docker Compose在我們自己的主機上搭建全部的微服務叢集。

開始構建

在這之前,請先移步至專案的GitHub 倉庫。

https://github.com/kbastani/spring-cloud-microservice-example
克隆或者fork這個專案並且把原始碼下載到自己的電腦上。下載完畢後,你需要使用Maven和Docker來編譯和構建本地的容器映象。

下載Docker

首先,如果你還沒有Docker請先下載它。可以跟隨這個指南(https://docs.docker.com/compose/install/)來獲取Docker,然後在開發機上安裝並執行。

當然你也需要安裝Docker Compose,這個指南(https://docs.docker.com/compose/install/)將會幫到你。如果你使用的Mac OSX或者boot2docker,請確保在虛擬機器上你給boot2docker提供的記憶體至少是5GB,下面這個命令能幫助你這麼做:

$ boot2docker init --memory=5000

環境要求

能夠執行例項程式,需要在你的開發機上安裝下面的軟體:

  • Maven 3
  • Java 8
  • Docker
  • Docker Compose

構建專案

通過命令列方式來構建當前專案,在專案的根目錄中執行如下的命令:

$ mvn clean install
專案將會根據pom.xml中的每一個專案宣告中下載相應的依賴jar包。每一個服務都將會被構建,同時Maven的Docker外掛將會自動從本地Docker Registry中構建每一個容器映象。Docker將會在構建成功後,根據命令列執行mvn clean install來清除相應的資源。

在專案成功構建後,你將會看到如下的輸出:

[INFO] ------------------------------------------------------------------[INFO] Reactor Summary:
[INFO]
[INFO] spring-cloud-microservice-example-parent .......... SUCCESS [ 0.268s ]
[INFO] users-microservice ................................ SUCCESS [ 11.929s ]
[INFO] discovery-microservice ............................ SUCCESS [ 5.640s ]
[INFO] api-gateway-microservice .......................... SUCCESS [ 5.156s ]
[INFO] recommendation-microservice ....................... SUCCESS [ 7.732s ]
[INFO] config-microservice ............................... SUCCESS [ 4.711s ]
[INFO] hystrix-dashboard ................................. SUCCESS [ 4.251s ]
[INFO] consul-microservice ............................... SUCCESS [ 6.763s ]
[INFO] movie-microservice ................................ SUCCESS [ 8.359s ]
[INFO] movies-ui ......................................... SUCCESS [ 15.833s ]
[INFO] ------------------------------------------------------------------[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------

通過Docker compose 啟動叢集

現在每一個映象都成功構建完畢,我們使用Docker Compose來加速啟動我們的叢集。我已經將Docker Compose的yaml檔案包含進了專案中,大家可以從GitHub上獲取。

現在我們通過下面的命令列啟動微服務叢集:

$ docker-compose up
如果一切配置都是正確的,每一個容器映象將會通過在Docker上的虛擬容器和自動發現的網路服務來執行。當他們開始順序啟動時,你將會看到一系列的日誌輸出。這可能需要一段時間來完成,取決於執行你例項程式的機器效能。

一旦容器啟動成功,你將會通過Eureka主機看到通過Discovery service註冊上來的應用服務,通過命令列終端複製貼上下面的命令到Docker中定義的$DOCKER_HOST環境變數中。

$ open $(echo \"$(echo $DOCKER_HOST)\"|
	\sed 's/tcp:\/\//http:\/\//g'|
	\sed 's/[0-9]\{4,\}/8761/g'|
	\sed 's/\"//g')
如果Eureka正確的啟動,瀏覽器將會啟動並開啟Eureka服務的儀表盤,如下圖所示:


我們將會看到每一個正在執行的服務例項和狀態。通過下面的命令來獲取資料驅動服務,例如 movie 服務。

$ open $(echo \"$(echo $DOCKER_HOST)/movie\"|
        \sed 's/tcp:\/\//http:\/\//g'|
        \sed 's/[0-9]\{4,\}/10000/g'|
        \sed 's/\"//g')

這個命令將會訪問根據導航閘道器終端提供的代理方式訪問movie服務的REST API終端。這些REST API使用HATEOAS 來配置,它是一個通過內嵌連結的方式支援自動發現服務的介面。

{
  "_links" : {
"self" : {
  "href" : "http://192.168.59.103:10000/movie"
},
"resume" : {
  "href" : "http://192.168.59.103:10000/movie/resume"
},
………… 

"autoconfig" : {
  "href" : "http://192.168.59.103:10000/movie/autoconfig"
}
  }
}

總結

這是使用Spring Cloud和Docker構建微服務架構的系列博文的第一部分。在本文中,我們接觸到了如下的概念:

  • Service Discovery
  • Externalized Configuration
  • API Gateway
  • Service Orchestration with Docker Compose

在這之後的博文中,我們將會演示如何使用後臺服務來構建前端應用程式,同時也會介紹一個混合性持久化的例項,使用MySQL和Neo4j。

特別感謝

省略。