您好,登錄后才能下訂單哦!
前言
現(xiàn)在分布式系統(tǒng)基本上都是標(biāo)配了,如果你現(xiàn)在還在玩兒單機(jī),沒有接觸過這些東西的話,權(quán)當(dāng)是為你打開一扇新的大門吧。
大的單體項(xiàng)目
以前我們做單機(jī)系統(tǒng)的時候,所有的代碼都在一個項(xiàng)目里面,只是不同的模塊按照包名來劃分的。我們以前做的一個某省的教育項(xiàng)目,有學(xué)生信息和就業(yè)系統(tǒng)、有高校培訓(xùn)系統(tǒng)、有一個人資系統(tǒng)等一共六個,4個小伙伴都在一個代碼里面進(jìn)行開發(fā),各個系統(tǒng)之間有一定的聯(lián)系,但是大部分是不相關(guān)的,但管理頁面在一起。
那時候我們都在一個項(xiàng)目里面碼代碼,每次啟動好幾分鐘,還有就是包版本沖突問題,搞得真是頭疼。大家經(jīng)歷過大型的單體項(xiàng)目開發(fā),相信你有體會的。
還有各系統(tǒng)的使用量也不一樣,有的比較大。比如學(xué)生信息和就業(yè)系統(tǒng),面向的是所有高校,特別是快畢業(yè)那段時間,每個學(xué)校會上報(bào)就業(yè)率等信息,還有就是打印報(bào)到證呀什么的。有的系統(tǒng)就使用比較少,比如人資、培訓(xùn)系統(tǒng) 使用的基本上就教育廳的一些員工,和部分老師,流量不大,勉強(qiáng)能扛得住。
模擬業(yè)務(wù)背景
大點(diǎn)的企業(yè),比如做電商的,用戶幾十萬的,日活幾萬的,背后好幾十人上百人的團(tuán)隊(duì)在支撐開發(fā),單體系統(tǒng)就不太合適了。
比如現(xiàn)在有一個下單買東西的需求,就需要訂單系統(tǒng)、庫存系統(tǒng)、倉庫系統(tǒng)和積分系統(tǒng) 等來進(jìn)行處理。如下圖:
訂單系統(tǒng)、庫存系統(tǒng)、倉儲和積分系統(tǒng)都是部署到不同的機(jī)器上的。
當(dāng)用戶下單了,那么訂單服務(wù)會發(fā)進(jìn)行扣件庫存、通知倉儲系統(tǒng)要發(fā)貨、通知積分系統(tǒng)累加積分的操作。
如果我們此時需要用到 Spring Cloud 來做一個分布式架構(gòu)的話,那么我們需要什么東西呢?每個東西都是干嘛的呢?
如果使用 Spring Cloud 來實(shí)現(xiàn),需要哪些組件?
Eureka
首先,我們需要一個注冊中心 Eureka ,主要負(fù)責(zé)每個服務(wù)的注冊和發(fā)現(xiàn)。
每個微服務(wù)中都有一個Euraka client組件,專門負(fù)責(zé)將這個服務(wù)的服務(wù)id(serviceId)、ip、端口等信息注冊到Eureka server中。
Euraka Server是一個注冊中心,該組件內(nèi)部維護(hù)了一個注冊表,保存了各個服務(wù)所在的機(jī)器ip和端口號等信息。
Feign
其次每個服務(wù)還需要一個遠(yuǎn)程服務(wù)調(diào)用的組件 Feign ,他主要負(fù)責(zé)與其他服務(wù)建立連接,構(gòu)造請求,然后發(fā)起請求來調(diào)用其他服務(wù)來獲取數(shù)據(jù)。
Ribbon
然后我們一個服務(wù)可能會部署很多臺機(jī)器,那么我們使用Feign 去調(diào)用這個服務(wù)的時候,到底把請求發(fā)送到哪臺機(jī)器上去呢?此時我們就需要一個組件來根據(jù)一定的策略來選擇一臺機(jī)器。不管怎么選的,總之得選一臺機(jī)器給 Feign 去調(diào)用就好了。
這個組件就是 Ribbon,Ribbon 主要負(fù)責(zé)就是負(fù)載均衡。Ribbon 會定期去從Eureka 注冊中心拉取注冊中心,緩存到本地,每次發(fā)起遠(yuǎn)程調(diào)用的時候,Ribbon 就會從 Eureka 注冊表拉取下來的數(shù)據(jù)中挑選一個機(jī)器讓 Feign 來發(fā)起遠(yuǎn)程調(diào)用。
Zuul
我們這么多的微服務(wù),如果一個服務(wù)一個IP,使用方都需要進(jìn)行調(diào)用的話,是不是得知道每一個服務(wù)的IP地址才行呢?那得記住多少才行呀,多不好管理。
如果有一個統(tǒng)一的地址,然后根據(jù)不同的請求路徑來跟我進(jìn)行轉(zhuǎn)發(fā)多少是不,比如 /user/* 是轉(zhuǎn)發(fā)到用戶服務(wù) ,/product/* 是轉(zhuǎn)向到商品服務(wù)等等。我使用的時候,只需要訪問同一個IP ,只是路徑不一樣,就行了。
Spring Cloud 也給我們提供了一個組件,那就是 Zuul ,他是一個網(wǎng)關(guān),就是負(fù)責(zé)網(wǎng)絡(luò)的路由的。每個請求都經(jīng)過這個網(wǎng)關(guān),我們還可以做統(tǒng)一鑒權(quán)等等很多事情。
Hystrix
還有一個東西也得說一下,就是 Hystrix,它是一個隔離、熔斷以及降級的一個框架 。
在微服務(wù)的相互調(diào)用過程中,可能會出現(xiàn)被調(diào)用服務(wù)錯誤或者超時的情況,從而導(dǎo)致整個系統(tǒng)崩潰不可用,也就是我們常說的服務(wù)雪崩問題,Hystrix 的存在就是為了解決這種問題的。
整體架構(gòu)
我們按照以上使用到的這些組件,來往下單這個流程來套一下:
整個調(diào)用流程:
首先每個服務(wù)啟動的時候都需要往注冊中心進(jìn)行注冊。
用戶先對網(wǎng)關(guān)發(fā)起下單請求,網(wǎng)關(guān)收到請求后發(fā)現(xiàn)呃,是下單操作,要到訂單系統(tǒng),然后把請求路由到訂單系統(tǒng)。
訂單系統(tǒng)啪啦啪啦一頓操作,然后通過 Feign 去調(diào)用 庫存系統(tǒng)減庫存,通知倉儲服務(wù)發(fā)貨,調(diào)用積分系統(tǒng)加積分。
在發(fā)起調(diào)用之前,訂單系統(tǒng)還得通過Ribbon 去注冊中心去拉取各系統(tǒng)的注冊表信息,并且挑一臺機(jī)器給 Feign 來發(fā)起網(wǎng)絡(luò)調(diào)用。
總結(jié)
OK,以上就是整個Spring Cloud 的核心架構(gòu)了,面試題額,別錯過了,朋友。這只是給大家一些普及,面試的時候遇到了可以這么去說的。
回過頭來再看看這8道Spring Cloud微服務(wù)面試題你能回答對幾道?
1.什么是 Spring Cloud?
2.使用 Spring Cloud 有什么優(yōu)勢?
3.服務(wù)注冊和發(fā)現(xiàn)是什么意思?Spring Cloud 如何實(shí)現(xiàn)?
4.負(fù)載平衡的意義什么?
5.什么是 Hystrix?它如何實(shí)現(xiàn)容錯?
6.什么是 Hystrix 斷路器?我們需要它嗎?
7.什么是 Netflix Feign?它的優(yōu)點(diǎn)是什么?
8.什么是 Spring Cloud Bus?我們需要它嗎?
最后
歡迎大家一起交流,喜歡文章記得點(diǎn)個贊喲,感謝支持!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。