架構雜談《九》


架構雜談《九》

微服務與輕量級通信機制

  微服務架構是一種架構模式,它提倡將單一應用程序划分成一組小的服務,服務之間胡亮協調、互相配合,為用戶提供最終價值。在微服務架構中,服務與服務之間通信時,通常是通過輕量級的通信機制,實現彼此間的互通互聯、互相協作。所謂輕量級通信機制,通常是指與語言無關、與平台無關的這類協議。通過輕量級通信機制,使服務與服務之間的協作變得簡單、標准化。

1、同步通信與異步通信

  1.1概述

  微服務架構是一種架構模式,它提倡將單一應用程序划分成一組小的服務。因此,微服務架構本質上分布式系統。

  相比傳統的單機系統,由於服務和數據分布在不同的節點上,每次交互都需要跨節點與運行,這使得網絡成為微服務架構實施考慮的必要因素之一。

  1.2 同步通信與異步通信的選擇

    同步通信是指當客戶端發出請求后,在服務端處理未結束前,客戶端一直處於等待狀態,直到最終獲得服務端的響應。

    異步通信則是指當客戶端發出請求后,服務端或者第三方組件會先接受消息並應答,然后在合適的時間對請求進行處理。在這中間。客戶端不需要一直處於等待狀態。

2、遠程調用RPC

  RPC(Remote Procedure Call)又稱遠程過程調用。是一種典型的分布式節點間同步通信的實現方式。遠程過程調用采用客戶端/服務端的模式,請求的發起者是客戶端,提供響應的是服務器端。

  百度百科

  客戶端通過客戶代理存根(Stub),傳遞函數參數,向服務器端發起函數調用。服務器端通過服務器代理存根(Skeleton),接受到客戶端的請求后,對請求進行處理。並在結束后向客戶端返回響應,從而完成一次通信。

  2.1遠程過程調用的核心

    遠程過程調用采用客戶端/服務器端模式。請求的發起者是客戶端,提供響應的是服務器端。客戶端與服務器端的交互模式圖如下:

     1、首先,客戶端調用本地代理存根,發送請求到服務器端,等待應答信息

     2、在服務器端,服務代理處於睡眠狀態,直到客戶端請求到達並將其喚醒

        3、服務代理獲得請求參數后,交由服務器的服務代碼對其進行處理

     4、應用程序處理結束后,由服務代理向客戶端發送應答,等待下一次請求

     5、客戶端代理存根接收應答信息,交給客戶端的調用代碼進行處理。

  2.2遠程方法調用

    傳統的遠程過程調用框架主要包括 Sun RPC、DCE/RPC,主要基於C語言實現,以函數調用為主。

    隨着面向對象語言的快速發展,序列化/反序列化等特性的誕生。基於不同語言的遠程過程調用框架開始提供對象遠程訪問的功能,如 Thrift、protocol buffers等,同傳統的遠程過程調用框架相比,有一類框架能夠允許客戶端通過面向對象的調用方式,調用遠端的實現。我們稱這類調用為遠程方法調用,換句話說 遠程方法調用是遠程過程調用的一種面向對象的實現。

  2.3 RPC的弊端

      RPC 通過 使用代理存根(Stub/Skeleton)的方式,屏蔽了通信雙發底層的調用細節,讓客戶端不必顯式地區分當前代碼級別的方法調用是本地調用還是遠程調用。因此使分布式節點間的通信變得簡單。但是,雖然RPC 的調用機制屏蔽了調用的細節,簡化了調用流程。但其也存在着弊端。

      1:耦合度高

      2:靈活性差

3、REST

  3.1 REST 概述

    REST(Representation State Transfer)(表述性狀態傳遞)是這幾年使用較廣泛的分布式節點間通信的實現方式,REST 從語義層面將響應結果定義為資源,並使用HTTP的標准動詞映射為對資源的操作,形成了一種以資源為核心、以HTTP為操作方式的,與語言無關、平台無關的服務間通信機制。

    百度百科

  3.2 REST的核心

  

    資源:(Resource)是一種抽象的概念,是指對某類信息實體的抽象。實體是指服務器端需要處理的具體信息,它可以是一段文本、一種圖片也可以是文件系統中的一個文件、數據庫中的一張表等。與面向對象設計中的概念類似,資源通常以名詞為核心來定義,每個資源對應一個特點的URI作為標識。

    表述:(Representation)資源的表述是對資源在某個特定時刻的狀態的描述。資源是一種信息實體,實體在客戶端與服務器端進行信息交換時,可以有多種表現形式,如:文本可以用TXT格式表現,也可以用HTML格式、XML格式、JSON格式表現,甚至可以采用二進制格式;圖片可以用JPG格式標識也可以用PNG格式表現。這種資源的表述格式在客戶端與服務器端通過請求-響應的協商機制來確定。實際上,URI 僅代表資源的實體,並不代表它的表述。如:有些URL最后的.html 后綴名並屬於表述范疇,表述應該在HTTP請求的頭信息中用 Accept和Content-Type 字段來指定。這兩個字段才是對“表述”的描述。

    狀態轉移:(State Transfer)是指在客戶端同服務端交互的過程中。客戶端能夠通過資源的表述,實現操作資源的目的。當我們使用瀏覽器訪問一個網站時,就代表了客戶端和服務器端的一個交互過程。在這個過程中,必然會涉及數據或者狀態的變化。但是我們知道HTTP是一個無狀態的協議。這意味着,所有的狀態都保存在服務器端。因此,如果客戶端想要操作資源,必須通過某種手段,讓服務器端發生狀態的轉移。而這種轉移是建立在資源的表述上的。所以通常將其稱為表述層狀態轉移。

    統一接口:(Uniform Interface)客戶端操作資源的方式,通常是基於HTTP的4個動詞(Verb):GET、POST、PUT、DELETE。它們分別對應4種資源的操作方式。

      GET:用來獲取資源

      POST:用來新建資源

      PUT:用來更新資源

      DELETE:用來銷毀資源

    因為客戶端是通過HTTP的這4個動詞操作資源的。也就意味着不管請求的URI是什么,請求的資源有什么不同,但操作資源的接口都是統一的。

  3.3 REST的優勢

    通過資源表述、狀態轉移以及統一接口,REST 將客戶端的請求、服務器端的響應基於資源聯系起來,逐漸形成了一種以資源為核心、以HTTP為操作方式的、與語言無關、平台無關的通信機制。同時,由於HTTP本身的無狀態性,使用REST,能夠有效保持服務/應用的無狀態性,利於將來的水平伸縮。

  3.4 REST的不足

    隨着團隊或者組織業務的不斷增長,服務器端響應內容復雜度的增加,REST的使用面臨如下的挑戰:

      1:如何標准化資源結構

      2:如何處理資源的相關鏈接

    3.4.1 如何標准化資源結構

      使用REST可以將業務場景的具體信息定義為資源。並基於JSON或者XML返回給客戶端,隨着業務的不斷增長,邏輯的增加,服務器端對內容的響應結構會變得越來越復雜(所謂響應結構,是指服務器端的響應內容結構,既資源的結構)

      REST作為指導性的原則,並沒有定義服務器端響應結構應該遵循什么標准。這也就意味着在企業內部、不同的部門、不同的開發小組,對同一類資源所定義的結構可能不同,因此如何定義一套標准的資源響應結構,成為服務數量增多后使用的REST面臨的一個挑戰。

    3.4.2 如何有效處理相關資源的鏈接

      大部分REST的實現,都是基於 JSON 作為傳輸格式,但 JSON最大的遺憾在於沒有對超鏈接處理做內置的支持,而這部分卻恰恰是 Web 的基石,這帶來的潛在問題是,對於調用接口的客戶端而言,每次需要查看相關的接口文檔,才能了解如何修改資源的狀態,或者獲取相關聯資源的信息。因此,如何用有效的方式管理REST中相關資源的依賴以及鏈接,是否能夠將這種方式標准化,成為服務數量增多后使用REST面臨的另一個挑戰。

    3.4.3 其他需要考慮的因素

      性能:

        由於REST 是基於 HTTP 之上的協議,而HTTP本身是一個使用廣泛的、基於TCP/IP的應用層協議,因此 REST 並不是低延時通信的最好選擇。對於服務之間對低延時要求的場景,可能需要選擇不同的底層協議,如UDP 來達到希望的性能,或者其他RPC框架

      開發成本:

        使用REST,其傳輸格式是XML或者JSON的文本格式,在享受平台無關、語言無關優勢的同時,團隊需要編寫更多的代碼來解析文本格式的協議,不過目前已經有很多成熟的庫幫助我們來做類似的事情,如 Java下解決 JSON的 JSON-lib、org.json 以及 C# 下的 Newtonsoft.Json

說明:

  1、參考書籍:《分布式服務架構:原理、設計與實戰》《微服務架構與實踐》

  2、如有不合適的地方請反饋。綜合后更改。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM