微服務(wù)具備彈性和伸縮性。微服務(wù)不只依賴單個服務(wù)器和部署,它們可以被發(fā)布到多個機(jī)器上,或者多個數(shù)據(jù)中心及其它任何可用的區(qū)域。如果一個服務(wù)失效,可以啟動另外一個。因為整個應(yīng)用被分解成了微服務(wù)(小型服務(wù)),可以很容易地對其中某些熱門的服務(wù)進(jìn)行橫向擴(kuò)展。
如果你曾經(jīng)使用過COM、DCOM、CORBA、EJB、OSGi、J2EE、SOAP和SOA等,那么你就會知道服務(wù)和組件并不是什么新生事物。企業(yè)在使用組件方面存在的一個最大問題是他們依賴大型的硬件服務(wù)器,并在同一個服務(wù)器上運行很多應(yīng)用。我們有EJB、WAR包和EAR包,以及各種組件包,因為服務(wù)器資源太過昂貴,要盡可能地物盡其用。不過從最近幾年的發(fā)展情況來看,之前的方式有些落伍。操作系統(tǒng)服務(wù)器一直在變化,虛擬資源可以被當(dāng)成組件發(fā)布,比如EC2、OpenStack、Vagrant和Docker。世界變了。微服務(wù)架構(gòu)看到了這種趨勢,硬件、云技術(shù)、多核CPU和虛擬技術(shù)也在發(fā)展,所以我們要改變以前的開發(fā)方式。
在開始新項目的時候不要再使用EAR包或WAR包了。現(xiàn)在我們可以在Docker里運行JVM,Docker只不過是一個進(jìn)程,但它可以表現(xiàn)得像一個操作系統(tǒng)一樣。Docker運行在云端的操作系統(tǒng)上,而云端的操作系統(tǒng)運行在虛擬機(jī)里,虛擬機(jī)運行在Linux服務(wù)器上。這些服務(wù)器不是歸誰所有,而是被很多互不相識的人共享。如果出現(xiàn)流量高峰怎么辦?很簡單,使用更多的服務(wù)器實例。這就是為什么要把Java微服務(wù)運行在一個單獨的進(jìn)程里,而不是Java EE容器或servlet容器。
微服務(wù)一般會提供基于HTTP/JSON的API端點。這樣可以很容易地與其它服務(wù)(開源或閉源的)集成,只要這些服務(wù)提供了HTTP/JSON接口。服務(wù)可以通過更有意義的方式被消費、被組合。EC2、S3及其它來自Amazon(或其它公司)的服務(wù)就是最好的例子?;A(chǔ)設(shè)施會成為應(yīng)用程序的一部分,而且它們是可編程的。
使用微服務(wù)架構(gòu)的應(yīng)用程序應(yīng)該是模塊化、可編程和可組合的。微服務(wù)之間可以相互替換。應(yīng)用程序的局部可以被重寫或改進(jìn),而不會影響到整個應(yīng)用。如果所有的組件都提供了可編程的API,那么微服務(wù)之間的交互就會變得更簡單(永遠(yuǎn)不要相信那些不能通過curl訪問的微服務(wù))。
隨著微服務(wù)逐漸流行起來,很多廠商開始嘗試把他們的JavaEE Web服務(wù)轉(zhuǎn)成微服務(wù),這樣他們就可以繼續(xù)賣他們的過時產(chǎn)品,API Gateway就是這些廠商中的一個。
Jason Bloomberg是Intellyx的主席,他在一篇文章里指出了傳統(tǒng)Web服務(wù)和微服務(wù)的區(qū)別,并對把傳統(tǒng)Web服務(wù)轉(zhuǎn)成微服務(wù)的趨勢提出了質(zhì)疑。
微服務(wù)不是企業(yè)服務(wù)總線里的Web服務(wù),也不是傳統(tǒng)的面向服務(wù)架構(gòu),盡管它沿襲了SOA的一些基本概念。從根本上來說,微服務(wù)跟SOA是不一樣的,因為整個環(huán)境已經(jīng)發(fā)生了徹底的轉(zhuǎn)變。
微服務(wù)架構(gòu)的環(huán)境是沒有邊界的:端到端,基于云的應(yīng)用程序運行在完全虛擬和容器化的基礎(chǔ)設(shè)施上。容器把應(yīng)用程序和服務(wù)組件化,DevOps為IT基礎(chǔ)設(shè)施提供框架,幫助自動化開發(fā)、部署和管理環(huán)境。
雖然容器對微服務(wù)來說不是必需的,不過微服務(wù)可以很容易地運行在容器里。況且,把非微服務(wù)的代碼部署在容器里不是一個明智的選擇。
Docker和其它容器技術(shù)在某種程度上已經(jīng)被視為微服務(wù)的最好伴侶。容器是運行微服務(wù)的最小資源子集。Docker簡化了微服務(wù)的開發(fā),讓集成測試變得更簡單。
容器有助于微服務(wù)開發(fā),但不是必需的。Docker也可以被用來部署單體應(yīng)用。微服務(wù)與容器可以很好地相融并進(jìn),不過微服務(wù)包含的東西遠(yuǎn)比容器多!
結(jié)論
應(yīng)用開發(fā)的風(fēng)格這幾年一直在變化,而微服務(wù)變得越來越流行。大公司把大型應(yīng)用拆分成可以單獨部署的小型應(yīng)用,這些小型應(yīng)用被部署在云端的容器里。開源微服務(wù)框架Light Java為這些運行在容器里的微服務(wù)提供了很多特性,它支持設(shè)計驅(qū)動,開發(fā)者只需要把注意力專注在業(yè)務(wù)邏輯上,剩下的事情可以由框架和DevOps流程來處理。