淺談服務(wù)治理與微服務(wù)
作者:Heaven-Wang
來源:blog.csdn.net/suifeng3051
近期都在談微服務(wù),本人也正在做相關(guān)的工作,應(yīng)領(lǐng)導(dǎo)要求做了一個微服務(wù)的分享,本篇文章主要來源于分享的PPT,所以有些簡單,有問題可以在下面留言,大家 一起討論。
本篇文章先簡單介紹了互聯(lián)網(wǎng)架構(gòu)的演變,進(jìn)而介紹了服務(wù)化,最后再介紹微服務(wù),微服務(wù)是服務(wù)治理的升級也是互聯(lián)網(wǎng)架構(gòu)的進(jìn)一步延伸。
互聯(lián)網(wǎng)架構(gòu)演變
一體架構(gòu)
在計算機軟件發(fā)展早期,一般桌面軟件都是采用這種架構(gòu),不管是界面還是業(yè)務(wù)處理還是數(shù)據(jù)處理都放到一個包中。這種其實談不上架構(gòu),但也可以說是很好的架構(gòu),因為它足夠簡單。

mvc架構(gòu)
但隨著瀏覽器的出現(xiàn)便產(chǎn)生了web應(yīng)用,web應(yīng)用的特點是界面部分是顯示在瀏覽器中,服務(wù)處理是在服務(wù)容器中的,頁面顯示一般用css+js+html技術(shù)來處理,而后端可以用java、php等語言,這就產(chǎn)生了前后端分離。對于web系統(tǒng),一體架構(gòu)難以滿足前后端分離的開發(fā)需求,因而便產(chǎn)生了MVC架構(gòu)。

MVC才算的上真正意義上的架構(gòu),因為它除了解決了前后端分離問題,還引入了一種全新的開發(fā)模式,用一種業(yè)務(wù)邏輯、數(shù)據(jù)、界面顯示分離的方法組織代碼,使得整個應(yīng)用層次更加分明,而且各個層次之間不但減低了耦合性,還提高了各個層次的可重用性。
但隨著應(yīng)用規(guī)模的不斷擴大,應(yīng)用模塊不斷增加,整個應(yīng)用也顯得越來越臃腫,維護(hù)起來也更加困難,因此便又產(chǎn)生了多應(yīng)用架構(gòu)。
多應(yīng)用架構(gòu)
多應(yīng)用架構(gòu)很簡單,就是把原來的應(yīng)用按照業(yè)務(wù)特點拆分成多個應(yīng)用。比如一個大型電商系統(tǒng)可能包含用戶系統(tǒng)、商品系統(tǒng)、訂單系統(tǒng)、評價系統(tǒng)等等,我們可以把他們獨立出來形成一個個單獨的應(yīng)用。多應(yīng)用架構(gòu)的特點是應(yīng)用之間各自獨立 ,不相互調(diào)用。

多應(yīng)用雖然解決了應(yīng)用臃腫問題,但應(yīng)用之間相互獨立,有些共同的業(yè)務(wù)或代碼無法復(fù)用。
分布式架構(gòu)
對于一個大型的互聯(lián)網(wǎng)系統(tǒng),一般會包含多個應(yīng)用,而且應(yīng)用之間往往還存在共同的業(yè)務(wù),并且應(yīng)用之間還存在調(diào)用關(guān)系。除此之外 ,對于大型的互聯(lián)網(wǎng)系統(tǒng)還有一些其它的挑戰(zhàn),比如如何應(yīng)對急劇增長的用戶,如何管理好研發(fā)團(tuán)隊快速迭代產(chǎn)品研發(fā),如何保持產(chǎn)品升級更加穩(wěn)定等等 。
因此,為了使業(yè)務(wù)得到很好的復(fù)用,模塊更加容易拓展和維護(hù),我們希望業(yè)務(wù)與應(yīng)用分離,某個業(yè)務(wù)不再屬于一個應(yīng)用,而是作為一個獨立的服務(wù)單獨進(jìn)行維護(hù)。應(yīng)用本身不再是一個臃腫的模塊堆積,而是由一個個模塊化的服務(wù)組件組合而成。

服務(wù)化
服務(wù)化的特點
上面介紹的分布式架構(gòu)即服務(wù)化。我們再總結(jié)一下,服務(wù)化主要有如下特點:
應(yīng)用按業(yè)務(wù)拆分成服務(wù)
各個服務(wù)均可獨立部署
服務(wù)可被多個應(yīng)用共享
服務(wù)之間可以通信
服務(wù)化的好處
那么企業(yè)采用服務(wù)化有哪些好處呢?
架構(gòu)上系統(tǒng)更加清晰
核心模塊穩(wěn)定,以服務(wù)組件為單位進(jìn)行升級,避免了頻繁發(fā)布帶來的風(fēng)險
開發(fā)管理方便
單獨團(tuán)隊維護(hù)、工作分明,職責(zé)清晰
業(yè)務(wù)復(fù)用、代碼復(fù)用
非常容易拓展
服務(wù)化實現(xiàn)方式
如果要實現(xiàn)服務(wù)化的話,最常用的方式就是利用RPC框架。因為服務(wù)組件一般分布在不同的服務(wù)器上,所以要實現(xiàn)服務(wù)化需要解決的第一個問題就是RPC遠(yuǎn)程服務(wù)調(diào)用。類似于RPC方案有很多,比如:
Java RMI
WebService
Hessian
Http
Thrift
服務(wù)化面臨的挑戰(zhàn)
上面提到要實現(xiàn)服務(wù)化首先需要解決遠(yuǎn)程服務(wù)調(diào)用問題,除此之外,還有很多其他問題需要解決。
服務(wù)越來越多,配置管理復(fù)雜
服務(wù)間依賴關(guān)系復(fù)雜
服務(wù)之間的負(fù)載均衡
服務(wù)的拓展
服務(wù)監(jiān)控
服務(wù)降級
服務(wù)鑒權(quán)
服務(wù)上線與下線
服務(wù)文檔
服務(wù)治理
上面提到了服務(wù)化,其實要想服務(wù)化,服務(wù)治理是關(guān)鍵。那么有沒有好的服務(wù)治理方案呢?答案是有的,而且很多人都在用這個框架,他就是-dubbo。dubbo就是一個帶有服務(wù)治理功能的RPC框架。

dubbo提供了一套較為完整的服務(wù)治理方案,所以企業(yè)如果要實現(xiàn)服務(wù)化的話,dubbo 是很好的一個選擇。這里簡單介紹一下dubbo服務(wù)治理相關(guān)方案。
服務(wù)發(fā)現(xiàn)注冊
服務(wù)治理領(lǐng)域最重要的問題就是服務(wù)發(fā)現(xiàn)與注冊。dubbo中引入了一個注冊中心的概念,服務(wù)的注冊與發(fā)現(xiàn)主要就依賴這個服務(wù)中心。

dubbo注冊中心服務(wù)注冊發(fā)現(xiàn)的具體過程:
服務(wù)提供者啟動,向注冊中心注冊自己提供的服務(wù)
消費者啟動,向注冊中心訂閱自己需要的服務(wù)
注冊中心返回服務(wù)提供者的列表給消費者
消費者從服務(wù)提供者列表中,按照軟負(fù)載均衡算法,選擇一臺發(fā)起請求
服務(wù)監(jiān)控

集群容錯

負(fù)載均衡
Random Loadbalance
RoundRobin
LeastActive
ConsistentHash
dubbo服務(wù)治理優(yōu)勢
注冊中心只負(fù)責(zé)注冊查找,不負(fù)責(zé)請求轉(zhuǎn)發(fā),壓力小
注冊中心宕機影響消費者,消費者本地緩存服務(wù)地址列表
注冊中心對等集群,宕掉一臺自動切換到另外 一臺
服務(wù)提供者無狀態(tài),可動態(tài)部署,注冊中心負(fù)責(zé)推送
統(tǒng)計無壓力,本地內(nèi)存中累計次數(shù),每分鐘發(fā)送注冊中心
消費者調(diào)用服務(wù)者,自動軟負(fù)載均衡
通過服務(wù)中心可追蹤依賴關(guān)系
監(jiān)控中心為擴容和降級提供依據(jù)
可啟用acl機制進(jìn)行鑒權(quán)
與Spring整合,接入簡單松耦合
多種序列化協(xié)議支持
dubbo的不足
消費者仍需要依賴配置中心
消費者仍需要依賴jar包配置provider
提供者文檔管理功能缺失
無統(tǒng)一入口
不支持OAuth2.0
內(nèi)部鑒權(quán)不方便管理
無外部應(yīng)用鑒權(quán)
接口基本裸奔,無法直接對外暴露服務(wù)
IT治理不方便
微服務(wù)
現(xiàn)在很多人都在談微服務(wù),那么到底什么是微服務(wù)呢?這里談?wù)勎覍ξ⒎?wù)的理解。
微服務(wù)有兩個核心:
微:服務(wù)的粒度要細(xì),即服務(wù)要細(xì)化到API
服務(wù):提供好服務(wù),要讓用戶感到好用(要做到這一點很不容易)
上面兩個核心總結(jié)起來,可以用下面這幅圖表示:

從上面這幅圖看出,微服務(wù)特別簡單(好的架構(gòu)就應(yīng)該簡單),我們把服務(wù)再拆分成一個個API,API是一個完整的功能。然后我們把API扔到一個“云上”,然后用戶就可以到“云上”獲取所有API的服務(wù),這個“云”保證能提供好的服務(wù)。
我們可以看到,有了微服務(wù)之后,服務(wù)對用戶來說變得特別簡單,而且上面dubbo的不足之處在微服務(wù)這里都解決了。使用者不再需要依賴任何jar包,不再需要去注冊中心查找服務(wù),不再去做鑒權(quán)處理,不用擔(dān)心服務(wù)掛掉,不用擔(dān)心不會使用服務(wù),所有的問題這個“云”都解決了。這也是微服務(wù)的核心之一,提供好服務(wù)。
說到這里,大家就應(yīng)該大體知道該怎么做微服務(wù)了,圖中的“云”是關(guān)鍵。下面我們就慢慢撥開這朵云。
微服務(wù)的實現(xiàn)

微服務(wù)的關(guān)鍵是服務(wù)網(wǎng)關(guān),所以,上面提到的“云”就是服務(wù)網(wǎng)關(guān)。要做微服務(wù),我們先定義一下微服務(wù)需要具備的特點。
微服務(wù)的特點
服務(wù)需要再細(xì)化成API(服務(wù)接口——>服務(wù)API)
每個服務(wù)由一組API組成
以API形式對外提供統(tǒng)一格式的服務(wù)
使用者無需任何配置,直接調(diào)用(http)
完整的API文檔
API服務(wù)安全可靠穩(wěn)定
微服務(wù)要解決的問題
上面提到了,dubbo還存在一些問題 ,其實dubbo存在的問題 就是 微服務(wù)要解決的問題,這里 再總結(jié)一下。當(dāng)然,dubbo和微服務(wù)的側(cè)重點不一樣,dubbo側(cè)重于內(nèi)部接口之間的RPC,而微服務(wù)則側(cè)重于對外提供服務(wù)。
統(tǒng)一入口
安全控制:防刷限流
統(tǒng)一鑒權(quán):應(yīng)用鑒權(quán)、用戶鑒權(quán)、OAuth鑒權(quán)、ACL
協(xié)議轉(zhuǎn)換:http、dubbo、Protobuf
API配置管理
API上線、下線
API與服務(wù)接口映射
監(jiān)控與報警
整體架構(gòu)的可拓展、高并發(fā)、分布式
服務(wù)容器自動收縮、擴容
實現(xiàn)方案

負(fù)載均衡層:nginx/lvs/F5
微服務(wù)層
高性能服務(wù)網(wǎng)關(guān)
統(tǒng)一入口、API配置管理、分流鑒權(quán)、服務(wù)監(jiān)控、協(xié)議轉(zhuǎn)換
API映射、OAuth2.0、API文檔管理
分布式、可拓展
服務(wù)治理層
成熟的服務(wù)治理框架dubbo
MQ服務(wù)之間解耦
彈性云
服務(wù)docker化
基于訪問壓力的實時集群調(diào)度與管理
彈性云
這里簡單介紹一下彈性云的概念,微服務(wù)要想提供好服務(wù),保證API不能掛掉并且有好的性能,需要很高的運維要求。這里的彈性云便是自動化運維解決方案,對訪問壓力進(jìn)行監(jiān)控,根據(jù)監(jiān)控解決調(diào)度應(yīng)用的發(fā)布和回收。

