SOA(面向服務的軟件架構、Service Oriented Architecture),是一種軟件設計模式,主要應用於不一樣應用組件之間經過某種協議來互操做。例如典型的 通訊網絡協議。所以SOA是獨立於任何廠商、產品、技術的。編程
SOA有兩個層面的定義:設計模式
簡單對象訪問協議是交換數據的一種協議規範,是一種輕量的、簡單的、基於XML(標準通用標記語言下的一個子集)的協議,它被設計成在WEB上交換結構化的和固化的信息,技術應用在WebService上。服務器
表徵狀態轉移(Representional State Transfer)。其宗旨是從資源的角度來觀察整個網絡,分佈在各處的資源由URI肯定,而客戶端的應用經過URI來獲取資源的表徵。得到這些表徵導致這些應用程序轉變了其狀態。隨着不斷獲取資源的表徵,客戶端應用不斷地在轉變着其狀態。網絡
舉個栗子:架構
Marcus是一個農民,他有4頭牛,12只雞和3頭奶牛。他如今模擬一個REST API,而我是客戶端。若是我想用REST來請求當前的農場狀態,我僅會問:「State?」Marcus會回答:「4頭豬、12只雞、3頭奶牛」。框架
這是REST最簡單的一個例子。Marcus使用表徵來傳輸農場狀態。表徵的句子很簡單:「4頭豬、12只雞、3頭奶牛」。
再往下看,看我如何讓Marcus用REST方式添加2頭奶牛?
按照常理,能夠會這樣說:Marcus,請在農場你再添加2頭奶牛。難道這就是REST方式嗎?難道就是經過這樣的表徵來傳輸狀態的嗎?不是的!這是一個遠程過程調用,過程是給農場添加2頭奶牛。
Marcus很憤怒地響應到:「400,Bad Request」,你究竟是什麼意思?
因此,讓咱們從新來一次。咱們怎樣作到REST方式呢?該怎樣從新表徵呢?它應該是4頭豬、12只雞、3頭奶牛。好,讓咱們再次從新表徵……
我:「Marcus,……4頭豬、12只雞、5頭奶牛!」
Marcus:「好的」。
我:「Marcus,如今是什麼狀態?」
Marcus:「4頭豬、12只雞、5頭奶牛」。
我:「好!」
看到了嗎?就這樣簡單。分佈式
爲何RPC也不夠好?
從邏輯角度來看,爲何會更加青睞REST而不是RPC(Remote Procedure Call,遠程過程調用 ),由於它極大的下降了咱們溝通的複雜度,經過把表徵做爲惟一的溝通的方式。無需去討論過程(添加一頭牛?增長一種動物類型?給雞的數量翻倍仍是賣掉全部豬?)咱們只需討論表徵,而且使用這個表徵來達到咱們想要的目標,很簡單,不是嗎?我不但願和Marcus的溝通失敗,由於咱們彼此的理解過程會不同,因此只須要知道最後的狀態就行。但這僅僅是建立RPC會產生許多問題之一。若是你使用RPC,你須要設計一些程序嵌入到某種結構中。這種結構須要存儲參數、錯誤的代碼、返回值等。經過URL取代了傳遞大量參數。spa
RPC(Remote Procedure Call Protocol)——遠程過程調用協議,它是一種經過網絡從遠程計算機程序上請求服務,而不須要了解底層網絡技術的協議。RPC協議假定某些傳輸協議的存在,如TCP或UDP,爲通訊程序之間攜帶信息數據。在OSI網絡通訊模型中,RPC跨越了傳輸層和應用層。RPC使得開發包括網絡分佈式多程序在內的應用程序更加容易。如阿里Dubbo框架。
RPC採用客戶機/服務器模式。請求程序就是一個客戶機,而服務提供程序就是一個服務器。首先,客戶機調用進程發送一個有進程參數的調用信息到服務進程,而後等待應答信息。在服務器端,進程保持睡眠狀態直到調用信息到達爲止。當一個調用信息到達,服務器得到進程參數,計算結果,發送答覆信息,而後等待下一個調用信息,最後,客戶端調用進程接收答覆信息,得到進程結果,而後調用執行繼續進行。操作系統