陳龍 劉勇
摘 要:一方面,隨著互聯(lián)網(wǎng)高速發(fā)展,IT技術(shù)日新月異變化,傳統(tǒng)的單塊架構(gòu)應(yīng)用面臨著越來(lái)越多的挑戰(zhàn),已無(wú)法適應(yīng)快速迭代更新,其改造與重構(gòu)勢(shì)在必行。另一方面,隨著敏捷開發(fā)、持續(xù)集成交付、DevOps、云計(jì)算、虛擬技術(shù)docker化等的深入人心,微服務(wù)的誕生勢(shì)在必行。微服務(wù)架構(gòu)是一項(xiàng)在云中部署應(yīng)用和服務(wù)的新架構(gòu)模式,它提倡將單一應(yīng)用程序劃分成一組小的服務(wù),服務(wù)之間互相協(xié)調(diào)、互相配合,滿足用戶需求,實(shí)現(xiàn)了可擴(kuò)展性、易伸縮性及高可用性。首先介紹了微服務(wù)架構(gòu)的定義及工作原理;然后與傳統(tǒng)架構(gòu)進(jìn)行對(duì)比,并分析兩者優(yōu)缺點(diǎn);接著介紹了微服務(wù)架構(gòu)現(xiàn)有的應(yīng)用框架;最后提出了微服務(wù)架構(gòu)未來(lái)的發(fā)展方向。
關(guān)鍵詞:微服務(wù);架構(gòu);SOA;SpringCloud;Dubbo
1引言
隨著市場(chǎng)的快速發(fā)展,業(yè)務(wù)的不斷擴(kuò)大,單塊架構(gòu)應(yīng)用面臨著越來(lái)越多的挑戰(zhàn),其改造與重構(gòu)勢(shì)在必行。而微服務(wù)架構(gòu)的誕生,是互聯(lián)網(wǎng)高速發(fā)展,虛擬化技術(shù)應(yīng)用以及持續(xù)交付、DevOps深入人心的綜合產(chǎn)物。隨著用戶需求個(gè)性化、產(chǎn)品生命周期變短,微服務(wù)架構(gòu)是未來(lái)軟件軟件架構(gòu)朝著靈活性、擴(kuò)展性、伸縮性以及高可用性發(fā)展的必然方向。同時(shí),以Docker為代表的容器虛擬化技術(shù)的盛行,將大大降低微服務(wù)實(shí)施的成本,為微服務(wù)落地以及大規(guī)模使用提供了堅(jiān)實(shí)的基礎(chǔ)和保障。
2微服務(wù)架構(gòu)的定義及原理
ThoughtWorks的首席科學(xué)家,馬丁 -福勒先生對(duì)微服務(wù)的這段描述,似乎更加具體、貼切,通俗易懂:微服務(wù)架構(gòu)是一種架構(gòu)模式,它提倡將單一應(yīng)用程序劃分成一組小的服務(wù),服務(wù)之間互相協(xié)調(diào)、互相配合,為用戶提供最終價(jià)值。每個(gè)服務(wù)運(yùn)行在其獨(dú)立的進(jìn)程中,服務(wù)與服務(wù)間采用輕量級(jí)的通信機(jī)制互相溝通(通常是基于HTTP協(xié)議的RESTful API)。每個(gè)服務(wù)都圍繞著具體業(yè)務(wù)進(jìn)行構(gòu)建,并且能夠被獨(dú)立的部署到生產(chǎn)環(huán)境、類生產(chǎn)環(huán)境等。另外,應(yīng)當(dāng)盡量避免統(tǒng)一的、集中式的服務(wù)管理機(jī)制,對(duì)具體的一個(gè)服務(wù)而言,應(yīng)根據(jù)業(yè)務(wù)上下文,選擇合適的語(yǔ)言、工具對(duì)其進(jìn)行構(gòu)建。
3 微服務(wù)與傳統(tǒng)架構(gòu)的區(qū)別
3.1單塊架構(gòu)
傳統(tǒng)的單塊架構(gòu)是以技術(shù)分層,譬如表示層、業(yè)務(wù)邏輯層、數(shù)據(jù)訪問(wèn)層。單塊架構(gòu)雖然邏輯上分為3層,但是它依舊是功能集中、代碼和數(shù)據(jù)中心化的一個(gè)發(fā)布包,運(yùn)行在同一個(gè)機(jī)器的同一個(gè)進(jìn)程中。當(dāng)業(yè)務(wù)量較小時(shí),它擁有易開發(fā)、易測(cè)試、易部署、易水平伸縮等多項(xiàng)優(yōu)勢(shì)。
但隨著業(yè)務(wù)量擴(kuò)大化、用戶需求個(gè)性化、產(chǎn)品生命周期變短、市場(chǎng)需求不穩(wěn)定等因素的出現(xiàn),單塊架構(gòu)系統(tǒng)面臨著越來(lái)越多的挑戰(zhàn)。
主要提現(xiàn)在以下六點(diǎn):1)維護(hù)成本增加;2)持續(xù)交付周期長(zhǎng);3)新人培養(yǎng)周期長(zhǎng);4)技術(shù)選型成本高;5)可伸縮性差;6)構(gòu)建全功能團(tuán)隊(duì)難。
3.2 SOA架構(gòu)與微服務(wù)
SOA(Service-Oriented Architecture),是一種粗粒度、松耦合服務(wù)架構(gòu),它將應(yīng)用程序的不同功能單元(稱為服務(wù))通過(guò)這些服務(wù)之間定義良好的接口和契約聯(lián)系起來(lái)。接口是采用中立的方式進(jìn)行定義的,它應(yīng)該獨(dú)立于實(shí)現(xiàn)服務(wù)的硬件平臺(tái)、操作系統(tǒng)和編程語(yǔ)言。這使得構(gòu)建在各種各樣的系統(tǒng)中的服務(wù)可以以一種統(tǒng)一和通用的方式進(jìn)行交互。劉穎說(shuō)“SOA 即面向服務(wù)的架構(gòu),大多數(shù)企業(yè)采用 SOA 來(lái)降低項(xiàng)目業(yè)務(wù)之間的耦合程度, 將龐大的項(xiàng)目拆分成多個(gè)獨(dú)立的微小服務(wù), 服務(wù)之間根據(jù)定義標(biāo)準(zhǔn)的接口規(guī)范通過(guò) API 接口的形式進(jìn)行通信,這樣不僅可以使項(xiàng)目解耦,同時(shí)簡(jiǎn)化了復(fù)雜的業(yè)務(wù)流程,可以根據(jù)業(yè)務(wù)需要從不同的入口進(jìn)行處理,提高了系統(tǒng)調(diào)度的靈活性,但是與此同時(shí)也會(huì)引入一些新的問(wèn)題,由于各個(gè)服務(wù)之間需要約定標(biāo)準(zhǔn)和規(guī)范,才能保證正常的使用,這樣限制了業(yè)務(wù)多元化發(fā)展,SOA 相當(dāng)于向外部提供了定制化的服務(wù)。 而且在項(xiàng)目部署的時(shí)候習(xí)慣將基礎(chǔ)服務(wù)生成 jar包,供其他業(yè)務(wù)服務(wù)調(diào)用的時(shí)候添加依賴,這其實(shí)在項(xiàng)目部署的時(shí)候并沒有將整體項(xiàng)目進(jìn)行徹底的拆分, 服務(wù)與服務(wù)之間依然存在依賴關(guān)系,為了能夠更好的解決上述問(wèn)題,微服務(wù)架構(gòu)便應(yīng)運(yùn)而生了”。
仔細(xì)分析SOA架構(gòu)與服務(wù)器架構(gòu)的概念,二者的基本思想幾乎一致,但是從具體的實(shí)現(xiàn)出發(fā),二者大相徑庭。
相比傳統(tǒng)SOA的服務(wù)實(shí)現(xiàn)方式,微服務(wù)更具有靈活性、可實(shí)施性以及可擴(kuò)展性,其強(qiáng)調(diào)的是一種獨(dú)立測(cè)試、獨(dú)立部署、獨(dú)立運(yùn)行的軟件架構(gòu)模式。
4. 微服務(wù)架構(gòu)的優(yōu)點(diǎn)和不足
4.1 微服務(wù)架構(gòu)優(yōu)點(diǎn)
微服務(wù)架構(gòu)的優(yōu)點(diǎn)主要有以下五個(gè)方面:
(1)復(fù)雜度可控:在將應(yīng)用分解的同時(shí),規(guī)避了原本復(fù)雜度無(wú)止境的積累。每一個(gè)微服務(wù)專注于單一功能,并通過(guò)定義良好的接口清晰表述服務(wù)邊界。由于體積小、復(fù)雜度低,每個(gè)微服務(wù)可由一個(gè)小規(guī)模開發(fā)團(tuán)隊(duì)完全掌控,易于保持高可維護(hù)性和開發(fā)效率。
(2)獨(dú)立部署:由于微服務(wù)具備獨(dú)立的運(yùn)行進(jìn)程,所以每個(gè)微服務(wù)也可以獨(dú)立部署。當(dāng)某個(gè)微服務(wù)發(fā)生變更時(shí)無(wú)需編譯、部署整個(gè)應(yīng)用。由微服務(wù)組成的應(yīng)用相當(dāng)于具備一系列可并行的發(fā)布流程,使得發(fā)布更加高效,同時(shí)降低對(duì)生產(chǎn)環(huán)境所造成的風(fēng)險(xiǎn),最終縮短應(yīng)用交付周期。
(3)技術(shù)選型靈活:微服務(wù)架構(gòu)下,技術(shù)選型是去中心化的。每個(gè)團(tuán)隊(duì)可以根據(jù)自身服務(wù)的需求和行業(yè)發(fā)展的現(xiàn)狀,自由選擇最適合的技術(shù)棧。由于每個(gè)微服務(wù)相對(duì)簡(jiǎn)單,當(dāng)需要對(duì)技術(shù)棧進(jìn)行升級(jí)時(shí)所面臨的風(fēng)險(xiǎn)較低,甚至完全重構(gòu)一個(gè)微服務(wù)也是可行的。
(4)容錯(cuò):當(dāng)某一組建發(fā)生故障時(shí),在單一進(jìn)程的傳統(tǒng)架構(gòu)下,故障很有可能在進(jìn)程內(nèi)擴(kuò)散,形成應(yīng)用全局性的不可用。在微服務(wù)架構(gòu)下,故障會(huì)被隔離在單個(gè)服務(wù)中。若設(shè)計(jì)良好,其他服務(wù)可通過(guò)重試、平穩(wěn)退化等機(jī)制實(shí)現(xiàn)應(yīng)用層面的容錯(cuò)。
(5)擴(kuò)展:?jiǎn)螇K架構(gòu)應(yīng)用也可以實(shí)現(xiàn)橫向擴(kuò)展,就是將整個(gè)應(yīng)用完整的復(fù)制到不同的節(jié)點(diǎn)。當(dāng)應(yīng)用的不同組件在擴(kuò)展需求上存在差異時(shí),微服務(wù)架構(gòu)便體現(xiàn)出其靈活性,因?yàn)槊總€(gè)服務(wù)可以根據(jù)實(shí)際需求獨(dú)立進(jìn)行擴(kuò)展。
4.2 微服務(wù)架構(gòu)的不足
微服務(wù)架構(gòu)的優(yōu)點(diǎn)主要有以下六個(gè)方面:
(1)運(yùn)營(yíng)開銷。更多的服務(wù)也就意味著更多的運(yùn)營(yíng),產(chǎn)品團(tuán)隊(duì)需要保證所有的相關(guān)服務(wù)都有完善的監(jiān)控等基礎(chǔ)設(shè)施,傳統(tǒng)的架構(gòu)開發(fā)者只需要保證一個(gè)應(yīng)用正常運(yùn)行,而現(xiàn)在卻需要保證幾十甚至上百道工序高效運(yùn)轉(zhuǎn),這是一個(gè)艱巨的任務(wù)。
(2)DevOps要求。使用微服務(wù)架構(gòu)后,開發(fā)團(tuán)隊(duì)需要保證一個(gè)Tomcat集群可用,保證一個(gè)數(shù)據(jù)庫(kù)可用,這就意味著團(tuán)隊(duì)需要高品質(zhì)的DevOps和自動(dòng)化技術(shù)。而現(xiàn)在,這樣的全棧式人才很少。
(3)隱式接口。服務(wù)和服務(wù)之間通過(guò)接口來(lái)“聯(lián)系”,當(dāng)某一個(gè)服務(wù)更改接口格式時(shí),可能涉及到此接口的所有服務(wù)都需要做調(diào)整。
(4)重復(fù)勞動(dòng)。在很多的服務(wù)中可能都會(huì)使用到同一個(gè)功能,而這一功能點(diǎn)沒有足夠大到提供一個(gè)服務(wù)的程度,這個(gè)時(shí)候可能不同的服務(wù)團(tuán)隊(duì)都會(huì)單獨(dú)開發(fā)這一功能,重復(fù)的業(yè)務(wù)邏輯,這違背了良好的軟件工程中的很多原則。
(5)分布式系統(tǒng)的復(fù)雜性。微服務(wù)通過(guò)REST API或消息來(lái)將不同的服務(wù)聯(lián)系起來(lái),這在之前可能只是一個(gè)簡(jiǎn)單的遠(yuǎn)程過(guò)程調(diào)用。分布式系統(tǒng)也就意味著開發(fā)者需要考慮網(wǎng)絡(luò)延遲、容錯(cuò)、消息序列化、不可靠的網(wǎng)絡(luò)、異步、版本控制、負(fù)載等,而面對(duì)如此多的微服務(wù)都需要分布式時(shí),整個(gè)產(chǎn)品需要有一整套完整的機(jī)制來(lái)保證各個(gè)服務(wù)可以正常運(yùn)轉(zhuǎn)。
(6)事務(wù)、異步、測(cè)試面臨挑戰(zhàn)??邕M(jìn)程之間的事務(wù)、大量的異步處理、多個(gè)微服務(wù)之間的整體測(cè)試都需要有一整套的解決方案,而現(xiàn)在看起來(lái),這些技術(shù)并沒有成熟。
5. 微服務(wù)發(fā)展現(xiàn)狀(SpringCloud dubbo 以及網(wǎng)易云整合,優(yōu)缺點(diǎn))
目前應(yīng)用微服務(wù)架構(gòu)的框架主要有兩種,一種是dubbo,另一種是spring cloud。本文從四個(gè)方面對(duì)兩者進(jìn)行簡(jiǎn)要分析。第一,背景方面來(lái)看,Dubbo是阿里巴巴服務(wù)化治理的核心框架,并被廣泛應(yīng)用于阿里巴巴集團(tuán)的各成員站點(diǎn),在國(guó)內(nèi)十分流行。spring-colud是一種云端分布式架構(gòu)解決方案,利用Spring Boot的開發(fā)便利性巧妙地簡(jiǎn)化了分布式系統(tǒng)基礎(chǔ)設(shè)施的開發(fā),在國(guó)外影響較大;第二,從社區(qū)活躍度的角度來(lái)看,在Github上,截止今日(2018年10月9月),Dubbo的最近一次更新在一月之前,更新頻率不高且中途存在長(zhǎng)時(shí)間不更新的情況,而SpringCloud的最近一次更新是在5分鐘之前,活躍度十分高;第三,架構(gòu)完整度,根據(jù)微服務(wù)架構(gòu)在各方面的要素,看看Spring Cloud和Dubbo都提供了哪些支持。
從上圖可看出,Dubbo只實(shí)現(xiàn)了微服務(wù)整體架構(gòu)中的部分組件,需要與其他組件組合才能形成完整的微服務(wù)架構(gòu),比如其中的分布式配置可以配合淘寶的diamond、百度的disconf來(lái)實(shí)現(xiàn),服務(wù)跟蹤可以使用京東開源的Hydra,批量任務(wù)可以使用當(dāng)當(dāng)開源的Elastic-Job等等,因此,可將Dubbo看作一個(gè)類似Netflix的子集。從文檔質(zhì)量的角度來(lái)看,Dubbo的文檔 可以說(shuō)在國(guó)內(nèi)開源框架中算是一流的,非常全,并且講解的也非常深入,由于版本已經(jīng)穩(wěn)定不再更新,所以也不太會(huì)出現(xiàn)不一致的情況,另外提供了中文與英文兩種版本,對(duì)于國(guó)內(nèi)開發(fā)者來(lái)說(shuō),閱讀起來(lái)更加容易上手,這也是dubbo在國(guó)內(nèi)更火一些的原因吧。Spring Cloud由于整合了大量組件,文檔在體量上自然要比dubbo多很多,文檔內(nèi)容上還算簡(jiǎn)潔清楚,但是更多的是偏向整合,更深入的使用方法還是需要查看其整合組件的詳細(xì)文檔。與此同時(shí),網(wǎng)易云推出了輕舟微服務(wù),即圍繞應(yīng)用和微服務(wù)打造的一站式 PaaS 平臺(tái),幫助用戶快速實(shí)現(xiàn)易接入、易運(yùn)維的微服務(wù)解決方案。它的優(yōu)勢(shì)主要集中于以下四點(diǎn)。第一,基于開源、兼容開源。全面兼容SpringCloud和dubbo框架,支持已有的服務(wù)框架平滑遷移;第二,支持大規(guī)模業(yè)務(wù)的生產(chǎn)環(huán)境驗(yàn)證;第三,低成本、易接入。支持代碼零改動(dòng)支持微服務(wù)框架,支持應(yīng)用擴(kuò)撲可視化,支持平臺(tái)統(tǒng)一的平臺(tái)認(rèn)證和權(quán)限管控;第四,智能運(yùn)維和立體化監(jiān)控。支持實(shí)時(shí)監(jiān)控,精準(zhǔn)掌控服務(wù)健康狀況。提供服務(wù)拓?fù)?,調(diào)用鏈跟蹤可視化呈現(xiàn)。采用多維度關(guān)聯(lián)分析,預(yù)防系統(tǒng)級(jí)故障。由此可見,網(wǎng)易云方便了中小企業(yè)更快捷的接入微服務(wù)框架,降低了中小企業(yè)的技術(shù)成本,同時(shí)使微服務(wù)的應(yīng)用更加廣泛。
結(jié)束語(yǔ)
綜上所述,微服務(wù)架構(gòu)正在逐步走向完善與成熟。它解決了單塊架構(gòu)的痛點(diǎn),相對(duì)SOA架構(gòu),微服務(wù)真正實(shí)現(xiàn)了單個(gè)業(yè)務(wù)系統(tǒng)內(nèi)部真正的組件化和服務(wù)化,可獨(dú)立地進(jìn)行開發(fā)、管理和加速,使得部署、管理和交付變得更加簡(jiǎn)單,充分體現(xiàn)了它的靈活性和可擴(kuò)展性。同時(shí),不論是國(guó)內(nèi)的dubbo框架還是國(guó)外的SpringCloud,亦或是網(wǎng)易云整合的輕舟微服務(wù)平臺(tái),都具有非常高的可行性,隨著它們不斷的發(fā)展與完善,我們堅(jiān)信微服務(wù)架構(gòu)將在未來(lái)的架構(gòu)之路上扮演者重要角色。
參考文獻(xiàn):
[1] 侯海平,李龍.基于Dubbo服務(wù)治理模式的單體架構(gòu)改造[J].通化師范學(xué)院學(xué)報(bào),2018,39(8):64-68.
[2] 王方旭. 基于SpringCloud實(shí)現(xiàn)業(yè)務(wù)系統(tǒng)微服務(wù)化的設(shè)計(jì)與實(shí)現(xiàn)[J]. 電子技術(shù)與軟件工程, 2018(8).
[3] 王方旭. 基于Spring Cloud和Docker的微服務(wù)架構(gòu)設(shè)計(jì)[J]. 中國(guó)信息化, 2018(3).
[4] 張峰. 微服務(wù)技術(shù)構(gòu)建大規(guī)模web系統(tǒng)的研究[J]. 科技創(chuàng)新與應(yīng)用, 2017(22):48-49.
[5] 王紀(jì)軍, 張斌, 顧永生,等. 云環(huán)境中Web應(yīng)用的微服務(wù)架構(gòu)評(píng)估[J]. 計(jì)算機(jī)系統(tǒng)應(yīng)用, 2017, 26(5):9-15.
[6] 王磊. 微服務(wù)架構(gòu)與實(shí)踐[M]. 電子工業(yè)出版社, 2016.
[7]王磊.解析微服務(wù)架構(gòu)(一)單塊架構(gòu)系統(tǒng)以及其面臨的挑戰(zhàn) [2015-05-11].http://www.infoq.com/cn/articles/analysis-thearchitecture-of-microservice-part-01
[8]解析微服務(wù)架構(gòu)(二)微服務(wù)架構(gòu)綜述
[2015-07-10]. http://www.infoq.com/cn/articles/analysis-the-architecture-of-microservice-part-02
[9]張晶, 王琰潔, 黃小鋒. 一種微服務(wù)框架的實(shí)現(xiàn)[J]. 計(jì)算機(jī)系統(tǒng)應(yīng)用, 2017, 26(4):82-86.
作者簡(jiǎn)介:
陳龍,三峽大學(xué)計(jì)算機(jī)與信息學(xué)院,碩士研究生在讀,研究方向:軟件工程。
劉勇,三峽大學(xué)計(jì)算機(jī)與信息學(xué)院,博士,教授,研究方向:計(jì)算機(jī)應(yīng)用。