最近在補一些分散式系列的面試內容,提前做做準備吧,你們懂的,也跟大家分享分享。現在分散式系統基本上都是標配了,如果你現在還在玩兒單機,沒有接觸過這些東西的話,權當是為你開啟一扇新的大門吧。
大的單體專案有多蛋疼
以前我們做單機系統的時候,所有的程式碼都在一個專案裡面,只是不同的模組按照包名來劃分的。我們以前做的一個某省的教育專案,有學生資訊和就業系統、有高校培訓系統、有一個人資系統等一共六個,4個小夥伴都在一個程式碼裡面進行開發,各個系統之間有一定的聯絡,但是大部分是不相關的,但管理頁面在一起。
那時候我們都在一個專案裡面碼程式碼,每次啟動好幾分鐘,還有就是包版本衝突問題,搞得真是蛋疼。大家經歷過大型的單體專案開發,相信你有體會的。
還有各系統的使用量也不一樣,有的比較大。比如學生資訊和就業系統,面向的是所有高校,特別是快畢業那段時間,每個學校會上報就業率等資訊,還有就是列印報到證呀什麼的。有的系統就使用比較少,比如人資、培訓系統 使用的基本上就教育廳的一些員工,和部分老師,流量不大,勉強能扛得住。
模擬業務背景
大點的企業,比如做電商的,使用者幾十萬的,日活幾萬的,背後好幾十人上百人的團隊在支撐開發,單體系統就不太合適了。
比如現在有一個下單買東西的需求,就需要訂單系統、庫存系統、倉庫系統和積分系統 等來進行處理。如下圖:
訂單系統、庫存系統、倉儲和積分系統都是部署到不同的機器上的。
當使用者下單了,那麼訂單服務會發進行扣件庫存、通知倉儲系統要發貨、通知積分系統累加積分的操作。
如果我們此時需要用到 Spring Cloud 來做一個分散式架構的話,那麼我們需要什麼東西呢?每個東西都是幹嘛的呢?
如果使用 Spring Cloud 來實現,需要哪些元件?
Eureka
首先,我們需要一個註冊中心 Eureka ,主要負責每個服務的註冊和發現。
每個微服務中都有一個Euraka client元件,專門負責將這個服務的服務id(serviceId)、ip、埠等資訊註冊到Eureka server中。
Euraka Server是一個註冊中心,該元件內部維護了一個登錄檔,儲存了各個服務所在的機器ip和埠號等資訊。
Feign
其次每個服務還需要一個遠端服務呼叫的元件 Feign ,他主要負責與其他服務建立連線,構造請求,然後發起請求來呼叫其他服務來獲取資料。
Ribbon
然後我們一個服務可能會部署很多臺機器,那麼我們使用Feign 去呼叫這個服務的時候,到底把請求傳送到哪臺機器上去呢?此時我們就需要一個元件來根據一定的策略來選擇一臺機器。不管怎麼選的,總之得選一臺機器給 Feign 去呼叫就好了。
這個元件就是 Ribbon,Ribbon 主要負責就是負載均衡。Ribbon 會定期去從Eureka 註冊中心拉取註冊中心,快取到本地,每次發起遠端呼叫的時候,Ribbon 就會從 Eureka 登錄檔拉去下來的資料中挑選一個機器讓 Feign 來發起遠端呼叫。
Zuul
我們這麼多的微服務,如果一個服務一個IP,使用方都需要進行呼叫的話,是不是得知道每一個服務的IP地址才行呢?那得記住多少才行呀,多不好管理。
如果有一個統一的地址,然後根據不同的請求路徑來跟我進行轉發多少是不,比如 /user/* 是轉發到使用者服務 ,/product/* 是轉向到商品服務等等。我使用的時候,只需要訪問同一個IP ,只是路徑不一樣,就行了。
Spring Cloud 也給我們提供了一個元件,那就是 Zuul ,他是一個閘道器,就是負責網路的路由的。每個請求都經過這個閘道器,我們還可以做統一鑑權等等很多事情。
Hystrix
還有一個東西也得說一下,就是 Hystrix,它是一個隔離、熔斷以及降級的一個框架 。
在微服務的相互呼叫過程中,可能會出現被呼叫服務錯誤或者超時的情況,從而導致整個系統崩潰不可用,也就是我們常說的服務雪崩問題,Hystrix 的存在就是為了結局這種問題的。
整體架構
我們按照以上使用到的這些元件,來往下單這個流程來套一下:
整個呼叫流程:
- 首先每個服務啟動的時候都需要往註冊中心進行註冊。
- 使用者先對閘道器發起下單請求,閘道器收到請求後發現呃,是下單操作,要到訂單系統,然後把請求路由到訂單系統。
- 訂單系統啪啦啪啦一頓操作,然後通過 Feign 去呼叫 庫存系統減庫存,通知倉儲服務發貨,呼叫積分系統加積分。
- 在發起呼叫之前,訂單系統還得通過Ribbon 去註冊中心去拉取各系統的登錄檔資訊,並且挑一臺機器給 Feign 來發起網路呼叫。
最後
OK,以上就是整個Spring Cloud 的核心架構了,面試題額,別錯過了,朋友。這只是給大家一些普及,面試的時候遇到了可以這麼去說的。