1. 程式人生 > 其它 >RPC、HTTP、DSF、Dubbo,每個都眼熟,就是不知道有什麼聯絡?

RPC、HTTP、DSF、Dubbo,每個都眼熟,就是不知道有什麼聯絡?

之前的面試經歷中,除了經常被問到 HTTP 相關的知識外,還有被問過 http 與 rpc 的區別的。再加上工作中經常與公司的一些DSF應用打交道,於是我又會聯想到 dubbo,那麼今天要梳理的內容關鍵詞就有了這些: http、rpc、dsf、dubbo 。

一、HTTP 和 RPC

首先,http 與 rpc 有什麼區別這個問題不太嚴謹,因為這倆就不是一個層級的東西。

HTTP

這個大家太熟悉了吧?日常接觸最多的恐怕就是各種http協議的介面了。

沒錯,http它是一個協議。

其他在這裡就不打算鋪開了,以前整理過一些內容,有需要的可以跳轉翻翻看:

RPC

RPC 是一種技術的代名詞,全稱是遠端過程呼叫

遠端?那是不是也有本地過程呼叫

沒錯,舉個例子說明一下:

  • 本地過程呼叫:你的電腦上啟動了一個服務A,執行程式的時候服務A裡的各種方法的互相呼叫,就是本地了。
  • 遠端過程呼叫:而隔壁小王也啟動了一個服務B,他還說他裡面提供了一個功能非常勁爆的方法,你也想去呼叫,這就是遠端了。

而至於你怎麼呼叫到小王伺服器裡的方法,那就是個實現方式的問題了。你為了簡單,直接走http協議也行。如果覺得http滿足不了需求,那麼也可以基於tcp自定義一個協議。

遠端呼叫過程

遠端呼叫過程大概就是下圖所示:

二、DSF

在工作中我發現公司有不少應用的名字是 DSF 打頭的,DSF(Distributed Service Framework)其實就是指分散式服務框架

簡單介紹 2 個點:為什麼要用到分散式、這套DSF的包含的內容。

為什麼要用到分散式

為什麼要用到分散式服務?換個方式問那就是:分散式解決了什麼問題。

首先,分散式架構是由單體架構演進而來,我司的業務系統也不例外。業務早期為了降低開發成本,實現快速上線,通常使用單體架構,所有的業務模組都在同一個應用裡。

隨著業務規模的擴張,單體應用的缺點就暴露出來,比如:

  • 系統耦合性高,當後面增加的功能越來越多,程式碼量巨增的時候,之前某個主程腦海中劃分好的模組邊界可能越來越模糊,導致呼叫關係混亂。
  • 改一贈二出現越來越多,經常存在開發修改了某個功能,而導致其他的功能有問題。
  • 某個功能有問題,整個一起回滾。
  • 語言單一,不能根據場景選擇更合適的語言。比如其中有個模組系統主要是大資料分析,用 python 自然更加合適,因為它有豐富的類庫。
  • 系統不易於拓展部署,比如系統中有一個功能流量很大,頂不住了就要加機器,那麼在新機器上還是部署整個應用,不能單獨的部署這個大流量的服務,會造成一定的資源浪費。
    。。。

為了解決這些問題,於是把之前的業務進行垂直拆分成多個系統。系統與系統之間通過網路互動來完成各項業務處理,每個系統互相獨立,可以單獨部署。這種多個元件合作對外提供服務的形式,就是分散式了。

但是分散式同樣也有它的缺點

  • 從之前的單應用呼叫,現在變成了多個應用直接的互動,呼叫鏈路變長,帶來了網路開銷,同時也給定位問題增加了難度。
  • 為了讓你的應用更可靠,還有考慮其他的異常情況,比如呼叫失敗、因某些問題導致的高頻呼叫,對此還得做些 限流、熔斷之類的措施。
  • 出現問題,可能會涉及多個服務的回滾,互相之間會有影響。
  • 環境變複雜了,增加了測試的複雜度。
    。。。

簡單來說,分散式幫我們克服了單體帶來的瓶頸,但是為了分散式服務的穩定性,我們需要考慮更多的東西。

DSF包含的內容

那麼一套分散式服務平臺都有哪些內容,這裡簡單列舉一下(以我司自研為例):

  • 服務註冊:服務提供方上傳契約資訊,契約中包含服務組資訊、服務資訊、API資訊等。
  • 服務發現:服務消費方定址,基於某種粒度可以找到需要。
  • 服務呼叫:自定義超時時間、失敗重試次數等,支援同步、非同步呼叫等。
  • 負載均衡:比如支援輪詢策略。
  • 閘道器:還可以通過閘道器對外提供一些rest api呼叫。
  • 健康檢查:對服務提供方例項進行健康檢查。
  • 服務拓撲:應用呼叫的上下游鏈路拓撲圖。
  • 服務監控:展示服務執行狀態、呼叫指標等。
  • 報警:當某個服務的例項異常數超過閾值,觸發報警。
  • 限流:用於保護系統。
  • web前臺:方便檢視各種資訊,各種常用功能的入口。
    ...

三、Dubbo

對於分散式服務框架,如果有自研能力的話,可以結合公司業務實際情況進行高度定製化。如果初期不具備這樣的條件,很多公司會選擇成熟的開源框架直接使用,dubbo 就是這樣的框架。

Dubbo 是阿里巴巴 2011年開源的一個基於 Java 的 RPC 框架,它實現了面向介面的代理 RPC 呼叫,並且可以配合 ZooKeeper 等元件實現服務註冊和發現功能,並且擁有負載均衡、容錯機制等。

dubbo 架構

這是官方文件的架構圖,描述了 Dubbo 微服務元件與各個中心的互動過程。

  • Registry 註冊中心:協調 Consumer 與 Provider 之間的地址註冊與發現。
  • ConfigCenter 配置中心:儲存 Dubbo 啟動階段的全域性配置,保證配置的跨環境共享與全域性一致性;負責服務治理規則(路由規則、動態配置等)的儲存與推送。
  • Metadata 元資料中心:接收 Provider 上報的服務介面元資料,為 Admin 等控制檯提供運維能力(如服務測試、介面文件等);作為服務發現機制的補充,提供額外的介面/方法級別配置資訊的同步能力,相當於註冊中心的額外擴充套件。

以上三個中心並不是執行 Dubbo 的必要條件,使用者完全可以根據自身業務情況決定只啟用其中一個或多個,以達到簡化部署的目的。通常情況下,所有使用者都會以獨立的註冊中心 開始 Dubbo 服務開發,而配置中心、元資料中心則會在微服務演進的過程中逐步的按需被引入進來。

所以,如果想快速實現一個分散式服務框架,就可以基於dubbo的方案來進行開發,既可以拿來就用,後續也可以進行二次開發。

--不要用肉體的勤奮,去掩蓋思考的懶惰--