常秀巖
唐山科技職業(yè)技術(shù)學(xué)院 信息多媒體系 河北 唐山 063000
近年來(lái),微服務(wù)架構(gòu)及容器技術(shù)備受關(guān)注,在各類文章、演講、博客中頻頻亮相,成為業(yè)界最熱門的話題。諸多研發(fā)人員開始重新思考互聯(lián)網(wǎng)時(shí)代服務(wù)的架構(gòu)以及應(yīng)用開發(fā)、運(yùn)維的方法。微服務(wù)以一種全新的架構(gòu)設(shè)計(jì)模式,牽動(dòng)了互聯(lián)網(wǎng)應(yīng)用從設(shè)計(jì)到運(yùn)維整個(gè)流程方法論的變革。而以Docker為代表的容器技術(shù)則為微服務(wù)理念提供了匹配的實(shí)現(xiàn)機(jī)制,進(jìn)而實(shí)質(zhì)性的改變了新一代應(yīng)用開發(fā)和發(fā)布的方式。
1.1 微服務(wù)架構(gòu)的原理 微服務(wù)架構(gòu)是一種架構(gòu)風(fēng)格和設(shè)計(jì)模式,提倡將應(yīng)用分割成一系列細(xì)小的服務(wù),每個(gè)服務(wù)專注于單一業(yè)務(wù)功能,運(yùn)行于獨(dú)立的進(jìn)程中,服務(wù)之間邊界清晰,采用輕量級(jí)通信機(jī)制(如HTTP/REST)相互溝通、配合來(lái)實(shí)現(xiàn)完整的應(yīng)用,滿足業(yè)務(wù)和用戶的需求。微服務(wù)作為架構(gòu)模式的變革,其誕生絕非偶然。它是當(dāng)傳統(tǒng)服務(wù)架構(gòu)在互聯(lián)網(wǎng)時(shí)代遭遇挑戰(zhàn)時(shí),人們對(duì)于架構(gòu)模式,開發(fā)和運(yùn)維方法論的一種反思。
目前業(yè)界比較成熟的微服務(wù)框架有Netflix、Spring Cloud和阿里的Dubbo等。Spring Cloud是基于Spring Boot的一整套實(shí)現(xiàn)微服務(wù)的框架,它提供了開發(fā)微服務(wù)所需的組件,在本文的微服務(wù)架構(gòu)設(shè)計(jì)中,使用了諸多Spring Cloud Netflix框架的組件。其微服務(wù)架構(gòu)的組成及原理如下圖1所示:
圖1 微服務(wù)架構(gòu)的組成及原理
由上圖可知,微服務(wù)訪問(wèn)大致路徑為:外部請(qǐng)求→負(fù)載均衡→服務(wù)網(wǎng)關(guān)(Gate Way)→微服務(wù)→數(shù)據(jù)服務(wù)/消息服務(wù)。服務(wù)網(wǎng)關(guān)和微服務(wù)都會(huì)用到服務(wù)注冊(cè)和發(fā)現(xiàn)來(lái)調(diào)用依賴的其他服務(wù),各服務(wù)集群都能通過(guò)配置中心服務(wù)來(lái)獲得配置信息。
1.2 微服務(wù)架構(gòu)的實(shí)施 本文采用亞馬遜EC2作為虛擬云服務(wù)器,采用ELB(Elastic Load Balancing)做負(fù)載均衡。EC2具有自動(dòng)配置容量功能,當(dāng)用戶流量達(dá)到尖峰,EC2可以自動(dòng)增加更多的容量以維持虛擬主機(jī)的性能;ELB彈性負(fù)載均衡,在多個(gè)實(shí)例間自動(dòng)分配應(yīng)用的傳入流量。為了保證安全性,客戶端請(qǐng)求需要使用https加密保護(hù),這就需要我們進(jìn)行SSL卸載,使用Nginx對(duì)加密請(qǐng)求進(jìn)行卸載處理,外部請(qǐng)求經(jīng)過(guò)ELB負(fù)載均衡后路由到Gate Way集群中的某個(gè)Gate Way服務(wù),由Gate Way服務(wù)轉(zhuǎn)發(fā)到微服務(wù)。
由于微服務(wù)架構(gòu)是由一系列職責(zé)單一的細(xì)粒度服務(wù)構(gòu)成的網(wǎng)狀結(jié)構(gòu),服務(wù)之間通過(guò)輕量機(jī)制進(jìn)行通信,這就引入了服務(wù)注冊(cè)與發(fā)現(xiàn)的問(wèn)題,服務(wù)的提供方要注冊(cè)報(bào)告服務(wù)地址,服務(wù)調(diào)用放要能發(fā)現(xiàn)目標(biāo)服務(wù)。我們的微服務(wù)架構(gòu)中使用了Eureka組件來(lái)實(shí)現(xiàn)服務(wù)的注冊(cè)與發(fā)現(xiàn)。所有的微服務(wù)(通過(guò)配置Eureka服務(wù)信息)到Eureka服務(wù)器中進(jìn)行注冊(cè),并定時(shí)發(fā)送心跳進(jìn)行健康檢查,Eureka默認(rèn)配置是30秒發(fā)送一次心跳,表明服務(wù)仍然處于存活狀態(tài),發(fā)送心跳的時(shí)間間隔可以通過(guò)Eureka的配置參數(shù)自行配置,Eureka服務(wù)器在接收到服務(wù)實(shí)例的最后一次心跳后,需要等待90秒(默認(rèn)配置90秒,可以通過(guò)配置參數(shù)進(jìn)行修改)后,才認(rèn)定服務(wù)已經(jīng)死亡(即連續(xù)3次沒(méi)有接收到心跳),在Eureka自我保護(hù)模式關(guān)閉的情況下會(huì)清除該服務(wù)的注冊(cè)信息。
微服務(wù)有很多依賴配置,某些配置參數(shù)在服務(wù)運(yùn)行期間可能還要?jiǎng)討B(tài)修改,比如:根據(jù)訪問(wèn)流量動(dòng)態(tài)調(diào)整熔斷閥值。這里我們使用Spring Cloud的configserver服務(wù)幫我們實(shí)現(xiàn)動(dòng)態(tài)配置中心的搭建。
2.1 服務(wù)網(wǎng)關(guān)的設(shè)計(jì) 服務(wù)網(wǎng)關(guān)作為內(nèi)部系統(tǒng)的邊界,應(yīng)具備以下功能:
(1)動(dòng)態(tài)路由:動(dòng)態(tài)的將請(qǐng)求路由到所需要的后端服務(wù)集群。雖然內(nèi)部是復(fù)雜的分布式微服務(wù)網(wǎng)狀結(jié)構(gòu),但是外部系統(tǒng)從網(wǎng)關(guān)看就像是一個(gè)整體服務(wù),網(wǎng)關(guān)屏蔽了后端服務(wù)的復(fù)雜性。
(2)限流和容錯(cuò):為每種類型的請(qǐng)求分配容量,當(dāng)請(qǐng)求數(shù)量超過(guò)閥值時(shí)拋掉外部請(qǐng)求,限制流量,保護(hù)后臺(tái)服務(wù)不被大流量沖垮;黨內(nèi)部服務(wù)出現(xiàn)故障時(shí)直接在邊界創(chuàng)建一些響應(yīng),集中做容錯(cuò)處理,而不是將請(qǐng)求轉(zhuǎn)發(fā)到內(nèi)部集群,保證用戶良好的體驗(yàn)。
(3)身份認(rèn)證和安全性控制:對(duì)每個(gè)外部請(qǐng)求進(jìn)行用戶認(rèn)證,拒絕沒(méi)有通過(guò)認(rèn)證的請(qǐng)求,還能通過(guò)訪問(wèn)模式分析,實(shí)現(xiàn)反爬蟲功能。
(4)監(jiān)控:網(wǎng)關(guān)可以收集有意義的數(shù)據(jù)和統(tǒng)計(jì),為后臺(tái)服務(wù)優(yōu)化提供數(shù)據(jù)支持。
(5)訪問(wèn)日志:網(wǎng)關(guān)可以收集訪問(wèn)日志信息,比如訪問(wèn)的是哪個(gè)服務(wù)、處理過(guò)程出現(xiàn)什么異常和結(jié)果、花費(fèi)多少時(shí)間等,通過(guò)分析日志內(nèi)容對(duì)后臺(tái)系統(tǒng)做進(jìn)一步的優(yōu)化。
本文采用Spring Cloud Netflix框架的開源組件Zuul來(lái)實(shí)現(xiàn)網(wǎng)關(guān)服務(wù)。Zuul使用一系列不同類型的過(guò)濾器,通過(guò)重寫過(guò)濾器,使我們能夠靈活的實(shí)現(xiàn)網(wǎng)關(guān)的各種功能。
2.2 微服務(wù)的部署 傳統(tǒng)的部署方式,需要在每臺(tái)服務(wù)器上安裝運(yùn)行環(huán)境,如果我們的服務(wù)器數(shù)量龐大,在每臺(tái)服務(wù)器上安裝運(yùn)行環(huán)境將是一項(xiàng)無(wú)比繁重的工作,一旦運(yùn)行環(huán)境發(fā)生改變,就不得不重新安裝,這簡(jiǎn)直是災(zāi)難性的。微服務(wù)是一系列職責(zé)單一、細(xì)粒度的服務(wù),是將我們的業(yè)務(wù)進(jìn)行拆分為獨(dú)立的服務(wù)單元,伸縮性好,耦合度低,不同的微服務(wù)可以用不同的語(yǔ)言開發(fā),每一個(gè)服務(wù)處理的單一的業(yè)務(wù)。微服務(wù)可以劃分為前端服務(wù)和后端服務(wù),前端服務(wù)是對(duì)后端服務(wù)做必要的聚合和剪裁后暴露給外部不同的設(shè)備(如PC、Phone等),所有的服務(wù)啟動(dòng)時(shí)都會(huì)到Eureka服務(wù)器進(jìn)行注冊(cè),服務(wù)之間會(huì)有錯(cuò)綜復(fù)雜的依賴關(guān)系。本文的Eureka服務(wù)器部署架構(gòu)如下圖2所示:
微服務(wù)以鏡像的形式,運(yùn)行在Docker容器中,Docker容器技術(shù)讓我們的服務(wù)部署變得簡(jiǎn)單、高效。使用Docker容器技術(shù),我們只需要將所需的基礎(chǔ)鏡像和微服務(wù)生成一個(gè)新的鏡像,將這個(gè)最終的鏡像部署在Docker容器中運(yùn)行,這種方式簡(jiǎn)單、高效,能夠快速部署服務(wù)。每個(gè)Docker容器中可以運(yùn)行多個(gè)微服務(wù),Docker容器以集群的方式部署,使用Docker Swar m對(duì)這些容器進(jìn)行管理。我們創(chuàng)建一個(gè)鏡像倉(cāng)庫(kù)用來(lái)存放所有的基礎(chǔ)鏡像以及生成的最終交付鏡像,在鏡像倉(cāng)庫(kù)中對(duì)所有鏡像進(jìn)行管理。
圖2 Eureka服務(wù)器部署架構(gòu)圖
2.3 服務(wù)容錯(cuò)機(jī)制的設(shè)計(jì) 微服務(wù)之間存在錯(cuò)綜復(fù)雜的依賴關(guān)系,一次請(qǐng)求可能會(huì)依賴多個(gè)后端服務(wù),在實(shí)際生產(chǎn)中這些服務(wù)可能會(huì)產(chǎn)生故障或者延遲,在一個(gè)高流量的系統(tǒng)中,一旦某個(gè)服務(wù)產(chǎn)生延遲,可能會(huì)在短時(shí)間內(nèi)耗盡系統(tǒng)資源,將整個(gè)系統(tǒng)拖垮,因此一個(gè)服務(wù)如果不能對(duì)其故障進(jìn)行隔離和容錯(cuò),這本身就是災(zāi)難性的。我們的微服務(wù)架構(gòu)中使用了Hystrix組件來(lái)進(jìn)行容錯(cuò)處理,Hystrix是Netflix的一款開源組件,它通過(guò)熔斷模式、隔離模式、回退(fallback)和限流等機(jī)制對(duì)服務(wù)進(jìn)行彈性容錯(cuò)保護(hù),保證系統(tǒng)的穩(wěn)定性。Hystix使用命令模式Hystrix Command包裝依賴調(diào)用邏輯,這樣相關(guān)的調(diào)用就自動(dòng)處于Hystrix的彈性容錯(cuò)保護(hù)之下。
傳統(tǒng)的實(shí)現(xiàn)信息配置的方法,比如放在x ml、y ml等配置文件中和應(yīng)用一起打包,每次修改都要重新提交代碼、打包構(gòu)建、生成新的鏡像、重新啟動(dòng)服務(wù),效率太低,這樣顯然是不合理的,因此我們需要搭建一個(gè)動(dòng)態(tài)配置中心服務(wù)支持微服務(wù)動(dòng)態(tài)配置。
本文使用Spring Cloud的configserver服務(wù)幫我們實(shí)現(xiàn)動(dòng)態(tài)配置中心的搭建。我們開發(fā)的微服務(wù)代碼都存放在git服務(wù)器私有倉(cāng)庫(kù)里面,所有需要?jiǎng)討B(tài)配置的配置文件存放在git服務(wù)器下的configserver(配置中心)服務(wù)中,部署到Docker容器中的微服務(wù)從git服務(wù)器動(dòng)態(tài)讀取配置文件的信息。當(dāng)本地git倉(cāng)庫(kù)修改代碼后push到git服務(wù)器倉(cāng)庫(kù),git服務(wù)端hooks(post-receive,在服務(wù)端完成代碼更新后會(huì)自動(dòng)調(diào)用)自動(dòng)檢測(cè)是否有配置文件更新,如果有,git服務(wù)端通過(guò)消息隊(duì)列給配置中心發(fā)消息,通知配置中心刷新對(duì)應(yīng)的配置文件。這樣微服務(wù)就能獲取到最新的配置文件信息,實(shí)現(xiàn)動(dòng)態(tài)配置。
本文設(shè)計(jì)了一套基于微服務(wù)架構(gòu)的PaaS云架構(gòu)平臺(tái),上述系統(tǒng)框架和組件是支撐實(shí)施微服務(wù)架構(gòu)的核心,在實(shí)際生產(chǎn)中,我們還會(huì)用到很多其他的組件,比如日志服務(wù)組件、消息服務(wù)組件等等。根據(jù)業(yè)務(wù)需要自行選擇使用,在我們的微服務(wù)架構(gòu)實(shí)施案例中,參考使用了很多Spring Cloud Netflix框架的開源組件,主要包括服務(wù)網(wǎng)關(guān)、服務(wù)注冊(cè)與發(fā)現(xiàn)、服務(wù)容錯(cuò)、客戶端負(fù)載均衡等,這些優(yōu)秀的開源組件,為我們實(shí)施微服務(wù)架構(gòu)提供了捷徑。