1. 程式人生 > 其它 >golang channel+goroutine面試題

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配置檔案中可以通過制定版本實現連線制定提供者,也就是通過服務版本可以控制服務的不相容升級;當同一個服務有多種實現時,可以使用服務分組進行區分。