golang channel+goroutine面試題
一、分散式簡要說明
Dubbo是用於分散式系統的框架所以我們要先了解什麼是分散式
分散式系統是若干獨立 計算機的集合,這些計算機對於使用者來說就像單個相關係統。
老式系統(單一應用架構)就是把一個系統,統一放到一個伺服器當中然後每一個伺服器上放一個系統,如果說要更新程式碼的話,每一個伺服器上的系統都要重新去部署十分的麻煩。
而分散式系統就是將一個完整的系統拆分成多個不同的服務,然後在將每一個服務單獨的放到一個伺服器當中。(三個臭皮匠賽過諸葛亮)
二、應用架構及發展演變
三、Dubbo和SpringCloud對比
四、發展演變
ORM
單一應用架構:一個專案裝到一個伺服器當中,也可以執行多個伺服器每一個伺服器當中都裝一個專案。
缺點:1.如果要新增某一個功能的話就要把一個專案重新打包,在分別部署到每一個伺服器當中去。2.如果後期專案越來越大的話單臺伺服器跑一個專案壓力會很大的。會不利於維護,開發和程式的效能。
MVC
垂直應用架構:將應用切割成幾個互不相干的小應用,在將每個小應用獨立放到一個伺服器上,如果哪一個應用的訪問數量多就多加幾臺伺服器。
分散式服務架構
RPC簡介
分散式應用架構(遠端過程呼叫):當垂直應用越來越多,應用之間互動不可避免,將核心業務抽取出來,作為獨立的服務,逐漸形成穩定的服務中心,使前端應用能更快速的響應多變的市場需求。
什麼叫RPC
RPC [ Remote Procedure Call]是指遠端過程呼叫,是一種程序問通訊方式,他是一種技術的思想,而不是規範。它允許程式呼叫另一個地址空間(通常是共享網路的另一臺機器上)的過程或函式,而不用程式設計師顯式編碼這個遠端呼叫的細節。即程式設計師無論是呼叫本地的還是遠端的函式,本質上編寫的呼叫程式碼基本相同。
RPC(Remote Procedure Call)—遠端過程呼叫,它是一種通過網路從遠端計算機程式上請求服務,而不需要了解底層網路技術的協議。也就是說兩臺伺服器A,B,一個應用部署在A伺服器上,想要呼叫B伺服器上應用提供的方法,由於不在一個記憶體空間,不能直接呼叫,需要通過網路來表達呼叫的語義和傳達呼叫的資料。
RPC工作原理
Client像呼叫本地服務似的呼叫遠端服務;
Client stub接收到呼叫後,將方法、引數序列化
客戶端通過sockets將訊息傳送到服務端
Server stub 收到訊息後進行解碼(將訊息物件反序列化)
Server stub 根據解碼結果呼叫本地的服務
本地服務執行(對於服務端來說是本地執行)並將結果返回給Server stub
Server stub將返回結果打包成訊息(將結果訊息物件序列化)
服務端通過sockets將訊息傳送到客戶端
Client stub接收到結果訊息,並進行解碼(將結果訊息發序列化)
客戶端得到最終結果。
RPC 呼叫分以下兩種:
同步呼叫:客戶方等待呼叫執行完成並返回結果。
非同步呼叫:客戶方呼叫後不用等待執行結果返回,但依然可以通過回撥通知等方式獲取返回結果。若客戶方不關心呼叫返回結果,則變成單向非同步呼叫,單向呼叫不用返回結果。
RPC步驟解析
SOA
流動計算架構:在分散式應用架構的基礎上增加了一個排程、治理中心基於訪問壓力實時管理叢集容量、提高叢集的利用率,用於提高機器利用率的 資源排程和治理中心(SOA) 是關鍵 (不浪費計算機資源)
五、Dubbo核心概念
Dubbo官網: http://dubbo.apache.org/en-us/index.html
Dubbo 是一款高效能、輕量級的開源Java RPC框架,它提供了三大核心能力:面向介面的遠端方法呼叫,智慧容錯和負載均衡,服務自動註冊和發現。分散式系統是將一個系統拆分為多個不同的服務
六、Dubbo特性一覽
dubbo設計架構
該圖來自Dubbo官網,描述了服務註冊中心、服務提供方、服務消費方、服務監控中心之間的呼叫關係。
服務提供者(Provider):暴露服務的服務提供方,服務提供者在啟動時,向註冊中心註冊自己提供的服務。
服務消費者(Consumer): 呼叫遠端服務的服務消費方,服務消費者在啟動時,向註冊中心訂閱自己所需的服務,服務消費者,從提供者地址列表中,基於軟負載均衡演算法,選一臺提供者進行呼叫,如果呼叫失敗,再選另一臺呼叫。
註冊中心(Registry):註冊中心返回服務提供者地址列表給消費者,如果有變更,註冊中心將基於長連線推送變更資料給消費者。
監控中心(Monitor):服務消費者和提供者,在記憶體中累計呼叫次數和呼叫時間,定時每分鐘傳送一次統計資料到監控中心。
七、Dubbo的特性
(1)服務註冊中心
相比Hessian類RPC框架,Dubbo有自己的服務中心, 寫好的服務可以註冊到服務中心, 客戶端從服務中心尋找服務,然後再到相應的服務提供者機器獲取服務。通過服務中心可以實現叢集、負載均衡、高可用(容錯) 等重要功能。
服務中心一般使用zookeeper實現,也有redis和其他一些方式。以使用zookeeper作為服務中心為例,服務提供者啟動後會在zookeeper的/dubbo節點下建立提供的服務節點,包含服務提供者ip、port等資訊。服務提供者關閉時會從zookeeper中移除對應的服務。
服務使用者會從註冊中心zookeeper中尋找服務,同一個服務可能會有多個提供者,Dubbo會幫我們找到合適的服務提供者,也就是針對服務提供者的負載均衡。
(2)負載均衡
當同一個服務有多個提供者在提供服務時,客戶端如何正確的選擇提供者實 現負載均衡呢?dubbo也給我們提供了幾種方案:
random 隨機選提供者,並可以給提供者設定權重
roundrobin 輪詢選擇提供者
leastactive 最少活躍呼叫數,相同活躍數的隨機,活躍數:指呼叫前後計數差。使慢的提供者收到更少請求,因為越慢的提供者的呼叫前後計數差會越大。
consistenthash 一致性hash,相同引數的請求發到同一臺機器上。
(3)簡化測試,允許直連提供者
在開發階段為了方便測試,通常系統客戶端能指定呼叫某個服務提供者,那麼可以在引用服務時加一個url引數去指定服務提供者。 配置如下:
<dubbo:reference id="xxxService"interface="com.alibaba.xxx.XxxService"url="dubbo://localhost:20890"/>
(4)服務版本,服務分組
在Dubbo配置檔案中可以通過制定版本實現連線制定提供者,也就是通過服務版本可以控制服務的不相容升級;當同一個服務有多種實現時,可以使用服務分組進行區分。