前言
最近爲了擴展自己對雲應用的理解,找了好多基於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),或跳轉到部署步驟。
English tutorial available here: Building Microservices with Spring Cloud and
Docker.(原文翻譯如下)
本博客系列將向你介紹一些使用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);
- }
更令人興奮的是,這一切在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
下載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
在項目成功構建後,你將會看到如下的輸出:
- [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
一旦容器啓動成功,你將會通過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')
我們將會看到每一個正在運行的服務實例和狀態。通過下面的命令來獲取數據驅動服務,例如 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。