架構雜談《九》

来源:https://www.cnblogs.com/haoxiaozhang/archive/2019/08/05/11304021.html
-Advertisement-
Play Games

架構雜談《九》 微服務與輕量級通信機制 微服務架構是一種架構模式,它提倡將單一應用程式劃分成一組小的服務,服務之間胡亮協調、互相配合,為用戶提供最終價值。在微服務架構中,服務與服務之間通信時,通常是通過輕量級的通信機制,實現彼此間的互通互聯、互相協作。所謂輕量級通信機制,通常是指與語言無關、與平臺無 ...


架構雜談《九》

微服務與輕量級通信機制

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

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、如有不合適的地方請反饋。綜合後更改。

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 第一章 JavaScript基礎 --1、JavaScript是一種基於對象和事件驅動的,並具有安全性能的腳本語言。--2、JavaScript的特點: -1、JavaScript主要用來在HTML頁面中添加交互行為 -2、JavaScript是一種腳本語言,語法和Java類似 -3、JavaScr ...
  • 08.05自我總結 一.顯示方式 1.display 常用的三種方式 2.vertical align 文本垂直對齊方式: |` top bottom` ...
  • 想瞭解原型和原型鏈,我覺得首先我們得知道javascript里有一個Object 與 Function,它倆都是構造函數,當然函數也是一個對象。我們列印Object 與 Function看一下, 那麼這個Object 與 Function 之間有何關係與區別呢?首先您只需要記住: 1. 所有普通對象 ...
  • 在使用ajax發送非同步請求時,遇到一個問題,就是在回調函數中接受到了非同步響應的數據,但是在前端頁面中的表單中卻不回顯該數據。 前端頁面在 第一次載入數據的同時 發送非同步請求,但是 這個 非同步響應 是在 頁面載入完數據之後 到達的,因此在 非同步響應 到達之後(這時表單數據已載入完畢) 需要第二次將數... ...
  • 大家好,我是一葉,經過一段時間對vue的學習,我打算把vue做一個系列,把踩過的坑和大家分享一下。 現在開始第一章:vue引用並封裝echarts 在文章開始前,我先舔波echarts(真香)。阿裡的G2和百度的echarts都是很不錯的,echarts上手難度小,並且用戶多,文檔多,生態環境較好, ...
  • 這個系列博客專註電腦各種理論知識 如果專註於代碼的優美、或者專註於業務,或許這些知識並不是很重要 如果剛剛編程入門,或許這些知識不太能看懂 但是專註於技術且工作一定時間的話,這些可能還是很有用的 很多都是大學的電腦專業知識,以及軟考高級職稱架構師、分析師中的知識點。 我儘量將知識點與應用實踐向結 ...
  • 阻塞與非阻塞 阻塞:A程式調用B程式,A等待返回結果,等待中A程式線程被占用,不進行其它操作。 非阻塞:A程式調用B程式,A程式線程不被占用。 阻塞--》非阻塞 的最常用解決方案:緩存,A將請求依次裝入緩存中,A不管與B是否執行完成,由B隨後依次處理,返回給A。 同步與非同步 同步:一個線程依次執行所 ...
  • 一、小案例分析 1、功能需求: 實現一個發送信息的功能,要便於擴展與維護。(1)發送信息的工具有很多,比如簡訊、微信、郵件、QQ等。(2)選擇某個工具進行信息發送。 2、小菜雞去實現: (1)定義一個發送工具的父類(介面),並將各種發送工具作為子類(實現類)。(2)定義一個選擇發送工具的類,用於調用 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...