本篇內(nèi)容介紹了“如何使用Spring Cloud和Docker構(gòu)建微服務(wù)平臺(tái)”的有關(guān)知識(shí),在實(shí)際案例的操作過程中,不少人都會(huì)遇到這樣的困境,接下來就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!
我們一直強(qiáng)調(diào)網(wǎng)站建設(shè)、成都網(wǎng)站建設(shè)對(duì)于企業(yè)的重要性,如果您也覺得重要,那么就需要我們慎重對(duì)待,選擇一個(gè)安全靠譜的網(wǎng)站建設(shè)公司,企業(yè)網(wǎng)站我們建議是要么不做,要么就做好,讓網(wǎng)站能真正成為企業(yè)發(fā)展過程中的有力推手。專業(yè)的建站公司不一定是大公司,創(chuàng)新互聯(lián)作為專業(yè)的網(wǎng)絡(luò)公司選擇我們就是放心。
什么是Spring Cloud?
Spring Cloud 是Pivotal提供的用于簡(jiǎn)化分布式系統(tǒng)構(gòu)建的工具集。Spring Cloud引入了云平臺(tái)連接器(Cloud Connector)和服務(wù)連接器(Service Connector)的概念。云平臺(tái)連接器是一個(gè)接口,需要由云平臺(tái)提供者進(jìn)行實(shí)現(xiàn),以便庫中的其他模塊可以與該云平臺(tái)協(xié)同工作。
在Spring Cloud提供的解決方案中,你將會(huì)發(fā)現(xiàn)如下的內(nèi)容:
Configuration Service
Discovery Service
Circuit breakers
Distributed sessions
Spring Boot
Spring Cloud最重要的一點(diǎn)是它可以和Spring Boot一起工作,Spring Boot可以幫助開發(fā)者更容易地創(chuàng)建基于Spring的應(yīng)用程序和服務(wù)。
從Spring Boot項(xiàng)目名稱中的Boot就可以看出來,Spring Boot的作用在于創(chuàng)建和啟動(dòng)新的基于Spring框架的項(xiàng)目。Spring Boot會(huì)選擇最適合的Spring子項(xiàng)目和第三方開源庫進(jìn)行整合。大部分Spring Boot應(yīng)用只需要非常少的配置就可以快速運(yùn)行起來。Spring Boot包含的特性如下:
創(chuàng)建可以獨(dú)立運(yùn)行的Spring應(yīng)用。
直接嵌入Tomcat或Jetty服務(wù)器,不需要部署WAR文件。
提供推薦的基礎(chǔ)POM文件來簡(jiǎn)化Apache Maven配置。
盡可能的根據(jù)項(xiàng)目依賴來自動(dòng)配置Spring框架。
提供可以直接在生產(chǎn)環(huán)境中使用的功能,如性能指標(biāo)、應(yīng)用信息和應(yīng)用健康檢查。
沒有代碼生成,也沒有XML配置文件。
服務(wù)發(fā)現(xiàn)和智能路由
每一個(gè)服務(wù)都含有一個(gè)特定意義的微服務(wù)架構(gòu)。當(dāng)你在Spring Cloud上構(gòu)建微服務(wù)架構(gòu)時(shí),這里有幾個(gè)基本概念需要首先澄清下。首先,你需要要先創(chuàng)建Configuration Service和Discovery Service兩個(gè)基礎(chǔ)服務(wù)。如下圖所示:
上面的圖片說明了四個(gè)微服務(wù)以及各個(gè)服務(wù)之間的依賴關(guān)系:
Configuration service處于最頂端,黃色標(biāo)識(shí),而且被其它微服務(wù)所依賴;
Discovery service處于最低端,藍(lán)色標(biāo)識(shí),同時(shí)也被其它服務(wù)所依賴;
綠色標(biāo)識(shí)的兩個(gè)微服務(wù)是我們本系列博文中用到的兩個(gè)應(yīng)用案例:電影和觀影建議。
配置服務(wù)
Configuration Service(配置服務(wù))在微服務(wù)架構(gòu)中是一個(gè)非常重要的組件。如12要素理論所說, 微服務(wù)應(yīng)用的配置應(yīng)該存儲(chǔ)在環(huán)境中,而不是本地項(xiàng)目中。Configuration service是一個(gè)必不可少的基礎(chǔ)組件的原因是因?yàn)樗梢詫?duì)所有通過點(diǎn)對(duì)點(diǎn)和檢索的基礎(chǔ)服務(wù)進(jìn)行服務(wù)管理。
假設(shè)我們有多個(gè)部署環(huán)境。比如我們有一個(gè)臨時(shí)環(huán)境和一個(gè)生產(chǎn)環(huán)境,針對(duì)每個(gè)環(huán)境的配置將會(huì)是不同的。每一個(gè)configuration service 將會(huì)由一個(gè)獨(dú)立的Git倉庫來存放環(huán)境配置。沒有其它環(huán)境能夠訪問到這個(gè)配置倉庫,它只是提供該環(huán)境中運(yùn)行的配置服務(wù)罷了。
當(dāng)Configuration service啟動(dòng)后,它將會(huì)指向那些根據(jù)配置文件配置的路徑并啟動(dòng)對(duì)應(yīng)服務(wù)。每一個(gè)微服務(wù)通過讀取自己配置文件中的具體環(huán)境來運(yùn)行。在這一過程中,配置是通過版本管理來進(jìn)行的內(nèi)部和集中化管理,更改配置不需要重啟服務(wù)。
通過Spring Cloud提供的服務(wù)終端,你可以更改環(huán)境配置,并向Discovery service(發(fā)現(xiàn)服務(wù))發(fā)送一個(gè)刷新信號(hào),所有的用戶都會(huì)收到新的配置通知。
發(fā)現(xiàn)服務(wù)
Discovery Service(發(fā)現(xiàn)服務(wù))是另一個(gè)重要的微服務(wù)架構(gòu)的組件。Discovery Service管理運(yùn)行在容器中的眾多服務(wù)實(shí)例,而這些實(shí)例工作在集群環(huán)境下。在這些應(yīng)用中,我們使用客戶端的方式稱之為從服務(wù)到服務(wù)。舉個(gè)例子,我使用Spring Cloud Feign ,這是一個(gè)基于Restful風(fēng)格的微服務(wù)提供的客戶端開源項(xiàng)目,它是從Netflix OSS project項(xiàng)目中派生出來的。
[java] view plain copy 在CODE上查看代碼片派生到我的代碼片
@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);
}
在上面的例子中,我創(chuàng)建了一個(gè)Feign 客戶端,并映射了一個(gè)REST API方法來暴露電影服務(wù)。使用@FeignClient注解,可以聲明我想要為movie微服務(wù)而創(chuàng)建的客戶端API。接下來我聲明了一個(gè)我想要實(shí)現(xiàn)的服務(wù)映射。通過在方法上聲明一個(gè)URL規(guī)則來描述一個(gè)REST API的路由規(guī)則。
更令人興奮的是,這一切在Spring Cloud中都很容易,我所要做的僅僅是知道service ID來創(chuàng)建我的Feign 客戶端。服務(wù)的URL地址在運(yùn)行時(shí)環(huán)境是自動(dòng)配置的,因?yàn)槊恳粋€(gè)在集群中的微服務(wù)將會(huì)在啟動(dòng)時(shí)通過綁定serviceid的方式來進(jìn)行注冊(cè)。
微服務(wù)架構(gòu)中的其它服務(wù),也是通過上面提到的方式運(yùn)行。我只需要知道進(jìn)行通訊服務(wù)的serviceid,所有的操作都是通過Spring自動(dòng)綁定的。
API 網(wǎng)關(guān)
API Gateway 服務(wù)是Spring Cloud的另一個(gè)重要組件。它可以用來管理集群服務(wù)中的領(lǐng)域?qū)嶓w。下圖的綠色六邊形是我們提供的數(shù)據(jù)驅(qū)動(dòng)服務(wù),主要用來管理自己的實(shí)體類和數(shù)據(jù)庫。通過添加API Gateway服務(wù),我們可以為通過下面綠顏色的服務(wù)為每一個(gè)API路由創(chuàng)建一個(gè)代理暴露接口。
假設(shè)推薦服務(wù)和電影服務(wù)都暴露他們自己的REST API在自己管理的域?qū)嶓w上。API gataway通過discovery service和從其它服務(wù)注入的基于代理路由的 API方法。通過這種方式,包括推薦服務(wù)和電影服務(wù)將擁有一個(gè)完整定義的路由,通過暴露的REST API獲得本地的微服務(wù)。API Gateway將會(huì)重定義路由請(qǐng)求到服務(wù)實(shí)例,這些請(qǐng)求都是基于HTTP的。
示例項(xiàng)目
我已經(jīng)在GitHub(https://github.com/kbastani/sp ... ample)上創(chuàng)建了一個(gè)實(shí)例項(xiàng)目,這個(gè)項(xiàng)目是一個(gè)端到端的原生云平臺(tái),使用Spring Cloud構(gòu)建實(shí)際的微服務(wù)架構(gòu)。
基本概念:
使用Docker進(jìn)行集成測(cè)試
混合持久化
微服務(wù)架構(gòu)
服務(wù)發(fā)現(xiàn)
API網(wǎng)關(guān)
Docker
使用Docker對(duì)每一個(gè)服務(wù)進(jìn)行構(gòu)建和部署。使用Docker Compose在一個(gè)開發(fā)機(jī)上進(jìn)行端到端的集成測(cè)試。
混合持久化
混合持久化其實(shí)就是說使用多種數(shù)據(jù)庫來存儲(chǔ)。不同的微服務(wù)實(shí)例都會(huì)使用它們自己的數(shù)據(jù)庫,并通過REST服務(wù)或者消息總線來通信,舉個(gè)例子,你可以使用基于以下數(shù)據(jù)庫來構(gòu)建微服務(wù):
Neo4j(圖形化)
MongoDB(文檔化)
MySQL(關(guān)聯(lián))
微服務(wù)架構(gòu)
這個(gè)例子演示了如何使用微服務(wù)創(chuàng)建一個(gè)新的應(yīng)用。由于在項(xiàng)目中的每一個(gè)微服務(wù)只有一個(gè)單一的父項(xiàng)目。開發(fā)者為此得到的收益是可以在本機(jī)上運(yùn)行和開發(fā)每一個(gè)微服務(wù)。添加一個(gè)新的微服務(wù)非常簡(jiǎn)單,當(dāng)發(fā)現(xiàn)微服務(wù)時(shí)將會(huì)自動(dòng)發(fā)現(xiàn)運(yùn)行時(shí)的集群環(huán)境上。
發(fā)現(xiàn)服務(wù)
項(xiàng)目中包含兩個(gè)發(fā)現(xiàn)服務(wù),一個(gè)是Netflix Eureka,另一個(gè)使用了Consul from Hashicorp。多種發(fā)現(xiàn)服務(wù)提供了多種選擇,一個(gè)是使用(Consul)來做DNS服務(wù)集群,另一個(gè)是(Eureka)基于代理的API 網(wǎng)關(guān)。
API 網(wǎng)關(guān)
每一個(gè)微服務(wù)都關(guān)聯(lián)Eureka,在整個(gè)集群中檢索API路由。使用這個(gè)策略,每一個(gè)在集群上運(yùn)行的微服務(wù)只需要通過一個(gè)共同的API網(wǎng)關(guān)進(jìn)行負(fù)載均衡和暴 露接口,每一個(gè)服務(wù)也會(huì)自動(dòng)發(fā)現(xiàn)并將路由請(qǐng)求轉(zhuǎn)發(fā)到自己的路由服務(wù)中。這個(gè)代理技術(shù)有助于開發(fā)用戶界面,作為平臺(tái)完整的API通過自己的主機(jī)映射為代理服 務(wù)。
Docker 實(shí)例
下面的實(shí)例將會(huì)通過Maven來構(gòu)建,使用Docker為每一個(gè)微服務(wù)構(gòu)建容器鏡像。我們可以很優(yōu)雅的使用Docker Compose在我們自己的主機(jī)上搭建全部的微服務(wù)集群。
開始構(gòu)建
在這之前,請(qǐng)先移步至項(xiàng)目的GitHub 倉庫。
[html] view plain copy 在CODE上查看代碼片派生到我的代碼片
https://github.com/kbastani/sp ... mpleX24X克隆或者fork這個(gè)項(xiàng)目并且把源碼下載到自己的電腦上。下載完畢后,你需要使用Maven和Docker來編譯和構(gòu)建本地的容器鏡像。
下載Docker
首先,如果你還沒有Docker請(qǐng)先下載它。可以跟隨這個(gè)指南(https://docs.docker.com/compose/install/)來獲取Docker,然后在開發(fā)機(jī)上安裝并運(yùn)行。
當(dāng)然你也需要安裝Docker Compose,這個(gè)指南(https://docs.docker.com/compose/install/)將會(huì)幫到你。如果你使用的Mac OSX或者boot2docker,請(qǐng)確保在虛擬機(jī)上你給boot2docker提供的內(nèi)存至少是5GB,下面這個(gè)命令能幫助你這么做:
[html] view plain copy 在CODE上查看代碼片派生到我的代碼片
$ boot2docker init --memory=5000
環(huán)境要求
能夠運(yùn)行實(shí)例程序,需要在你的開發(fā)機(jī)上安裝下面的軟件:
Maven 3
Java 8
Docker
Docker Compose
構(gòu)建項(xiàng)目
通過命令行方式來構(gòu)建當(dāng)前項(xiàng)目,在項(xiàng)目的根目錄中運(yùn)行如下的命令:
[html] view plain copy 在CODE上查看代碼片派生到我的代碼片
$ mvn clean install
項(xiàng)目將會(huì)根據(jù)pom.xml中的每一個(gè)項(xiàng)目聲明中下載相應(yīng)的依賴jar包。每一個(gè)服務(wù)都將會(huì)被構(gòu)建,同時(shí)Maven的Docker插件將會(huì)自動(dòng)從本地Docker Registry中構(gòu)建每一個(gè)容器鏡像。Docker將會(huì)在構(gòu)建成功后,根據(jù)命令行運(yùn)行mvn clean install來清除相應(yīng)的資源。
在項(xiàng)目成功構(gòu)建后,你將會(huì)看到如下的輸出:
[html] view plain copy 在CODE上查看代碼片派生到我的代碼片
[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 啟動(dòng)集群
現(xiàn)在每一個(gè)鏡像都成功構(gòu)建完畢,我們使用Docker Compose來加速啟動(dòng)我們的集群。我已經(jīng)將Docker Compose的yaml文件包含進(jìn)了項(xiàng)目中,大家可以從GitHub上獲取。
現(xiàn)在我們通過下面的命令行啟動(dòng)微服務(wù)集群:
[html] view plain copy 在CODE上查看代碼片派生到我的代碼片
$ docker-compose up
如果一切配置都是正確的,每一個(gè)容器鏡像將會(huì)通過在Docker上的虛擬容器和自動(dòng)發(fā)現(xiàn)的網(wǎng)絡(luò)服務(wù)來運(yùn)行。當(dāng)他們開始順序啟動(dòng)時(shí),你將會(huì)看到一系列的日志輸出。這可能需要一段時(shí)間來完成,取決于運(yùn)行你實(shí)例程序的機(jī)器性能。
一旦容器啟動(dòng)成功,你將會(huì)通過Eureka主機(jī)看到通過Discovery service注冊(cè)上來的應(yīng)用服務(wù),通過命令行終端復(fù)制粘貼下面的命令到Docker中定義的$DOCKER_HOST環(huán)境變量中。
[html] view plain copy 在CODE上查看代碼片派生到我的代碼片
$ open $(echo \"$(echo $DOCKER_HOST)\"|
\sed 's/tcp:\/\//http:\/\//g'|
\sed 's/[0-9]{4,}/8761/g'|
\sed 's/\"http://g')
如果Eureka正確的啟動(dòng),瀏覽器將會(huì)啟動(dòng)并打開Eureka服務(wù)的儀表盤,如下圖所示:
我們將會(huì)看到每一個(gè)正在運(yùn)行的服務(wù)實(shí)例和狀態(tài)。通過下面的命令來獲取數(shù)據(jù)驅(qū)動(dòng)服務(wù),例如 movie 服務(wù)。
[html] view plain copy 在CODE上查看代碼片派生到我的代碼片
$ open $(echo \"$(echo $DOCKER_HOST)/movie\"|
\sed 's/tcp:\/\//http:\/\//g'|
\sed 's/[0-9]{4,}/10000/g'|
\sed 's/\"http://g')
這個(gè)命令將會(huì)訪問根據(jù)導(dǎo)航網(wǎng)關(guān)終端提供的代理方式訪問movie服務(wù)的REST API終端。這些REST API使用HATEOAS 來配置,它是一個(gè)通過內(nèi)嵌鏈接的方式支持自動(dòng)發(fā)現(xiàn)服務(wù)的接口。
[html] view plain copy 在CODE上查看代碼片派生到我的代碼片
{
"_links" : {
"self" : {
"href" : "http://192.168.59.103:10000/movie"X63X},
"resume" : {
"href" : "http://192.168.59.103:10000/movie/resume"X66X},
…………
"autoconfig" : {
"href" : "http://192.168.59.103:10000/mo ... t;X70X}
}
}
“如何使用Spring Cloud和Docker構(gòu)建微服務(wù)平臺(tái)”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí)可以關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!