陶璐
【摘 要】微服務構架(Microservice Architecture)體系表述的應用設計方案是一個相對單獨運轉工作的構架體系。這種構架體系以工作自動部署、運轉速率、點到點的重組、結合以及數據控制和語言控制的分散性上面展開。微服務這種架構風格就是把一組小服務演化成為一個單一的應用的一種方法。每個應用都運行在自己的進程中,并通過輕量級的機制保持通信,就像HTTP這樣的API[1]。這些服務要基于業務場景,并使用自動化部署工具進行獨立的發布。可以有一個非常輕量級的集中式管理來協調這些服務,可以使用不同的語言來編寫服務,也可以使用不同的數據存儲。通常微服務可以針對性的完成一些功能,如訂單統計、用戶統計等。微服務在實際運用中都是一個擁有自我規律和自適應的小型多邊形應用程序。個別的微服務還將向別的微服務以及客戶端發送API。當完成Web UI,運算中的云VM(2)以及DOCKER容器[3]都可以成為一個實例。
【關鍵詞】服務構架;微服務;SOA;單塊服務
中圖分類號: TP312 文獻標識碼: A 文章編號: 2095-2457(2018)28-0210-002
DOI:10.19694/j.cnki.issn2095-2457.2018.28.096
【Abstract】Microservice architecture is used to describe the design of an independent software application deployment,This architecture is around business capabilities,automated deployment,end to end above decentralized control and the integration of language and data.This microservice architecture style is a group of small service evolution has become a method for a single application.Each application runs in its own process,and maintain communication through a lightweight mechanism,such as HTTP API.These services should be based on the business scene,publish and use automated deployment tool independently.There can be a very lightweight centralized management to coordinate these services,you can use different language services,can also use different data storage.A microservice typically performs a specific function,such as order management,customer management,etc.each of the micro services is a miniature hexagonal application that has its own business logic and adapters.Some microservices will also release API to other micro services and application clients.Other micro services to complete a Web UI,run-time,each instance may be a cloud VM or Docker container.
【Key words】Service Architecture;Microservice;SOA;Monolith
1 微服務與SOA的區別
SOA的提出是在企業計算領域,就是要將緊耦合的系統,劃分為面向業務的,粗粒度,松耦合,無狀態的服務[4]。服務發布出來供其他服務調用,一組互相依賴的服務就構成了SOA架構下的系統。基于這些基礎的服務,可以將業務過程用類似BPEL流程的方式編排起來,而BPEL反映的是業務處理的過程,這些過程對于業務人員更為直觀,調整也比hardcode的代碼更容易。當然企業還需要對服務治理,比如服務注冊庫,監控管理等。我們知道企業計算領域,如果不是交易系統的話,并發量都不是很大的,所以大多數情況下,一臺服務器就容納將許許多多的服務,這些服務采用統一的基礎設施,可能都運行在一個應用服務器的進程中。雖然說是面向服務了,但還是單一的系統。
而微服務架構大體是從互聯網企業興起的,由于大規模用戶,對分布式系統的要求很高,如果像企業計算那樣的系統,伸縮就需要多個容納許許多多的服務的系統實例,前面通過負載均衡使得多個系統成為一個集群。但這是很不方便的,互聯網企業迭代的周期很短,一周可能發布一個版本,甚至可能每天一個版本,而不同的子系統的發布周期也是不一樣的。而且,不同的子系統也不像原來企業計算那樣采用集中式的存儲,使用昂貴的Oracle存儲整個系統的數據,或使用MongoDB、HBase[5]、Cassandra和其他NoSQL[6]數據庫和Redis、MemCache等。那么就傾向采用以子系統為分割,不同的子系統采用自己的架構,那么各個服務運行自己的Web容器中,當需要增加計算能力的時候,只需要增加這個子系統或服務的實例就好了,當升級的時候,可以不影響別的子系統。這種組織方式大體上就被稱作微服務架構。
Microservice與SOA相比,Microservice強調分布式系統的特性,如橫向可伸縮性,服務識別,負載均衡,故障扭轉,高可用。互聯網開發對服務治理提出了更多的要求,比如多版本,比如灰度升級,比如服務降級,比如分布式跟蹤,這些都是在SOA實踐中重視不夠的。Docker容器技術的出現,為微服務提供了更便利的條件,比如更小的部署單元,每個服務可以通過類似Node.js或Spring Boot的技術運行在自己的進程中[7]。可能在幾十臺計算機中運行成千上萬個Docker容器,每個容器都運行著服務的一個實例。隨時可以增加某個服務的實例數,或者某個實例崩潰后,在其他的計算機上再創建該服務的新的實例。
2 傳統網站架構模式
傳統模式下我們所開發的服務對應的代碼是由多個項目組成的,每個項目都具有一個明確的范圍,來提供自身會相應的功能。如圖1所示,以下項目在編輯過程中被逐個打成JAR包,最后統一打成WAR包。接著,我們將該WAR包上傳至Web容器中,解壓縮WAR包、重啟服務器。在一系列操作執行后,我們就完成了服務的編譯和部署。在這個WAR包里,含括了這些相關代碼和所需功能的項目組織被稱之為單塊服務。在項目較小的情況下,這種代碼組織方式還是可以接受的,更改代碼后,測試開發者可以單獨部署新編譯的WAR包并測試這些更改。但是隨著項目越來越大,整個開發過程需要很長時間:縱然只有一行代碼被更改,開發者也要花費數十分鐘甚至數小時來編譯所有代碼,然后花費大量時間重新部署新開發的產品來驗證所做的修改正確與否。
假如部署應用程序很繁瑣,但是為了測試自己的改進,那么開發者還需要在部署之前進行大量的環境設置,這使得軟件開發者的工作異常的復雜和枯燥。正如您在圖2中看到的,開發者用于編譯和部署上所用的時間線圖多于甚至超過了對代碼進行測試更改的時間線圖,可見效率已經變得十分低下。除此之外,因為按單塊服務所組織的代碼在生成過程中只出現一個具備所有功能項的WAR包,因而為了擴展服務容量只有選擇反復生成WAR包。
如此以來對于資源的占用又是非常大的。以圖3所示:服務中,負載的組件數值已到90%,可以理解為服務容量已經到了必須擴展的時候。而同時工作的另外三個組件還未能達到它所處理能力的20%。由于單塊服務的每個組件都打包在同一個WAR包中,所以另外增加的一個服務模式則需要把擴展的組件上的負載減少到45%,但是也使其他組件的利用率更低[8]。單塊服務之所以造成眾多不便,主要是服務的所有功能都在一個WAR包內涵蓋了。想要解決這個難題就需要運用微服務架構模式。
3 微服務架構模式
微服務架構模式就是把Web化整為零,生成眾多小型的Wed服務。分解后的Web服務能夠實現編譯、部署,并在各自的API端口基礎上達成聯系[9]。
如圖4所示,它們相互配合。作為一個整體為用戶提供功能,又能自由擴容。使用微服務架構模式,開發者能夠由編譯、重新部署單個子服務來驗證他們的變更,而無需整體重新編譯,可以省去大量時間和精力。因為子服務之間是相對并立的,所以每個服務可以決定其最佳實現方式,使得這些子服務的開發變得更為便捷。最后,當運轉中的系統發生了容量不足,我們只需要找到形成系統瓶頸對應的子服務項,并擴充該子服務的容量即可。
4 結語
以上介紹的就是微服務架構模式。事實中,這種構架模式是在不斷的發展、進步、完善。在許多文獻及研討中,還沒有就模式的標準實現和最佳實踐形成一個大家一致認同的強有力的說法。因此,本文提到的一系列經驗,也是在參考文獻和討論中達成的基本共識的。大家在實現自己的Microservice構架模式時,可以學習這些經驗,也可以對微服務構架模式的體現方式作出一些調整來完成項目自身的需求。
【參考文獻】(References)
[1]VILLAMIZAR M,GARCES O,CASTRO H,et al.Evaluating the monolithic and the microservice architecture pattern to deploy web applications in the cloud[C]//2015 10th Computing Colombian Conference,Bogota:IEEE,2015.
[2]Smith JE,Nair R.The architecture of virtual machines[J]. IEEE Transaction on Computer,2005,(5):32-38.
[3]Dua,Bangalore,Raja.Virtualization vs Containerization to Support Paa S.IEEE,2014,41:610-614.
[4]ERL T.Service-oriented architecture(SOA):concepts,technology,and design[J].Concepts,2005,118(2):33-37.
[5]Krisitina Chodorow.Scaling MongoDB.Sebastopol,CA:O'Reilly Media,2011.1-3
[6]Rick Cattell.Scalable SQL and NOSQL data stores.SIGMOD Record.2010.United States.Association for Computing Machinery.l2-13.
[7]RAUCH Guillermo.Smashing Node.js[M].America:Wiley,2012.
[8]王磊.微服務架構與實踐[M].西安:電子工業出版社,2015.
[9]王磊.基于微服務架構,改造企業核心系統之實踐.http://chuansong.me/n/969980351082.
[10]肖勤.微服務架構實踐經驗分享.http://www.csdn.net/article/2015-08-07/2825412.[2015-08-07].