RPC和WebService、WebSocket簡單介紹

關於架構方面有很多名詞,有點暈頭轉向,今天就針對相關技術RPC/Web Service/REST/SOA/SOAP理解做下記錄。

一、簡介

先對上面的名詞做一個概要介紹:

  1. RPC ,遠程過程調用 (面向方法),你可以這麼理解,就是在另外一臺服務器上有一段代碼(函數),你可以通過網絡遠程調用它。用什麼協議(http,tcp,udp…),傳輸什麼數據格式(json,xml,二進制…)你都可以自己定義。很簡單的概念, 像調用本地服務(方法)一樣調用服務器的服務(方法)。
  2. SOA ,面向服務的架構(面向消息),SOA是一種架構方法(SOA不是Web Service,Web Service是目前最適合實現SOA的技術。)
  3. REST , Representational state transfer遠程過程調用 (面向資源)
  4. web service顧名思義這是一種提供service的形式,而且只能通過http協議(web)來提供service(web service三要素:SOAP、WSDL(WebServicesDescriptionLanguage)、UDDI(UniversalDescriptionDiscovery andIntegration))
  5. SOAP,簡單對象訪問協議,是一種輕量的、簡單的、基於XML(標準通用標記語言下的一個子集)的協議,它被設計成在WEB上交換結構化的和固化的信息。
  6. SOAP和RPC都是web service的實現方式

二、詳解

1.SOA面向服務的軟件架構(Service Oriented Architecture)

是一種計算機軟件的設計模式,主要應用於不通應用組件中通過某種協議來互操作

它的基本設計原理是:服務提供了一個簡單的接口,抽象了底層的複雜性,然後用戶可以訪問獨立的服務,而不需要去了解服務底層平臺實現。

正因爲SOA架構實現不依賴於技術,因此能夠被各種不同的技術實現。

例如:

SOAP, RPC

REST

DCOM

CORBA

OPC-UA

Web services

DDS

Java RMI

WCF (Microsoft's implementation of web services now forms a part of WCF)

Apache Thrift

SORCER

因此REST、SOAP、RPC、RMI、DCOM等都是SOA的一種實現而已。

2.Java RMI

SOA思想提出以後,就有很多基於在這個模型上的產物,很多適用於分佈式的產物,同事也是越來越龐大系統的產物。Java RMI (Remote Method Invocation 遠程方法調用)是用Java在JDK1.1中實現的,它大大增強了Java開發分佈式應用的能力。而RMI就是開發百分之百純Java的網絡分佈式應用系統的核心解決方案,所以如果不是java的系統就不能使用RMI,這也是其缺點之一。RMI全部的宗旨就是儘可能簡化遠程接口對象的使用,相當於在服務器端暴露服務,通過bind或者rebind方法註冊到RMIRegistry中,註冊的信息中包含url,以及相應的類。客戶端在在註冊中心根據url得到遠程對象(stub,存根),然後調用stub遠程調用方法,底層的一些stub怎麼連接服務器,怎麼獲取結果返回,下面的參考鏈接都應該有講到。

參考文章:http://www.jianshu.com/p/2c78554a3f36

                  http://blog.csdn.net/guyuealian/article/details/51992182 

3.RPC

瞭解上面的RMI,它的主要的流程就是Client<-->stub<-->[NETWORK]<-->skeleton<-->Server,還有一個比較重要的概念就是RMIRegistry,其實大家網上去查RPC的時候流程其實都差不多,可能叫法和底層東西有點不一樣,其實現所遵循的模型還是類似的。主要的區別的話是RMI是隻適用於java的,而RPC任何語言都可以;第二點就是他們兩者的調用方式不一樣,最終的目標還是一致。

什麼是RPC

遠程方法調用,就是像調用本地方法一樣調用遠程方法。常見RPC框架結構圖:

 

RPC框架要做到的最基本的三件事:

1、服務端如何確定客戶端要調用的函數;

在遠程調用中,客戶端和服務端分別維護一個【ID->函數】的對應表, ID在所有進程中都是唯一確定的。客戶端在做遠程過程調用時,附上這個ID,服務端通過查表,來確定客戶端需要調用的函數,然後執行相應函數的代碼。

2、如何進行序列化和反序列化;

客戶端和服務端交互時將參數或結果轉化爲字節流在網絡中傳輸,那麼數據轉化爲字節流的或者將字節流轉換成能讀取的固定格式時就需要進行序列化和反序列化,序列化和反序列化的速度也會影響遠程調用的效率。

3、如何進行網絡傳輸(選擇何種網絡協議);

多數RPC框架選擇TCP作爲傳輸協議,也有部分選擇HTTP。如gRPC使用HTTP2。不同的協議各有利弊。TCP更加高效,而HTTP在實際應用中更加的靈活。

其與RMI大致的區別

1)RPC 跨語言,而 RMI只支持Java。

(2)RMI 調用遠程對象方法,允許方法返回 Java 對象以及基本數據類型,而RPC 不支持對象的概念,傳送到 RPC

服務的消息由外部數據表示 (External Data Representation, XDR) 語言表示,這種語言抽象了字節序類和數據類型結

構之間的差異。只有由 XDR 定義的數據類型才能被傳遞, 可以說 RMI 是面向對象方式的 Java RPC 。

(3)在方法調用上,RMI中,遠程接口使每個遠程方法都具有方法簽名(url)。如果一個方法在服務器上執行,但是沒有相

匹配的簽名被添加到這個遠程接口上,那麼這個新方法就不能被RMI客戶方所調用。

在RPC中,當一個請求到達RPC服務器時,這個請求就包含了一個參數集和一個文本值,通常形成“classname.methodname”的形式。這就向RPC服務器表明,被請求的方法在爲 “classname”的類中,名叫“methodname”。然後RPC服務器就去搜索與之相匹配的類和方法,並把它作爲那種方法參數類型的輸入。這裏的參數類型是與RPC請求中的類型是匹配的。一旦匹配成功,這個方法就被調用了,其結果被編碼後返回客戶方。說的直白一點就是rmi是自己寫一個url,如果正確就獲得相應的stub,而rpc的url是從註冊中心去拿的,不會出現url不對的情況

4.soap

全稱Simple Object Access Protocol簡單對象訪問協議,是交換數據的一種協議規範,是一種輕量的、簡單的、基於XML(標準通用標記語言下的一個子集)的協議,它被設計成在WEB上交換結構化的和固化的信息。關鍵詞——協議,實現分佈式,webservice的一種協議,一種解決方式。

參考文章:http://blog.csdn.net/zhangzeyuaaa/article/details/20041015

5.REST

REST是英文representational state transfer(表象性狀態轉變)或者表述性狀態轉移。首次由Roy Fielding博士在2000年他的博士論文中提出REST(Representational State Transfer)風格的軟件架構模式後,REST就基本上迅速取代了複雜而笨重的SOAP,成爲Web API的標準了。Rest是web服務的一種架構風格;使用HTTP、URI、XML、JSON、HTML等廣泛流行的標準和協議;輕量級,跨平臺,跨語言的架構設計;它是一種設計風格一種思想,不是一種標準。Rest架構的主要原則如下:

1.網絡上的所有事物都被抽象爲資源
2.每個資源都有一個唯一的資源標識符
3.同一個資源具有多種表現形式(xml,json等)
4.對資源的各種操作不會改變資源標識符
5.所有的操作都是無狀態的

符合REST原則的架構方式即可稱爲RESTful。RESTful 架構風格的服務是圍繞資源展開的,是典型的ROA架構。ROA即Resource Oriented Architecture(面向資源的架構思想)RESTful通過一個URI(統一資源定位符)指向資源,即每個URI都對應一個特定的資源。要獲取這個資源,訪問它的URI就可以,因此URI就成了每一個資源的地址或識別符。一般的,每個資源至少有一個URI與之對應,最典型的URI即URL。

所謂"資源",就是網絡上的一個實體,或者說是網絡上的一個具體信息。它可以是一段文本、一張圖片、一首歌曲、一種服務,總之就是一個具體的實在。資源總要通過某種載體反應其內容,文本可以用txt格式表現,也可以用HTML格式、XML格式表現,甚至可以採用二進制格式;圖片可以用JPG格式表現,也可以用PNG格式表現;JSON是現在最常用的資源表示格式。

RESTful架構風格規定,數據的元操作,即CRUD(create, read, update和delete,即數據的增刪查改)操作,分別對應於HTTP方法:GET用來獲取資源,POST用來新建資源(也可以用於更新資源),PUT用來更新資源,DELETE用來刪除資源,這樣就統一了數據操作的接口,僅通過HTTP方法,就可以完成對數據的所有增刪查改工作。

即:

  • GET(SELECT):從服務器取出資源(一項或多項)。
  • POST(CREATE):在服務器新建一個資源。
  • PUT(UPDATE):在服務器更新資源(客戶端提供完整資源數據)。
  • PATCH(UPDATE):在服務器更新資源(客戶端提供需要修改的資源數據)。
  • DELETE(DELETE):從服務器刪除資源。

例如:如果我們想要獲取某個電商網站的某個商品,輸入http://localhost:9999/products/123,就可以看到id爲123的商品頁面,但這個結果是HTML頁面,它同時混合包含了Product的數據和Product的展示兩個部分。對於用戶來說,閱讀起來沒有問題,但是,如果機器讀取,就很難從HTML中解析出Product的數據。

如果一個URL返回的不是HTML,而是機器能直接解析的數據,這個URL就可以看成是一個Web API。比如,讀取http://localhost:9999/api/products/123,如果能直接返回Product的數據,那麼機器就可以直接讀取。

REST就是一種設計API的模式。最常用的數據格式是JSON。由於JSON能直接被JavaScript讀取,所以,以JSON格式編寫的REST風格的API具有簡單、易讀、易用的特點。

編寫API有什麼好處呢?由於API就是把Web App的功能全部封裝了,所以,通過API操作數據,可以極大地把前端和後端的代碼隔離,使得後端代碼易於測試,前端代碼編寫更簡單。

在移動互聯網的大潮下,隨着docker等技術的興起,微服務概念也越來越被大家接受並應用於實踐,日益增多的web service逐漸統一於RESTful 架構風。在企業中,RESTful API(也稱RESTful Web服務)也逐漸超越SOAP成爲實現SOA的重要手段之一。時至今日,RESTful架構風格已成爲企業級服務的標配。

http://www.jianshu.com/p/65ab865a5e9f

6.Web Service

Web Service提供的服務是基於web容器的,底層使用http協議,類似一個遠程的服務提供者,比如天氣預報服務,對各地客戶端提供天氣預報,是一種請求應答的機制,是跨系統跨平臺的。

首先客戶端從服務器的到WebService的WSDL,同時在客戶端聲稱一個代理類(Proxy Class) 這個代理類負責與WebService

服務器進行Request 和Response 當一個數據(XML格式的)被封裝成SOAP格式的數據流發送到服務器端的時候,就會生成一個進程對象並且把接收到這個Request的SOAP包進行解析,然後對事物進行處理,處理結束以後再對這個計算結果進行SOAP

包裝,然後把這個包作爲一個Response發送給客戶端的代理類(Proxy Class),同樣地,這個代理類也對這個SOAP包進行解析處理,繼而進行後續操作。這就是WebService的一個運行過程。

webservice是一種標準,他可以通過soap或RESTful的方式來實現。

傳統的soap-webservice,使用了soap協議(基於xml包裝)等。如果使用restful webservice的話,則不需要soap與之相關的協議等,而是通過最簡單的 http 協議傳輸數據 ( 包括 xml 或 json) 。既簡化了設計,也減少了網絡傳輸量(因爲只傳輸代表數據的 xml 或 json ,沒有額外的 xml 包裝)。

Web Service主要涉及的概念:

1. Http傳輸信道

2. XML的數據格式

3. SOAP封裝格式

4. WSDL的描述方式

5. UDDI UDDI是一種目錄服務,企業可以使用它對Webservices進行註冊和搜索

參考文檔:https://blog.csdn.net/u013551585/article/details/78983349

總結:

雖然ROA與SOA並不衝突,甚至把ROA看做SOA的一種也未嘗不可,但由於RPC也是SOA,比較久遠一點點論文、博客或圖書也常把SOA與RPC混在一起討論,因此,RESTful 架構風格的服務(SOA)通常被稱之爲ROA架構,很少提及SOA架構,以便更加顯式的與RPC區分。

RPC風格曾是Web Service的主流,最初是基於XML-RPC協議(一個遠程過程調用(remote procedure call,RPC)的分佈式計算協議),後來漸漸被SOAP協議(簡單對象訪問協議(Simple Object Access Protocol))取代;RPC風格的服務,不僅可以用HTTP,還可以用TCP或其他通信協議。但RPC風格的服務,受開發服務採用語言的束縛比較大,如.NET框架中,開發web service的傳統方式是使用WCF,基於WCF開發的服務即RPC風格的服務,使用該服務的客戶端通常要用C#來實現,如果使用python或其他語言,很難實現可以直接與服務通信客戶端;進入移動互聯網時代後,RPC風格的服務很難在移動終端使用,而RESTful風格的服務,由於可以直接以jsonxml爲載體承載數據,以HTTP方法爲統一接口完成數據操作,客戶端的開發不依賴於服務實現的技術,移動終端也可以輕鬆使用服務,這也加劇了REST取代RPC成爲web service的主導。

SOA和ROA 區別與聯繫

SOA架構中的對外服務一般都由web service來暴露。而web service的實現有基於soap的重量級實現以及基於rest的輕量級實現方式,輕量級的restful風格的web service API 就是將所有業務被抽象成資源使用“本真restful”來實現暴露出來,其實就是嚴格的rest實現,即就是ROA架構
SOA架構中的內部服務一般由某種高效的RPC調用來暴露,當然了 也可以用web service來暴露,性能可能有些損失,目前SOA使用的比較廣泛,多數的分佈式集羣系統的盛行,其內部多節點之間的服務通信採用RPC調用來實現。畢竟現實業務,很多都是要“幹什麼”,不僅僅是對資源的增、刪、改、查。

 

 

 

 

 

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