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的方案來進行開發,既可以拿來就用,後續也可以進行二次開發。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章