張峰
摘 要:微服務(wù)是近兩年流行起來的最優(yōu)秀的web系統(tǒng)架構(gòu)。文章由分析架構(gòu)演變到引出微服務(wù)架構(gòu)的內(nèi)容、優(yōu)點(diǎn)和架構(gòu)設(shè)計(jì)的最佳實(shí)踐等,得出微服務(wù)未來必然有很好的發(fā)展結(jié)論。
關(guān)鍵詞:微服務(wù);軟件架構(gòu);敏捷;Spring Cloud
中圖分類號(hào):TP311 文獻(xiàn)標(biāo)志碼:A 文章編號(hào):2095-2945(2017)22-0048-02
1 概述
隨著互聯(lián)網(wǎng)越來越深入人們生活,web系統(tǒng)在人們生活中有著舉足輕重的地位。web技術(shù)正以前所未有的速度發(fā)生著巨大變革,服務(wù)端技術(shù)微服務(wù)架構(gòu)+虛擬化已經(jīng)興起。本文從web系統(tǒng)架構(gòu)演變?nèi)胧郑懻撆d起的微服務(wù)技術(shù)和相關(guān)的架構(gòu)及開源項(xiàng)目。討論適合小團(tuán)隊(duì)的微服務(wù)開發(fā)架構(gòu)體系,分析微服務(wù)技術(shù)應(yīng)用系統(tǒng)的趨勢(shì)。
2 web系統(tǒng)架構(gòu)演變
web系統(tǒng)最早出現(xiàn)在1980萬維網(wǎng)的發(fā)明者蒂姆·伯納斯-李(Tim Berners-Lee)設(shè)計(jì)的ENQUIRE項(xiàng)目上。從此web技術(shù)經(jīng)歷了幾次改變。從網(wǎng)絡(luò)結(jié)構(gòu)和軟件架構(gòu)上看,web系統(tǒng)架構(gòu)粗略經(jīng)歷了以下階段:
第一階段單機(jī)構(gòu)建模式。最早的軟件開發(fā)基本上是C/S即客戶端服務(wù)器模式。單機(jī)構(gòu)建模式即一臺(tái)服務(wù)器承擔(dān)所有訪問請(qǐng)求和數(shù)據(jù)計(jì)算任務(wù)。這通常受單臺(tái)服務(wù)器計(jì)算能力和IO瓶頸的制約。但這個(gè)階段已經(jīng)形成了應(yīng)用系統(tǒng)和數(shù)據(jù)庫系統(tǒng)兩部分的工作模式,這個(gè)模式通常在小規(guī)模企業(yè)及單店規(guī)模適用。
第二階段應(yīng)用與數(shù)據(jù)庫服務(wù)器分離。以O(shè)racle數(shù)據(jù)庫為代表的DBMS系統(tǒng)規(guī)模越來越大,消耗系統(tǒng)資源越來越多。于是應(yīng)用系統(tǒng)和數(shù)據(jù)庫系統(tǒng)分離為各自部署到獨(dú)立的服務(wù)器中。兩臺(tái)硬件服務(wù)器之間的網(wǎng)絡(luò)連接要可靠、快速、容錯(cuò)。這個(gè)階段還增加了頁面緩存、頁面片段緩存、數(shù)據(jù)內(nèi)存緩存等在應(yīng)用服務(wù)器和數(shù)據(jù)庫之間。
第三階段應(yīng)用服務(wù)器集群。隨著web系統(tǒng)訪問量逐步增高,應(yīng)用服務(wù)器計(jì)算資源逐步耗盡,只有增加應(yīng)用系統(tǒng)的服務(wù)器才能解決。隨著獨(dú)立計(jì)算資源的擴(kuò)展,他們之間的協(xié)調(diào)帶來了好多問題。Oracle從10g通過CRS開始支持集群。解決了的用戶訪問壓力,但需要做的就是硬件的投入。
第四階段微服務(wù)架構(gòu)與虛擬化。現(xiàn)在以亞馬遜為代表的大量的微服務(wù)架構(gòu)應(yīng)用系統(tǒng)開始呈現(xiàn)高速的發(fā)展趨勢(shì)。服務(wù)化架構(gòu)的演進(jìn)也經(jīng)歷了幾個(gè)階段:MVC、RPC、SOA,現(xiàn)在到了微服務(wù)。近年來微服務(wù)成為大規(guī)模、高服務(wù)質(zhì)量web系統(tǒng)解決方案之一。
3 微服務(wù)基礎(chǔ)理論和基礎(chǔ)架構(gòu)選型
微服務(wù)一詞來源于一篇著名的博文Microservices,作者是Martin Fowler。是一種軟件設(shè)計(jì)風(fēng)格,每個(gè)服務(wù)都獨(dú)立存儲(chǔ)數(shù)據(jù)、獨(dú)立按業(yè)務(wù)功能模塊開發(fā)、測(cè)試及部署,系統(tǒng)間通過通信協(xié)議關(guān)聯(lián)起來組成完整的應(yīng)用系統(tǒng)。通常服務(wù)之間的通信協(xié)議采用RESTful API,也是高并發(fā)大型應(yīng)用系統(tǒng)的必然發(fā)展結(jié)果。拆分單體所面臨的問題增加很多,為解決這些問題在微服務(wù)理論框架下引申出非常多的概念,下面以不同角度認(rèn)識(shí)微服務(wù)架構(gòu)體系。
首先,微服務(wù)的九大特性[1]。Martion Fowler在Microservices一文中提煉出,這是了解微服務(wù)的最重要內(nèi)容。
服務(wù)組件化:微服務(wù)的對(duì)立面就是單體結(jié)構(gòu),將單體拆分后組件化。
按業(yè)務(wù)組織團(tuán)隊(duì):微服務(wù)化后每一個(gè)或一個(gè)可用域可以是一個(gè)團(tuán)隊(duì)開發(fā)。
做“產(chǎn)品”的態(tài)度:軟件工程項(xiàng)目需要反復(fù)調(diào)優(yōu)不斷優(yōu)化以適應(yīng)業(yè)務(wù)彈性的環(huán)境。
智能端點(diǎn)與啞管道(Smart endpoints and dumb pipes):單體的內(nèi)部模塊調(diào)用常用的是函數(shù)調(diào)用和RPC方式,而微服務(wù)是更粗粒度的通信協(xié)議建立關(guān)系。
去中心化治理:微服務(wù)采用分散的管理方式,每個(gè)微服務(wù)團(tuán)隊(duì)內(nèi)部有充分自由自組織技術(shù)棧。
去中心化管理數(shù)據(jù):數(shù)據(jù)庫可以分散到各個(gè)微服務(wù)中去,同時(shí)被透明化不可以被訪問。所以徹底的微服務(wù)化所有的信息傳遞只有微服務(wù)接口一個(gè)通道。
基礎(chǔ)設(shè)施自動(dòng)化:當(dāng)服務(wù)數(shù)量快速增加軟件開發(fā)要保持快速迭代必須要做到自動(dòng)化,另外近兩年DevOps在大陸也逐漸獲得廣泛認(rèn)可,這是微服務(wù)化重要保證。
容錯(cuò)設(shè)計(jì):服務(wù)間調(diào)用允許出錯(cuò),在此方面必須表現(xiàn)出彈性。
演進(jìn)式設(shè)計(jì):沒有完美的程序,在軟件的生命周期中把這當(dāng)成必然并支持不斷演進(jìn)式設(shè)計(jì)開發(fā),不斷完善而非一次完成。
其次,微服務(wù)架構(gòu)技術(shù)選型。當(dāng)前比較流行的微服務(wù)架構(gòu)技術(shù)體系有三種:Dubbo;Spring Cloud:Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具[2](例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智能路由,微代理,控制總線);Netflix的Karyon/Ribbon。幾年前Netflix就把它的幾乎整個(gè)微服務(wù)框架棧開源,Spring將其吸收進(jìn)Spring cloud中。所以基本上是兩種阿里的Dubbo和Spring Cloud。建議采用Spring cloud,這是目前比較受認(rèn)可的微服務(wù)架構(gòu)技術(shù)主流。
第三,Spring cloud開發(fā)基礎(chǔ)構(gòu)件介紹。Spring boot:是Pivotal團(tuán)隊(duì)開發(fā)的能夠簡化便利地使用Spring創(chuàng)建和開發(fā)應(yīng)用的框架[3],它是Spring cloud的基礎(chǔ)。Spring MVC、H5、Bootstrap:這些是web展現(xiàn)層和控制層框架,雖然同類技術(shù)很多但這些逐漸占據(jù)主流。JPA、Spring data:這是推薦使用的數(shù)據(jù)持久層框架,在持久層使用Spring data技術(shù)實(shí)現(xiàn)JPA,引擎通常使用Hibernate。Docker、K8S:Docker是一個(gè)開源的應(yīng)用容器引擎,讓開發(fā)者可以打包他們的應(yīng)用以及依賴包到一個(gè)可移植的容器中,然后發(fā)布到任何流行的Linux機(jī)器上。通常一個(gè)Docker包含一個(gè)服務(wù)。k8s是Google的Kubernetes,在Docker技術(shù)的基礎(chǔ)上,為容器化的應(yīng)用提供部署運(yùn)行、資源調(diào)度、服務(wù)發(fā)現(xiàn)和動(dòng)態(tài)伸縮等一系列完整功能。微服務(wù)正是由于容器技術(shù)的突破才迅速發(fā)展起來。Mysql、Redis:Mysql是開源數(shù)據(jù)庫,但其在互聯(lián)網(wǎng)的表現(xiàn)非常優(yōu)秀,因?yàn)槠湫∏伸`活常被部署到Docker中。Redis是一個(gè)key-value存儲(chǔ)系統(tǒng),和Memcached類似。
第四,微服務(wù)應(yīng)用六大關(guān)鍵技術(shù)。完整的微服務(wù)架構(gòu)包含很多的功能點(diǎn),如果選出最為關(guān)鍵的幾項(xiàng)而且忽略掉常見的一般單體系統(tǒng)也具有的關(guān)鍵技術(shù),應(yīng)該是以下六點(diǎn):服務(wù)注冊(cè)和發(fā)現(xiàn)、負(fù)載均衡、斷路保護(hù)、微服務(wù)網(wǎng)關(guān)、分布式/版本化配置、消息驅(qū)動(dòng)和總線。在微服務(wù)架構(gòu)體系中還有很多關(guān)鍵技術(shù)和相應(yīng)的實(shí)現(xiàn)組件,數(shù)量之多常常讓人覺得難以學(xué)習(xí),微服務(wù)化的道路不簡單。
4 大型網(wǎng)站的微服務(wù)架構(gòu)設(shè)計(jì)
首先,微服務(wù)化設(shè)計(jì)方式:需要對(duì)業(yè)務(wù)進(jìn)行拆分,要做好微服務(wù)的分層,要分布式的部署和調(diào)用。其次功能完整性和職責(zé)單一性。第三是迭代演進(jìn)不要想著一次成功。最后是接口API的版本優(yōu)先考慮兼容性。
其次,業(yè)務(wù)模型設(shè)計(jì)。微服務(wù)業(yè)務(wù)開發(fā)三個(gè)難題-拆分、事務(wù)、查詢,其中業(yè)務(wù)拆分受架構(gòu)本身和人的因素兩方面影響。在業(yè)務(wù)模塊拆分上可以采用以下方式??傮w上分表現(xiàn)層、業(yè)務(wù)服務(wù)層、公共服務(wù)層、服務(wù)監(jiān)控與治理層、實(shí)體和接口層和資源層。發(fā)布上可以采用多種協(xié)議,建議是RESTful API的形式。資源層是數(shù)據(jù)庫、Redis、File system、cache等。
第三,技術(shù)模型設(shè)計(jì)和物理結(jié)構(gòu)。在spring cloud 的解決方案中主要組件部署關(guān)系是瀏覽器訪問API網(wǎng)關(guān),通過客戶端負(fù)載均衡到達(dá)服務(wù)組件,服務(wù)組件在此之前就向治理中心和配置中心關(guān)聯(lián)好,Kibana是一個(gè)為 Logstash和ElasticSearch提供的日志分析的 Web接口??墒褂盟鼘?duì)日志進(jìn)行高效的搜索、可視化、分析等各種操作。物理上所有的服務(wù)都可以部署到Docker上,而Docker由K8S來管理。整個(gè)開發(fā)部署環(huán)節(jié)按DveOps執(zhí)行。這樣形成了物理的服務(wù)器變成一種計(jì)算資源可以按需求由K8S隨意調(diào)配,而Docker 可以利用registry搭建本地私有倉庫,實(shí)現(xiàn)了Docker部署的靈活性和安全性。同時(shí)使用Jenkins+Maven+Git搭建持續(xù)集成和自動(dòng)化部署的環(huán)境。
5 微服務(wù)架構(gòu)下的團(tuán)隊(duì)協(xié)作
微服務(wù)帶來的便捷的同時(shí)我們也經(jīng)常聽到一句話“微服務(wù)不是免費(fèi)的午餐”,同時(shí)敏捷開發(fā)也常見到項(xiàng)目失敗的案例。如何提高團(tuán)隊(duì)?wèi)?yīng)對(duì)微服務(wù)挑戰(zhàn)的成熟度,對(duì)于一個(gè)計(jì)劃實(shí)施微服務(wù)的團(tuán)隊(duì)提出一些建議。
梳理最后一公里和運(yùn)維的需求。包括基礎(chǔ)環(huán)境的準(zhǔn)備、部署發(fā)布、運(yùn)營監(jiān)控?;A(chǔ)環(huán)境的準(zhǔn)備要求能快速響應(yīng)需求到新功能自動(dòng)更新,推薦基礎(chǔ)設(shè)施及代碼的實(shí)踐,考慮構(gòu)建團(tuán)隊(duì)DevOps能力,以實(shí)現(xiàn)小步快跑的持續(xù)迭代能力。為服務(wù)架構(gòu)最大的挑戰(zhàn)是微服務(wù)數(shù)量龐大,能夠快速部署上線對(duì)團(tuán)隊(duì)的能力提出很高的要求,建議分離生產(chǎn)環(huán)境、預(yù)發(fā)布環(huán)境和測(cè)試環(huán)境。流水線部署,自動(dòng)化腳本實(shí)現(xiàn)快速部署、配置管理、版本管理等,并相應(yīng)改進(jìn)微服務(wù)化后的獎(jiǎng)勵(lì)機(jī)制都是微服務(wù)架構(gòu)下團(tuán)隊(duì)協(xié)作的重要保障。
6 微服務(wù)架構(gòu)應(yīng)用發(fā)展的展望
微服務(wù)架構(gòu)目前在國外被很多大互聯(lián)網(wǎng)公司采用[4],如
Google、Twitter, Netflix, Amazon, eBay等。國內(nèi)采用微服務(wù)架構(gòu)的有淘寶、京東、微博、微信等。微服務(wù)會(huì)有很大的發(fā)展,但同時(shí)也要看到微服務(wù)架構(gòu)的一些缺點(diǎn)。如,微服務(wù)架構(gòu)可能帶來過多的操作;DevOps是必須的;可能需要付出更多努力;分布式系統(tǒng)可能復(fù)雜難以管理;因?yàn)榉植疾渴鸶檰栴}難;當(dāng)服務(wù)數(shù)量增加,管理復(fù)雜性增加。雖然有這些缺點(diǎn),當(dāng)前微服務(wù)架構(gòu)仍是大型網(wǎng)站架構(gòu)體系發(fā)展的趨勢(shì),這些問題也會(huì)隨著社區(qū)和大公司的努力逐。
參考文獻(xiàn):
[1]ChrisRichardson,“Microservices Architecture”[EB/OL].http://microservices.io/patterns/microservices.html
[2]張晶,王琰潔,黃小鋒.一種微服務(wù)框架的實(shí)現(xiàn)[J].計(jì)算機(jī)系統(tǒng)應(yīng)用,2017(04):82-86.
[3]蔣勇.基于微服務(wù)架構(gòu)的基礎(chǔ)設(shè)施設(shè)計(jì)[J].軟件,2016(05):93-97.
[4]鄧杰文,曹彩鳳.微服務(wù)若干關(guān)鍵問題研究[J].五邑大學(xué)學(xué)報(bào)(自然科學(xué)版),2016(02):49-54.