1. 程式人生 > >【分散式系統】漫談分散式系統中的技術 —— 從 IPC/RPC,SOA,Web Service/REST 到 micro services(微服務)

【分散式系統】漫談分散式系統中的技術 —— 從 IPC/RPC,SOA,Web Service/REST 到 micro services(微服務)

1. 什麼是分散式系統

A distributed system is a system whose components are located on different networked computers, which then communicate and coordinate their actions by passing messages to one other.

分散式系統是一種由分散在網路中的節點組合而成的大型軟體系統,不同節點之間通過訊息傳遞的形式進行通訊協作以完成特定的功能。

典型的分散式系統,如大型多人線上的遊戲系統,電商系統,通訊網路系統,工業控制系統,NFS,HDFS(Hadoop) 等等。按應用的型別,可簡單的分為:

  • 分散式計算
  • 分散式儲存
  • 分散式控制
  • 分散式服務

分散式系統的難點在於如何讓大量異構節點(單點故障問題)在複雜網路環境(超時、丟包)中協調工作,並實現透明(對使用者不可見)、可擴充套件(節點的動態增刪)、可用可靠一致高效的目標。

相關的技術

  • 負載均衡:

    • Nginx:高效能、高併發的web伺服器;功能包括負載均衡、反向代理、靜態內容快取、訪問控制;工作在應用層
    • LVS: Linux virtual server,基於叢集技術和Linux作業系統實現一個高效能、高可用的伺服器;工作在網路層
  • webserver:

    • Java:Tomcat,Apache,Jboss
    • Python:gunicorn、uwsgi、twisted、webpy、tornado
  • service:

    • SOA、微服務、spring boot,django
  • 容器:

    • docker,kubernetes
  • cache:

    • memcache、redis等
  • 協調中心:

    • zookeeper、etcd等, zookeeper使用了Paxos協議Paxos是強一致性,高可用的去中心化分散式。zookeeper的使用場景非常廣泛,之後細講。
  • rpc框架:

    • grpc、dubbo、brpc
    • dubbo是阿里開源的Java語言開發的高效能RPC框架,在阿里系的諸多架構中,都使用了dubbo + spring boot
  • 訊息佇列:

    • kafka、rabbitMQ、rocketMQ、QSP
    • 訊息佇列的應用場景:非同步處理、應用解耦、流量削鋒和訊息通訊
  • 實時資料平臺:

    • storm、akka
  • 離線資料平臺:

    • hadoop、spark
    • PS: apark、akka、kafka都是scala語言寫的,看到這個語言還是很牛逼的
  • dbproxy:

    • cobar也是阿里開源的,在阿里系中使用也非常廣泛,是關係型資料庫的sharding + replica 代理
  • db:

    • mysql、oracle、MongoDB、HBase
  • 搜尋:

    • elasticsearch、solr
  • 日誌:

    • rsyslog、elk、flume

分散式系統的基本架構有 client-server(centralization), multi-tier(semi-centralization), 和 peer-to-peer(decentralization),更復雜的分散式系統也是由這三類基本架構組合而成。 在這裡插入圖片描述

分散式系統與並行系統的區別

(a), (b): a distributed system. (c): a parallel system.

2. IPC 與 RPC

分散式系統中有大量的節點,各節點結構不同、功能各異,如何相互通訊,並協同作業以完成系統目標,是一個很大的課題,而這個課題的核心就是——IPC !

IPC(Inter-process communication)就是程序間通訊,程序是基本的計算單元,是分散式系統中的基本節點。在開發多程序和分散式系統,需要設計和選擇合理有效的 IPC 方案。

在這裡插入圖片描述

由上圖可知如下關係:

分散式系統通過 IPC 來實現元件或子系統之間的通訊,IPC 分為兩類:面向資料(data-centric) vs 面向訊息(Message passing)。基於 Socket 的訊息傳輸是分散式系統中最主要的通訊方式,分為 RPC 和 Web Services 兩大類。RPC 是面向函式的訊息傳遞方式,Web Services 是面向服務的詳細傳遞方式。

不知大家有沒有想過,現代資訊科技的起點是什麼?—— 是通訊!從電話,電報,無線廣播,到電信系統,蜂窩通訊,3G,4G,5G,網際網路通訊。通訊是資訊科技的骨架,軟體出現的很晚,程控交換機直到上世紀70年代才出現。

人工交換機

步進位制電話交換機:

程控交換機

計算機普出現之後,有了軟體和軟體系統,軟體系統互聯,就是分散式系統!

架構 = 節點 + 關係,在軟體開發中,節點可以是函式,類,也可以是模組,庫,子系統;關係就是函式呼叫和 IPC。函式呼叫和 IPC 本質上是有關資料傳輸/資料共享的問題,傳什麼(資料格式,xml?json?binary?string?),用什麼傳(tcp?http?),傳到哪裡(路由、定址),同步還是非同步?等等。

總而言之,通訊是系統的骨架,所以 IPC 很重要!

做系統/框架開發(c語言)的同學,可能對 IPC 更熟悉一些,比如 UNIX域套接字就常用於在同一臺機器上執行的程序之間的通訊。UNIX域資料報服務是可靠的,既不會丟失訊息也不會傳遞出錯。

在這裡插入圖片描述

RPC(Remote procedure call)是 IPC 的一種,就是以函式呼叫的形式去執行遠端主機上的函式,一般基於TCP協議,具有跨平臺、跨語言(Java-RMI 例外)的特性,對於函式的呼叫方來說,RPC 的底層實現是透明的,由 RPC 框架(比如 Thrifth,gRPC)負責。簡單地說, RPC 就是分散式系統中常見的一種通訊模式。

在這裡插入圖片描述

RPC 的核心問題:

  • 通訊協議:TCP or HTTP,短連線 or 長連線?連線共享?同步與非同步?
  • 服務註冊: 服務註冊(RMI Registry),WSDL
  • 定址:服務地址 = 主機+埠+服務名稱,URI, UDDI
  • 資料序列化(Serialize)或編組(Marshal)
  • 版本控制:服務介面的擴充套件

RPC 的協議有很多,比如最早的 CORBA,Java RMI,Hessian,Thrift,gRPC,SOAP。

RPC 的概念從函式呼叫衍化而來,而函式是一個程式設計概念,是程式設計師所關心的事物,也可以理解為 RPC 是從程式設計師的角度上提出的 IPC 方案,是程式設計師友好的!與之相對的概念就是服務(Service),服務是面向業務的,更上層。由此可見,RPC 是一種技術方案,而 SOA 是一種架構思想;RPC 是面向程式設計的概念,而 SOA 是面向業務和設計的概念。

3. 服務的本質與 SOA

通訊很重要,但是在網際網路發展的早期階段,網路資源稀缺,高延遲,低頻寬,易丟包,不穩定,等等,為了實現高效、可靠的資訊傳輸,IPC/RPC 技術應運而生。然而隨著網際網路技術的發展,Web 技術也日趨成熟,RPC 開始顯得有點過於技術化了,慢慢的人們將關注點從技術轉移到業務——服務。 在這裡插入圖片描述

那麼到底什麼是服務?

先從生活中說起,在日常生活中,“為人民服務”,“服務業”,“售後服務”,“服務質量”,… “服務”的概念無處不在,可是“服務”是什麼呢?怎麼去定義它?它的內涵和外延分別是什麼呢?思考這些問題對深入理解什麼是軟體服務以及服務與資源的關係有很大意義!

經濟活動是一切與商品(goods)和服務(Services)的生產、分發和消費有關的人類活動;商品是生產勞動(productive labour)過程中創造的有形產品,如汽車、衣服,服務是非生產勞動(unproductive labour)過程中創造的無形產品,如教育、心理諮詢、美容美髮。

服務的兩種形式:

  1. 商品相關的服務:如汽車銷售,汽車廠生產汽車這個商品,4S 店提供銷售汽車的服務,這裡的服務就與“汽車”這個商品直接相關;

  2. 商品無關的服務:如心理諮詢,心理醫生只是進行精神疏導,或者傳輸知識,是非生產勞動,這種服務不涉及任何有形商品。

服務具有方向性: 提供者 ==> 消費者

  • 服務是單向的,這一點很重要。多方參與的活動,應該稱之為“協作”。

我始終認為,計算機/軟體/資訊科技中的所有模式都源於社會模式,資訊系統中的節點就是社會中的人,人是如何互動、協作、溝通、工作的,資訊系統中的節點也是如此。人類在進入資訊化之前的幾千年裡,進行了各種各樣的複雜活動,貿易,教育,外交,戰爭,工程建設,資訊系統只不過是在讓一切變得更快、更強!

在這裡插入圖片描述 分散式計算(算盤),非同步,併發,層次化,中繼,快取,索引,編碼等等所有在軟體開發相關的概念,都能在社會中找到方案例項,架構的概念源自建築。

因此,我們可以推斷:

  • 軟體服務具有方向性,client 請求服務,server 提供服務
  • 軟體中的商品是 Resource(資源),但服務可能與 Resouce 有關(REST),也可能與 Resource 無關,比如命令,計算,路由。

SOA(Service-oriented architecture)是一種軟體設計風格,一種架構模式,一種以服務為核心的架構。元件之間通過服務的請求和響應來實現通訊,完成特定的系統功能。

既然有面向服務的架構(SOA),那麼就一定有非面向服務的架構,比如面向元件,或者模組化的架構,各元件/模組之間相互協作(雙向),沒有主從之分。在軟體領域,協作就是模組化,模組與模組之間通過繼承、組合、關聯、聚集等方式建立關係。

在這裡插入圖片描述

SOA 的實現方案:

  • Web services: SOAP/WSDL
  • 訊息佇列:ActiveMQ,JMS,RabbitMQ
  • Restful HTTP
  • Thrift,CORBA

SOA 並不是個新鮮概念,它是軟體技術進化中的一個階段,軟體系統開發從早期的分散式計算,模組化程式設計,進入到 SOA ,目前流行的 Mashups,SaaS(Software as service), PaaS(Platform as a Service),雲端計算(Cloud Computing),都可以視為 SOA 的衍生物。

SOA 並沒有特定的傳輸協議,可以是 TCP,也可以是 HTTP。基於 HTTP 的服務稱之為 Web 服務(Web Service)。

4. Web 與 Web Service

關於 web 開發,需要理解這麼幾個概念,以及它們之間的關係。

Web,HTTP,Web Server,Web client,Web Application Server,Web Service。

Web 就是全球資訊網,不是網際網路(Internet),不能混淆!

網際網路是指所有通過 ip 協議連線起來的網路節點所構成的全域性網路,包括 Web 全球資訊網(HTTP),電子郵件網路(SMTP),檔案共享網路(FTP),IP電話網,等等。電信網,蜂窩網有自己的傳輸協議,不屬於網際網路,但可以通過閘道器(協議轉換器)接入網際網路。

HTTP 就 Web 傳輸協議,更精確的說是一個基於請求-響應模式進行資訊傳輸的無狀態協議!

Web Server 是負責儲存、處理和釋出 web 資源的軟體系統;Web Application 則是提供 Web 服務。在具體應用中,其實並不會那麼清晰,比如 Tomcat,jetty 本身就是 HTTP Server,但又是 Servlet Container,能提供 application service。Nginx 也不單單是 Web Server,還提供各種複雜強大的功能,比如反向代理,快取,負載均衡等等。

Web client 一般指瀏覽器,但廣義上所有能傳送 HTTP 請求的軟體都可以稱為 web client,如 curl, wget。在基於 Web Services 的分散式系統中,請求 Web service 的子系統都可以看做是 Web client。

階段 Web Client Web Server
靜態頁面 瀏覽器,HTML Apache,Nginx
CGI Perl,PHP
Java/.NET Servlet + JSP vs .NET + ASP
Ajax + MVC Ajax + jQuery Struts, Ruby on Rails, SpringMVC
MVVM + REST Angular/vue

Web service 通常泛指所有基於 HTTP 的服務,比如 Ajax,REST,是實現 SOA 的一種實現方案!

A web service is a software system designed to support interoperable machine-to-machine interaction over a network. It has an interface described in a machine-processable format (specifically WSDL). Other systems interact with the web service in a manner prescribed by its description using SOAP-messages, typically conveyed using HTTP with an XML serialization in conjunction with other web-related standards.

Web Service 是 machine-to-machine 的服務,其消費者是軟體,不是面向使用者的。

常見 Web Service 框架: 在這裡插入圖片描述

5. 深入理解 REST

(待續)

6. 微服務

(待續)

7. 總結

(待續)