一文帶你重頭梳理微服務(wù)架構(gòu)!
掃描二維碼
隨時(shí)隨地手機(jī)看文章
什么是微服務(wù)?
就目前而言,對(duì)于微服務(wù)業(yè)界并沒(méi)有一個(gè)統(tǒng)一的、標(biāo)準(zhǔn)的定義(While there is no precise definition of this architectural style ) 。
但通常在其而言,微服務(wù)架構(gòu)是一種架構(gòu)模式或者說(shuō)是一種架構(gòu)風(fēng)格,它提倡將單一應(yīng)用程序劃分成一組小的服務(wù),每個(gè)服務(wù)運(yùn)行獨(dú)立的自己的進(jìn)程中,服務(wù)之間互相協(xié)調(diào)、互相配合,為用戶提供最終價(jià)值。
服務(wù)之間采用輕量級(jí)的通信機(jī)制互相溝通(通常是基于 HTTP 的 RESTful API ) 。每個(gè)服務(wù)都圍繞著具體業(yè)務(wù)進(jìn)行構(gòu)建,并且能夠被獨(dú)立地部署到生產(chǎn)環(huán)境、類生產(chǎn)環(huán)境等。
另外,應(yīng)盡量避免統(tǒng)一的、集中式的服務(wù)管理機(jī)制,對(duì)具體的一個(gè)服務(wù)而言,應(yīng)根據(jù)業(yè)務(wù)上下文,選擇合適的語(yǔ)言、工具對(duì)其進(jìn)行構(gòu)建,可以有一個(gè)非常輕量級(jí)的集中式管理來(lái)協(xié)調(diào)這些服務(wù)。可以使用不同的語(yǔ)言來(lái)編寫(xiě)服務(wù),也可以使用不同的數(shù)據(jù)存儲(chǔ)。
根據(jù)馬丁.福勒的描述,我總結(jié)了以下幾點(diǎn):
①小服務(wù)
小服務(wù),沒(méi)有特定的標(biāo)準(zhǔn)或者規(guī)范,但他在總體規(guī)范上一定是小的。
②進(jìn)程獨(dú)立
每一組服務(wù)都是獨(dú)立運(yùn)行的,可能我這個(gè)服務(wù)運(yùn)行在 Tomcat 容器,而另一個(gè)服務(wù)運(yùn)行在 Jetty 上。可以通過(guò)進(jìn)程方式,不斷的橫向擴(kuò)展整個(gè)服務(wù)。
③通信
過(guò)去的協(xié)議都是很重的,就像 ESB,就像 SOAP,輕通信,這意味著相比過(guò)去更智能更輕量的服務(wù)相互調(diào)用,就所謂 smart endpoints and dumb pipes。
這些 Endpoint 都是解耦的,完成一個(gè)業(yè)務(wù)通信調(diào)用串起這些 Micro Service 就像是 Linux 系統(tǒng)中通過(guò)管道串起一系列命令業(yè)務(wù)。
過(guò)去的業(yè)務(wù),我們通常會(huì)考慮各種各樣的依賴關(guān)系,考慮系統(tǒng)耦合帶來(lái)的問(wèn)題。微服務(wù),可以讓開(kāi)發(fā)者更專注于業(yè)務(wù)的邏輯開(kāi)發(fā)。
④部署
不止業(yè)務(wù)要獨(dú)立,部署也要獨(dú)立。不過(guò)這也意味著,傳統(tǒng)的開(kāi)發(fā)流程會(huì)出現(xiàn)一定程度的改變,開(kāi)發(fā)的適合也要有一定的運(yùn)維職責(zé)。
⑤管理
傳統(tǒng)的企業(yè)級(jí) SOA 服務(wù)往往很大,不易于管理,耦合性高,團(tuán)隊(duì)開(kāi)發(fā)成本比較大。
微服務(wù),可以讓團(tuán)隊(duì)各思其政的選擇技術(shù)實(shí)現(xiàn),不同的 Service 可以根據(jù)各自的需要選擇不同的技術(shù)棧來(lái)實(shí)現(xiàn)其業(yè)務(wù)邏輯。
微服務(wù)的利與弊
為什么用微服務(wù)呢?因?yàn)楹猛妫?/span>不是的。下面是我從網(wǎng)絡(luò)上找到說(shuō)的比較全的優(yōu)點(diǎn):
-
優(yōu)點(diǎn)是每個(gè)服務(wù)足夠內(nèi)聚,足夠小,代碼容易理解這樣能聚焦一個(gè)指定的業(yè)務(wù)功能或業(yè)務(wù)需求。
-
開(kāi)發(fā)簡(jiǎn)單、開(kāi)發(fā)效率提高,一個(gè)服務(wù)可能就是專一的只干一件事。
-
微服務(wù)能夠被小團(tuán)隊(duì)單獨(dú)開(kāi)發(fā),這個(gè)小團(tuán)隊(duì)是 2 到 5 人的開(kāi)發(fā)人員組成。
-
微服務(wù)是松耦合的,是有功能意義的服務(wù),無(wú)論是在開(kāi)發(fā)階段或部署階段都是獨(dú)立的。
-
微服務(wù)能使用不同的語(yǔ)言開(kāi)發(fā)。
-
易于和第三方集成,微服務(wù)允許容易且靈活的方式集成自動(dòng)部署,通過(guò)持續(xù)集成工具,如 Jenkins,Hudson,bamboo。
-
微服務(wù)易于被一個(gè)開(kāi)發(fā)人員理解,修改和維護(hù),這樣小團(tuán)隊(duì)能夠更關(guān)注自己的工作成果。無(wú)需通過(guò)合作才能體現(xiàn)價(jià)值。微服務(wù)允許你利用融合最新技術(shù)。
-
微服務(wù)只是業(yè)務(wù)邏輯的代碼,不會(huì)和 HTML,CSS 或其他界面組件混合。
-
每個(gè)微服務(wù)都有自己的存儲(chǔ)能力,可以有自己的數(shù)據(jù)庫(kù),也可以有統(tǒng)一數(shù)據(jù)庫(kù)。
什么組織適合使用微服務(wù)?
微服務(wù)帶了種種優(yōu)點(diǎn),種種弊端,那么什么組織適合使用微服務(wù)?
①墨菲定律(設(shè)計(jì)系統(tǒng))和康威定律(系統(tǒng)劃分)
康威定律,是一個(gè)五十多年前就被提出來(lái)的微服務(wù)概念。在康威的這篇文章中,最有名的一句話就是:
Organizations which design systems are constrained to produce designs which are copies of the communication structures of these organizations.
-Melvin Conway(1967)
想想 Apple 的產(chǎn)品、微軟的產(chǎn)品設(shè)計(jì),就能形象生動(dòng)的理解這句話。
架構(gòu)是不斷演化出來(lái)的,微服務(wù)也是這樣,當(dāng)從各大科技公司,規(guī)模大到一定程度,完全需要演化成更進(jìn)一步管理的技術(shù)架構(gòu)體系。
我們做技術(shù)都是為了產(chǎn)品的,一旦過(guò)程出來(lái)了什么問(wèn)題,回溯尋找問(wèn)題會(huì)非常耗時(shí)。
使用了微服務(wù)架構(gòu)體系,團(tuán)隊(duì)組織方式需要轉(zhuǎn)變成跨職能團(tuán)隊(duì),即每個(gè)團(tuán)隊(duì)都有產(chǎn)品專家,策劃專家,開(kāi)發(fā)專家,運(yùn)維專家,他們使用 API 方式發(fā)布他們的功能,而平臺(tái)使用他們的功能發(fā)布產(chǎn)品。
微服務(wù)技術(shù)架構(gòu)體系
下面我分享一下大部分公司都使用的微服務(wù)技術(shù)架構(gòu)體系:
服務(wù)發(fā)現(xiàn)
主流的服務(wù)發(fā)現(xiàn),分為三種:
缺點(diǎn)是,由于服務(wù)沒(méi)有負(fù)載均衡功能,對(duì)負(fù)載均衡服務(wù),可能會(huì)有相當(dāng)大的性能問(wèn)題。
缺點(diǎn)是,對(duì)多語(yǔ)言環(huán)境不是很好,你需要單獨(dú)給消費(fèi)者的客戶端開(kāi)發(fā)服務(wù)發(fā)現(xiàn)和負(fù)載均衡功能。當(dāng)然了,這個(gè)方法通常都是用在 Spring Cloud 上的。
網(wǎng)關(guān)
將生活實(shí)際聯(lián)系到微服務(wù)上,就不難理解網(wǎng)關(guān)的意思了:
-
反向路由:很多時(shí)候,公司不想讓外部人員看到我們公司的內(nèi)部,就需要網(wǎng)關(guān)來(lái)進(jìn)行反向路由。即將外部請(qǐng)求轉(zhuǎn)換成內(nèi)部具體服務(wù)調(diào)用。
-
安全認(rèn)證:網(wǎng)絡(luò)中會(huì)有很多惡意訪問(wèn),譬如爬蟲(chóng),譬如黑客攻擊,網(wǎng)關(guān)維護(hù)安全功能。
-
限流熔斷:當(dāng)請(qǐng)求很多服務(wù)不堪重負(fù),會(huì)讓我們的服務(wù)自動(dòng)關(guān)閉,導(dǎo)致不能用服務(wù)。限流熔斷可以有效的避免這類問(wèn)題。
-
日志監(jiān)控:所有的外面的請(qǐng)求都會(huì)經(jīng)過(guò)網(wǎng)關(guān),這樣我們就可以使用網(wǎng)關(guān)來(lái)記錄日志信息。
-
灰度發(fā)布,藍(lán)綠部署。是指能夠平滑過(guò)渡的一種發(fā)布方式。在其上可以進(jìn)行 A/B testing。
即讓一部分用戶繼續(xù)用產(chǎn)品特性 A,一部分用戶開(kāi)始用產(chǎn)品特性 B,如果用戶對(duì) B 沒(méi)有什么反對(duì)意見(jiàn),那么逐步擴(kuò)大范圍,把所有用戶都遷移到 B 上面來(lái)。
開(kāi)源網(wǎng)關(guān) Zuul 架構(gòu):
配置中心
今天重點(diǎn)說(shuō)說(shuō)現(xiàn)在應(yīng)用質(zhì)量不錯(cuò)的配置中心,攜程開(kāi)源的阿波羅(Apollo):
通訊方式
關(guān)于通訊方式,一般市面也就是兩種遠(yuǎn)程調(diào)用方式,我整理了一個(gè)表格:
監(jiān)控預(yù)警
一般監(jiān)控分為如下層次:
-
日志監(jiān)控
-
Metrics 監(jiān)控
-
健康檢查
-
調(diào)用鏈檢查
-
告警系統(tǒng)
同時(shí)將日志傳入 ELK,將 Metrics 傳入 InfluxDB 時(shí)間序列庫(kù)。而像 Nagios,可以定期向 Agent 發(fā)起信息檢查微服務(wù)。
很多公司都有調(diào)用鏈監(jiān)控,就譬如阿里有鷹眼監(jiān)控,點(diǎn)評(píng)的 Cat,大部分調(diào)用鏈監(jiān)控(沒(méi)錯(cuò),我指的 Zipkin)架構(gòu)是這樣的:
熔斷、隔離、限流、降級(jí)
下面介紹一下 Hystrix 的運(yùn)行流程:
容器與服務(wù)編排引擎
下面是架構(gòu)圖:
資料與文獻(xiàn):
-
馬丁.福勒對(duì)微服務(wù)的描述
-
微服務(wù)架構(gòu)的理論基礎(chǔ) - 康威定律
-
調(diào)用鏈選型之Zipkin,Pinpoint,SkyWalking,CAT
作者: tengshe789,本文版權(quán)歸作者所有
https://juejin.im/post/5c0ba2bef265da614d08fefe
特別推薦一個(gè)分享架構(gòu)+算法的優(yōu)質(zhì)內(nèi)容,還沒(méi)關(guān)注的小伙伴,可以長(zhǎng)按關(guān)注一下:
![]()
![]()
長(zhǎng)按訂閱更多精彩▼
![]()
如有收獲,點(diǎn)個(gè)在看,誠(chéng)摯感謝
免責(zé)聲明:本文內(nèi)容由21ic獲得授權(quán)后發(fā)布,版權(quán)歸原作者所有,本平臺(tái)僅提供信息存儲(chǔ)服務(wù)。文章僅代表作者個(gè)人觀點(diǎn),不代表本平臺(tái)立場(chǎng),如有問(wèn)題,請(qǐng)聯(lián)系我們,謝謝!