天天看點

使用Spring Cloud和Docker建構微服務

本文講的是<b>使用Spring Cloud和Docker建構微服務</b>,【編者的話】這是系列博文中的第一篇,本文作者使用Spring Cloud和Docker建構微服務平台,文章的例子淺顯易懂。

本系列博文主要向大家介紹如何使用Spring Cloud和Docker建構微服務平台。

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

<a href="http://12factor.net/config">Configuration Service</a>

<a href="https://en.wikipedia.org/wiki/Service_discovery">Discovery Service</a>

<a href="http://martinfowler.com/bliki/CircuitBreaker.html">Circuit breakers</a>

<a href="https://en.wikipedia.org/wiki/Distributed_cache">Distributed sessions</a>

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兩個基礎服務。如下圖所示:

<a href="http://dockerone.com/uploads/article/20150720/eaf8592777e2dc431f25e744ae793553.png" target="_blank"></a>

上面的圖檔說明了四個微服務以及各個服務之間的依賴關系。

Configuration service處于最頂端,黃色辨別,而且被其它微服務所依賴。

Discovery service處于最低端,藍色辨別,同時也被其它服務所依賴。

綠色辨別的兩個微服務是我們本系列博文中用到的兩個應用案例:電影和觀影建議。

Configuration Service

Configuration service(配置服務)是一個必不可少的基礎元件的原因是因為它可以對所有通過點對點和檢索的基礎服務進行服務管理。

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

<a href="http://dockerone.com/uploads/article/20150720/0d9ef3b0ca532dfbcc76d3aea5394f7c.png" target="_blank"></a>

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

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

Discovery Service

在上面的例子中,我建立了一個<code>Feign</code> 用戶端,并映射了一個<code>REST API</code>方法來暴露電影服務。使用<code>@FeignClient</code>注解,可以聲明我想要為<code>movie</code>微服務而建立的用戶端API。接下來我聲明了一個我想要實作的服務映射。通過在方法上聲明一個URL規則來描述一個<code>REST API</code>的路由規則。

更令人興奮的是,這一切在Spring Cloud中都很容易,我所要做的僅僅是知道service ID來建立我的Feign 用戶端。服務的URL位址在運作時環境是自動配置的,因為每一個在叢集中的微服務将會在啟動時通過綁定<code>serviceid</code>的方式來進行注冊。

微服務架構中的其它服務,也是通過上面提到的方式運作。我隻需要知道進行通訊服務的<code>serviceid</code>,所有的操作都是通過Spring自動綁定的。

API Gateway

<a href="http://dockerone.com/uploads/article/20150720/6fe248ac76093cf90043770545ef22cd.png" target="_blank"></a>

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

基本概念:

使用Docker進行內建測試

混合持久化

微服務架構

服務發現

API網關

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

混合持久化其實就是說使用多種資料庫來存儲。不同的微服務執行個體都會使用它們自己的資料庫,并通過REST服務或者消息總線來通信,舉個例子,你可以使用基于以下資料庫來建構微服務:

Neo4j(圖形化)

MongoDB(文檔化)

MySQL(關聯)

這個例子示範了如何使用微服務建立一個新的應用。由于在項目中的每一個微服務隻有一個單一的父項目。開發者為此得到的收益是可以在本機上運作和開發每一個微服務。添加一個新的微服務非常簡單,當發現微服務時将會自動發現運作時的叢集環境上。

每一個微服務都關聯Eureka,在整個叢集中檢索API路由。使用這個政策,每一個在叢集上運作的微服務隻需要通過一個共同的API網關進行負載均衡和暴露接口,每一個服務也會自動發現并将路由請求轉發到自己的路由服務中。這個代理技術有助于開發使用者界面,作為平台完整的API通過自己的主機映射為代理服務。

下面的執行個體将會通過Maven來建構,使用Docker為每一個微服務建構容器鏡像。我們可以很優雅的使用Docker Compose在我們自己的主機上搭建全部的微服務叢集。

在這之前,請先移步至項目的GitHub 倉庫。

克隆或者fork這個項目并且把源碼下載下傳到自己的電腦上。下載下傳完畢後,你需要使用Maven和Docker來編譯和建構本地的容器鏡像。

下載下傳Docker

環境要求

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

Maven 3

Java 8

Docker

Docker Compose

通過指令行方式來建構目前項目,在項目的根目錄中運作如下的指令:

項目将會根據pom.xml中的每一個項目聲明中下載下傳相應的依賴jar包。每一個服務都将會被建構,同時Maven的Docker插件将會自動從本地Docker Registry中建構每一個容器鏡像。Docker将會在建構成功後,根據指令行運作<code>mvn clean install</code>來清除相應的資源。

在項目成功建構後,你将會看到如下的輸出:

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

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

如果一切配置都是正确的,每一個容器鏡像将會通過在Docker上的虛拟容器和自動發現的網絡服務來運作。當他們開始順序啟動時,你将會看到一系列的日志輸出。這可能需要一段時間來完成,取決于運作你執行個體程式的機器性能。

一旦容器啟動成功,你将會通過Eureka主機看到通過Discovery service注冊上來的應用服務。

通過指令行終端複制粘貼下面的指令到Docker中定義的<code>$DOCKER_HOST</code>環境變量中。

如果Eureka正确的啟動,浏覽器将會啟動并打開Eureka服務的儀表盤,如下圖所示:

<a href="http://dockerone.com/uploads/article/20150720/0e570a87e33e9a103119e957fd2c4ca6.png" target="_blank"></a>

我們将會看到每一個正在運作的服務執行個體和狀态。通過下面的指令來擷取資料驅動服務,例如 <code>movie</code> 服務。

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

Service Discovery

Externalized Configuration

Service Orchestration with Docker Compose

在這之後的博文中,我們将會示範如何使用背景服務來建構前端應用程式,同時也會介紹一個混合性持久化的執行個體,使用MySQL和Neo4j。

原文釋出時間為:2015-07-19

本文作者:jeffsui 

本文來自雲栖社群合作夥伴DockerOne,了解相關資訊可以關注DockerOne。

原文标題:使用Spring Cloud和Docker建構微服務