一、微服務(wù)簡(jiǎn)介 微服務(wù)是最近的一兩年的時(shí)間里是很火的一個(gè)概念。感覺(jué)不學(xué)習(xí)一下都快跟不上時(shí)代的步伐了,下邊做一下簡(jiǎn)單的總結(jié)和介紹。 何為微服務(wù)?簡(jiǎn)而言之,微服務(wù)架構(gòu)風(fēng)格這種開(kāi)發(fā)方法,是以開(kāi)發(fā)一組小型服務(wù)的方式來(lái)開(kāi)發(fā)一個(gè)獨(dú)立的應(yīng)用系統(tǒng)的。其中每個(gè)小型服務(wù)都運(yùn)行在自己的進(jìn)程中,并經(jīng)常采用HTTP資源API這樣輕量的機(jī)制來(lái)相互通信。這些服務(wù)圍繞業(yè)務(wù)功能進(jìn)行構(gòu)建,并能通過(guò)全自動(dòng)的部署機(jī)制來(lái)進(jìn)行獨(dú)立部署。這些微服務(wù)可以使用不同的語(yǔ)言來(lái)編寫(xiě),并且可以使用不同的數(shù)據(jù)存儲(chǔ)技術(shù)。對(duì)這些微服務(wù)我們僅做最低限度的集中管理。 一個(gè)微服務(wù)一般完成某個(gè)特定的功能,比如下單管理、客戶管理等等。每一個(gè)微服務(wù)都是微型六角形應(yīng)用,都有自己的業(yè)務(wù)邏輯和適配器。一些微服務(wù)還會(huì)發(fā)布API給其它微服務(wù)和應(yīng)用客戶端使用。其它微服務(wù)完成一個(gè)Web UI,運(yùn)行時(shí),每一個(gè)實(shí)例可能是一個(gè)云VM或者是Docker容器。 比如,一個(gè)前面描述系統(tǒng)可能的分解如下: ![]() 總的來(lái)說(shuō),微服務(wù)的主旨是將一個(gè)原本獨(dú)立的系統(tǒng)拆分成多個(gè)小型服務(wù),這些小型服務(wù)都在各自獨(dú)立的進(jìn)程中運(yùn)行,服務(wù)之間通過(guò)基于HTTP的RESTful API進(jìn)行通信協(xié)作,并且每個(gè)服務(wù)都維護(hù)著自身的數(shù)據(jù)存儲(chǔ)、業(yè)務(wù)開(kāi)發(fā)、自動(dòng)化測(cè)試以及獨(dú)立部署機(jī)制。 二、微服務(wù)的特征 1、每個(gè)微服務(wù)可獨(dú)立運(yùn)行在自己的進(jìn)程里; 2、一系列獨(dú)立運(yùn)行的微服務(wù)共同構(gòu)建起了整個(gè)系統(tǒng); 3、每個(gè)服務(wù)為獨(dú)立的業(yè)務(wù)開(kāi)發(fā),一個(gè)微服務(wù)一般完成某個(gè)特定的功能,比如:訂單管理、用戶管理等; 4、微服務(wù)之間通過(guò)一些輕量的通信機(jī)制進(jìn)行通信,例如通過(guò)REST API或者RPC的方式進(jìn)行調(diào)用。 擴(kuò)展閱讀:深度剖析微服務(wù)架構(gòu)的九大特征: http://developer.51cto.com/art/201608/516401.htm 三、微服務(wù)的優(yōu)缺點(diǎn) 1、易于開(kāi)發(fā)和維護(hù) 2、啟動(dòng)較快 3、局部修改容易部署 4、技術(shù)棧不受限 5、按需伸縮 6、DevOps 擴(kuò)展閱讀:微服務(wù)架構(gòu)的優(yōu)勢(shì)與不足 :http:///article/394 四、常見(jiàn)微服務(wù)框架 1、服務(wù)治理框架 (1)Dubbo(http:///)、Dubbox(當(dāng)當(dāng)網(wǎng)對(duì)Dubbo的擴(kuò)展) ![]() 擴(kuò)展閱讀:Dubbo詳細(xì)介紹與安裝使用過(guò)程: http://blog.csdn.net/xlgen157387/article/details/51865289 最近的好消息是Dubbo已近重新開(kāi)始進(jìn)行運(yùn)維啦! (2)Netflix的Eureka、Apache的Consul等。 Spring Cloud Eureka是對(duì)Netflix的Eureka的進(jìn)一步封裝。 2、分布式配置管理 (1)百度的Disconf ![]() (2)360的QConf (3)Spring Cloud組件中的Config (3)淘寶的Diamond 3、批量任務(wù)框架 (1)Spring Cloud組件中的Task (2)LTS 4、服務(wù)追蹤框架 。。。 五、Spring Cloud全家桶組件 在介紹Spring Cloud 全家桶之前,首先要介紹一下Netflix ,Netflix 是一個(gè)很偉大的公司,在Spring Cloud項(xiàng)目中占著重要的作用,Netflix 公司提供了包括Eureka、Hystrix、Zuul、Archaius等在內(nèi)的很多組件,在微服務(wù)架構(gòu)中至關(guān)重要,Spring在Netflix 的基礎(chǔ)上,封裝了一系列的組件,命名為:Spring Cloud Eureka、Spring Cloud Hystrix、Spring Cloud Zuul等,下邊對(duì)各個(gè)組件進(jìn)行分別得介紹: (1)Spring Cloud Eureka 我們使用微服務(wù),微服務(wù)的本質(zhì)還是各種API接口的調(diào)用,那么我們?cè)趺串a(chǎn)生這些接口、產(chǎn)生了這些接口之后如何進(jìn)行調(diào)用那?如何進(jìn)行管理哪? 答案就是Spring Cloud Eureka,我們可以將自己定義的API 接口注冊(cè)到Spring Cloud Eureka上,Eureka負(fù)責(zé)服務(wù)的注冊(cè)于發(fā)現(xiàn),如果學(xué)習(xí)過(guò)Zookeeper的話,就可以很好的理解,Eureka的角色和 Zookeeper的角色差不多,都是服務(wù)的注冊(cè)和發(fā)現(xiàn),構(gòu)成Eureka體系的包括:服務(wù)注冊(cè)中心、服務(wù)提供者、服務(wù)消費(fèi)者。 ![]() 上圖中描述了(圖片來(lái)源于網(wǎng)絡(luò)): 1、兩臺(tái)Eureka服務(wù)注冊(cè)中心構(gòu)成的服務(wù)注冊(cè)中心的主從復(fù)制集群; 2、然后服務(wù)提供者向注冊(cè)中心進(jìn)行注冊(cè)、續(xù)約、下線服務(wù)等; 3、服務(wù)消費(fèi)者向Eureka注冊(cè)中心拉去服務(wù)列表并維護(hù)在本地(這也是客戶端發(fā)現(xiàn)模式的機(jī)制體現(xiàn)?。?; 4、然后服務(wù)消費(fèi)者根據(jù)從Eureka服務(wù)注冊(cè)中心獲取的服務(wù)列表選取一個(gè)服務(wù)提供者進(jìn)行消費(fèi)服務(wù)。 (2)Spring Cloud Ribbon 在上Spring Cloud Eureka描述了服務(wù)如何進(jìn)行注冊(cè),注冊(cè)到哪里,服務(wù)消費(fèi)者如何獲取服務(wù)生產(chǎn)者的服務(wù)信息,但是Eureka只是維護(hù)了服務(wù)生產(chǎn)者、注冊(cè)中心、服務(wù)消費(fèi)者三者之間的關(guān)系,真正的服務(wù)消費(fèi)者調(diào)用服務(wù)生產(chǎn)者提供的數(shù)據(jù)是通過(guò)Spring Cloud Ribbon來(lái)實(shí)現(xiàn)的。 在(1)中提到了服務(wù)消費(fèi)者是將服務(wù)從注冊(cè)中心獲取服務(wù)生產(chǎn)者的服務(wù)列表并維護(hù)在本地的,這種客戶端發(fā)現(xiàn)模式的方式是服務(wù)消費(fèi)者選擇合適的節(jié)點(diǎn)進(jìn)行訪問(wèn)服務(wù)生產(chǎn)者提供的數(shù)據(jù),這種選擇合適節(jié)點(diǎn)的過(guò)程就是Spring Cloud Ribbon完成的。 Spring Cloud Ribbon客戶端負(fù)載均衡器由此而來(lái)。 (3)Spring Cloud Feign 上述(1)、(2)中我們已經(jīng)使用最簡(jiǎn)單的方式實(shí)現(xiàn)了服務(wù)的注冊(cè)發(fā)現(xiàn)和服務(wù)的調(diào)用操作,如果具體的使用Ribbon調(diào)用服務(wù)的話,你就可以感受到使用Ribbon的方式還是有一些復(fù)雜,因此Spring Cloud Feign應(yīng)運(yùn)而生。 Spring Cloud Feign 是一個(gè)聲明web服務(wù)客戶端,這使得編寫(xiě)Web服務(wù)客戶端更容易,使用Feign 創(chuàng)建一個(gè)接口并對(duì)它進(jìn)行注解,它具有可插拔的注解支持包括Feign注解與JAX-RS注解,F(xiàn)eign還支持可插拔的編碼器與解碼器,Spring Cloud 增加了對(duì) Spring MVC的注解,Spring Web 默認(rèn)使用了HttpMessageConverters, Spring Cloud 集成 Ribbon 和 Eureka 提供的負(fù)載均衡的HTTP客戶端 Feign。 簡(jiǎn)單的可以理解為:Spring Cloud Feign 的出現(xiàn)使得Eureka和Ribbon的使用更為簡(jiǎn)單。 (4)Spring Cloud Hystrix 我們?cè)冢?)、(2)、(3)中知道了使用Eureka進(jìn)行服務(wù)的注冊(cè)和發(fā)現(xiàn),使用Ribbon實(shí)現(xiàn)服務(wù)的負(fù)載均衡調(diào)用,還知道了使用Feign可以簡(jiǎn)化我們的編碼。但是,這些還不足以實(shí)現(xiàn)一個(gè)高可用的微服務(wù)架構(gòu)。 例如:當(dāng)有一個(gè)服務(wù)出現(xiàn)了故障,而服務(wù)的調(diào)用方不知道服務(wù)出現(xiàn)故障,若此時(shí)調(diào)用放的請(qǐng)求不斷的增加,最后就會(huì)等待出現(xiàn)故障的依賴方 相應(yīng)形成任務(wù)的積壓,最終導(dǎo)致自身服務(wù)的癱瘓。 Spring Cloud Hystrix正是為了解決這種情況的,防止對(duì)某一故障服務(wù)持續(xù)進(jìn)行訪問(wèn)。Hystrix的含義是:斷路器,斷路器本身是一種開(kāi)關(guān)裝置,用于我們家庭的電路保護(hù),防止電流的過(guò)載,當(dāng)線路中有電器發(fā)生短路的時(shí)候,斷路器能夠及時(shí)切換故障的電器,防止發(fā)生過(guò)載、發(fā)熱甚至起火等嚴(yán)重后果。 (5)Spring Cloud Config 對(duì)于微服務(wù)還不是很多的時(shí)候,各種服務(wù)的配置管理起來(lái)還相對(duì)簡(jiǎn)單,但是當(dāng)成百上千的微服務(wù)節(jié)點(diǎn)起來(lái)的時(shí)候,服務(wù)配置的管理變得會(huì)復(fù)雜起來(lái)。 分布式系統(tǒng)中,由于服務(wù)數(shù)量巨多,為了方便服務(wù)配置文件統(tǒng)一管理,實(shí)時(shí)更新,所以需要分布式配置中心組件。在Spring Cloud中,有分布式配置中心組件Spring Cloud Config ,它支持配置服務(wù)放在配置服務(wù)的內(nèi)存中(即本地),也支持放在遠(yuǎn)程Git倉(cāng)庫(kù)中。在Cpring Cloud Config 組件中,分兩個(gè)角色,一是Config Server,二是Config Client。 Config Server用于配置屬性的存儲(chǔ),存儲(chǔ)的位置可以為Git倉(cāng)庫(kù)、SVN倉(cāng)庫(kù)、本地文件等,Config Client用于服務(wù)屬性的讀取。 ![]() (6)Spring Cloud Zuul 我們使用Spring Cloud Netflix中的Eureka實(shí)現(xiàn)了服務(wù)注冊(cè)中心以及服務(wù)注冊(cè)與發(fā)現(xiàn);而服務(wù)間通過(guò)Ribbon或Feign實(shí)現(xiàn)服務(wù)的消費(fèi)以及均衡負(fù)載;通過(guò)Spring Cloud Config實(shí)現(xiàn)了應(yīng)用多環(huán)境的外部化配置以及版本管理。為了使得服務(wù)集群更為健壯,使用Hystrix的融斷機(jī)制來(lái)避免在微服務(wù)架構(gòu)中個(gè)別服務(wù)出現(xiàn)異常時(shí)引起的故障蔓延。 ![]() 先來(lái)說(shuō)說(shuō)這樣架構(gòu)需要做的一些事兒以及存在的不足: 1、首先,破壞了服務(wù)無(wú)狀態(tài)特點(diǎn)。為了保證對(duì)外服務(wù)的安全性,我們需要實(shí)現(xiàn)對(duì)服務(wù)訪問(wèn)的權(quán)限控制,而開(kāi)放服務(wù)的權(quán)限控制機(jī)制將會(huì)貫穿并污染整個(gè)開(kāi)放服務(wù)的業(yè)務(wù)邏輯,這會(huì)帶來(lái)的最直接問(wèn)題是,破壞了服務(wù)集群中REST API無(wú)狀態(tài)的特點(diǎn)。從具體開(kāi)發(fā)和測(cè)試的角度來(lái)說(shuō),在工作中除了要考慮實(shí)際的業(yè)務(wù)邏輯之外,還需要額外可續(xù)對(duì)接口訪問(wèn)的控制處理。 2、其次,無(wú)法直接復(fù)用既有接口。當(dāng)我們需要對(duì)一個(gè)即有的集群內(nèi)訪問(wèn)接口,實(shí)現(xiàn)外部服務(wù)訪問(wèn)時(shí),我們不得不通過(guò)在原有接口上增加校驗(yàn)邏輯,或增加一個(gè)代理調(diào)用來(lái)實(shí)現(xiàn)權(quán)限控制,無(wú)法直接復(fù)用原有的接口。 面對(duì)類似上面的問(wèn)題,我們要如何解決呢?下面進(jìn)入本文的正題:服務(wù)網(wǎng)關(guān)! 為了解決上面這些問(wèn)題,我們需要將權(quán)限控制這樣的東西從我們的服務(wù)單元中抽離出去,而最適合這些邏輯的地方就是處于對(duì)外訪問(wèn)最前端的地方,我們需要一個(gè)更強(qiáng)大一些的均衡負(fù)載器,它就是本文將來(lái)介紹的:服務(wù)網(wǎng)關(guān)。 服務(wù)網(wǎng)關(guān)是微服務(wù)架構(gòu)中一個(gè)不可或缺的部分。通過(guò)服務(wù)網(wǎng)關(guān)統(tǒng)一向外系統(tǒng)提供REST API的過(guò)程中,除了具備服務(wù)路由、均衡負(fù)載功能之外,它還具備了權(quán)限控制等功能。Spring Cloud Netflix中的Zuul就擔(dān)任了這樣的一個(gè)角色,為微服務(wù)架構(gòu)提供了前門(mén)保護(hù)的作用,同時(shí)將權(quán)限控制這些較重的非業(yè)務(wù)邏輯內(nèi)容遷移到服務(wù)路由層面,使得服務(wù)集群主體能夠具備更高的可復(fù)用性和可測(cè)試性。 (7)Spring Cloud Bus 在(5)Spring Cloud Config中,我們知道的配置文件可以通過(guò)Config Server存儲(chǔ)到Git等地方,通過(guò)Config Client進(jìn)行讀取,但是我們的配置文件不可能是一直不變的,當(dāng)我們的配置文件放生變化的時(shí)候如何進(jìn)行更新哪? 一種最簡(jiǎn)單的方式重新一下Config Client進(jìn)行重新獲取,但Spring Cloud絕對(duì)不會(huì)讓你這樣做的,Spring Cloud Bus正是提供一種操作使得我們?cè)诓魂P(guān)閉服務(wù)的情況下更新我們的配置。 Spring Cloud Bus官方意義:消息總線。 當(dāng)然動(dòng)態(tài)更新服務(wù)配置只是消息總線的一個(gè)用處,還有很多其他用處。 ![]() 六、總結(jié) Spring Cloud 的組件還不止這些,通過(guò)上邊的口水話的介紹,應(yīng)該可以大致有一定的了解,但是每一個(gè)組件的功能遠(yuǎn)不止上述介紹的那些,每一個(gè)組件還有很多其他的功能點(diǎn),這里的介紹希望能夠帶大家入個(gè)門(mén),不要對(duì)微服務(wù)這個(gè)這么大的概念有所畏懼。 ———————————————— |
|
來(lái)自: 后知后覺(jué)1003 > 《technology》