張進(jìn)猛 蘇健 柴立巖
摘要:在傳統(tǒng)單體架構(gòu)的實(shí)際使用過(guò)程中,存在著項(xiàng)目過(guò)于臃腫、資源無(wú)法隔離、無(wú)法靈活擴(kuò)展等問(wèn)題。微服務(wù)架構(gòu)把業(yè)務(wù)拆分成多個(gè)小的微服務(wù)、支持獨(dú)立部署、可以動(dòng)態(tài)的實(shí)現(xiàn)橫向擴(kuò)展和縱向擴(kuò)展,可以解決上述問(wèn)題。目前國(guó)內(nèi)外存在很多微服務(wù)架構(gòu),微服務(wù)架構(gòu)的選取和實(shí)際應(yīng)用是該文研究的重點(diǎn)。
關(guān)鍵詞:?jiǎn)误w架構(gòu);微服務(wù);獨(dú)立部署;動(dòng)態(tài)擴(kuò)展
中圖分類(lèi)號(hào):TP311.52 文獻(xiàn)標(biāo)識(shí)碼:A
文章編號(hào):1009-3044(2020)10-0273-02
1背景
一直以來(lái)在項(xiàng)目中使用的都是傳統(tǒng)單體框架,在使用過(guò)程中,遇到了以下問(wèn)題:1)所有的業(yè)務(wù)依賴(lài)相同的數(shù)據(jù)庫(kù)、內(nèi)存等資源,如果某個(gè)新手開(kāi)發(fā)者寫(xiě)了一個(gè)慢語(yǔ)句,如果訪問(wèn)比較頻繁的話(huà),整個(gè)系統(tǒng)都會(huì)被拖垮;2)無(wú)法靈活擴(kuò)展,一個(gè)業(yè)務(wù)系統(tǒng)包含很多業(yè)務(wù)模塊,經(jīng)常碰到的現(xiàn)象是只有一個(gè)或兩個(gè)業(yè)務(wù)模塊訪問(wèn)用戶(hù)量比較大,比如考試模塊訪問(wèn)量比較大,單體系統(tǒng)只能把所有模塊部署在多臺(tái)機(jī)器上組成集群,而不能針對(duì)考試模塊單獨(dú)部署。而采用微服務(wù),可以把用戶(hù)管理、班級(jí)管理、學(xué)習(xí)和考試等模塊分成不同的微服務(wù),采用不同的數(shù)據(jù)庫(kù),如果現(xiàn)在考試的人多,可以靈活地把考試系統(tǒng)的服務(wù)進(jìn)行擴(kuò)展,以保證考試的流暢性。
2微服務(wù)架構(gòu)的選擇
微服務(wù)是系統(tǒng)架構(gòu)的一種設(shè)計(jì)風(fēng)格,它的主旨是將一個(gè)獨(dú)立的系統(tǒng)拆分成多個(gè)小型服務(wù),服務(wù)之間通過(guò)基于HTTP的RESTful API進(jìn)行通信協(xié)作,這些微服務(wù)可以用不同的語(yǔ)言編寫(xiě),采用不同的數(shù)據(jù)庫(kù)。微服務(wù)架構(gòu)包括配置管理、服務(wù)治理、斷路器、智能路由、微代理、控制總線、全局鎖、決策競(jìng)選、分布式會(huì)話(huà)和集群管理等。
從表1可以看出,Spring Cloud是一個(gè)微服務(wù)綜合解決框架,選擇它就像選擇了一個(gè)品牌機(jī)一樣,否則我們只能自己針對(duì)各個(gè)問(wèn)題去DIY自己的框架了。而且我們的單服務(wù)框架開(kāi)發(fā)一直使用了spring,Spring Cloud基于Spring Boot,選擇springCloud可以說(shuō)已經(jīng)具有了一定的學(xué)習(xí)基礎(chǔ),上手要容易得多。
3微服務(wù)架構(gòu)的實(shí)現(xiàn)
3.1服務(wù)的劃分
無(wú)論采用什么技術(shù),都是為了實(shí)現(xiàn)特定的業(yè)務(wù)。使用微服務(wù),也是為了更好的業(yè)務(wù)運(yùn)行,給用戶(hù)更好的使用體驗(yàn)。所以合理的劃分整個(gè)業(yè)務(wù)為多個(gè)微業(yè)務(wù),是實(shí)現(xiàn)微服務(wù)的關(guān)鍵一步。根據(jù)業(yè)務(wù)劃分了用戶(hù)管理、課程學(xué)習(xí)、課程考試、競(jìng)賽考試、證書(shū)管理等微服務(wù)。
3.2微服務(wù)的實(shí)現(xiàn)
整個(gè)微服務(wù)的實(shí)現(xiàn)包括下列組件的使用:服務(wù)治理、網(wǎng)關(guān)服務(wù)、負(fù)載均衡、容錯(cuò)保護(hù)、分布式配置中心、消息總線、分布式服務(wù)跟蹤等。
3.2.1服務(wù)治理
使用的服務(wù)組件為Spring Cloud Eureka,實(shí)現(xiàn)服務(wù)注冊(cè)和服務(wù)發(fā)現(xiàn),包括服務(wù)注冊(cè)中心和服務(wù)提供者。服務(wù)注冊(cè)中心需要引入swing-cloud-starter-eureka-server依賴(lài),然后在程序中引入@EnableEurekaServer。因?yàn)槲⒎?wù)要考慮高可用問(wèn)題,所以需要搭建服務(wù)注冊(cè)中心的集群,每個(gè)服務(wù)中心都向另外的服務(wù)中心注冊(cè)自己,以實(shí)現(xiàn)服務(wù)清單的互相同步,達(dá)到高可用的效果。
3.2.2網(wǎng)關(guān)服務(wù)
使用的服務(wù)組件為Spring Cloud Zuul,主要包含兩方面的功能:1)實(shí)現(xiàn)路由規(guī)則和服務(wù)實(shí)例的維護(hù);2)通過(guò)過(guò)濾器實(shí)現(xiàn)簽名校驗(yàn)和登錄校驗(yàn)等。
3.2.3負(fù)載均衡
使用的服務(wù)組件為Spring Cloud Ribbon,主要用于實(shí)現(xiàn)客戶(hù)端負(fù)載均衡,主要有隨機(jī)策略、線性輪詢(xún)策略、重試策略、最低并發(fā)策略、可用過(guò)濾策略、響應(yīng)時(shí)間加權(quán)重策略、區(qū)域權(quán)重策略等。
3.2.4容錯(cuò)保護(hù)
使用的服務(wù)組件為Spring Cloud Hystrix,當(dāng)某個(gè)服務(wù)單元發(fā)生故障時(shí),通常需要經(jīng)過(guò)長(zhǎng)時(shí)間的等待,然后返回connectiontimeout等錯(cuò)誤信息。加入Hystrix后,服務(wù)發(fā)生故障時(shí),通過(guò)斷路器的故障監(jiān)控,向調(diào)用方法返回一個(gè)錯(cuò)誤響應(yīng),而不是長(zhǎng)時(shí)間等待,這樣不會(huì)使得線程因調(diào)用故障服務(wù)被長(zhǎng)時(shí)間占用不釋放。
3.2.5分布式配置中心
使用的服務(wù)組件為Spring Cloud Config,分為服務(wù)端和客戶(hù)端兩部分,實(shí)現(xiàn)配置的集中管理、動(dòng)態(tài)調(diào)整配置、自動(dòng)的更新配置。
3.2.6消息總線
使用的服務(wù)組件為Spring Cloud Bus,通過(guò)整合RabbitMQ實(shí)現(xiàn)消息的接收和發(fā)送。
3.2.7分布式服務(wù)跟蹤
使用的服務(wù)組件為Swing Cloud Sleuth,通過(guò)整合Logstash或者Zipkin對(duì)請(qǐng)求鏈路跟蹤快速發(fā)現(xiàn)錯(cuò)誤根源以及監(jiān)控分析每條請(qǐng)求鏈路上的性能瓶頸等。
4結(jié)束語(yǔ)
微服務(wù)架構(gòu)可以解決單體架構(gòu)的項(xiàng)目過(guò)于臃腫、資源無(wú)法隔離、無(wú)法靈活擴(kuò)展等問(wèn)題,它的敏捷開(kāi)發(fā)和自動(dòng)化部署等優(yōu)點(diǎn)備受開(kāi)發(fā)者青睞。但同時(shí)對(duì)開(kāi)發(fā)人員尤其是項(xiàng)目管理者提出了更高的要求,對(duì)業(yè)務(wù)的劃分、接口的一致性、分布式的復(fù)雜性、運(yùn)維的新挑戰(zhàn),需要更多的開(kāi)發(fā)者參與到項(xiàng)目中。