
如何快速實現REST API集成以優化業務流程
CORBA和之前提到的DCOM和RMI類似,都提供了遠程的對象/方法調用,但是CORBA是一種與語言和實現無關的技術,我記得我們當時的測試腳本使用了TCL,也有CORBA的實現,也就是說CORBA定了與語言解耦的系統間通信的標準。這個是它的最大的優勢。那個年代的應用,采用CORBA作為系統間的通信手段非常普遍。
開發CORAB的過程從IDL的定義開始,用戶通過IDL定義了對象,然后在Server端實現該對象的應用邏輯,在Client端調用該對象。
但是CORBA并非沒有缺點,否則我們也不會很少再看見今天的應用用CORAB作為API的了。他的主要問題是:
總之,今天你要開發一個引用,除非要個已有系統交互,你應該不會選擇CORBA。
XML-RPC發表于1998年,由UserLand Software(UserLand Software)的Dave Winer及Microsoft共同發表。后來在新的功能不斷被引入下,這個標準慢慢演變成為今日的SOAP協議
下面是一個 XML-RPC的請求/響應的例子:
<?xml version="1.0"?>
<methodCall>
<methodName>examples.getStateName</methodName>
<params>
<param>
<value><i4>40</i4></value>
</param>
</params>
</methodCall>
<?xml version="1.0"?>
<methodResponse>
<params>
<param>
<value><string>South Dakota</string></value>
</param>
</params>
</methodResponse>
SOAP是 Simple Object Access Protocol 的縮寫。SOAP為Web服務提供了Web服務協議棧的Messaging Protocol層。它是一個基于XML的協議,由三部分組成:
SOAP具有三個主要特征:
作為SOAP過程可以執行的操作的示例,應用程序可以將SOAP請求發送到啟用了帶有搜索參數的Web服務的服務器(例如,房地產價格數據庫)。然后,服務器返回SOAP響應(包含結果數據的XML格式的文檔),例如價格,位置,功能。由于生成的數據采用標準化的機器可解析格式,因此發出請求的應用程序可以直接將其集成。
SOAP體系結構由以下幾層規范組成:
這里是一個SOAP消息的例子:
POST /InStock HTTP/1.1
Host: www.example.org
Content-Type: application/soap+xml; charset=utf-8
Content-Length: 299
SOAPAction: "http://www.w3.org/2003/05/soap-envelope"
<?xml version="1.0"?>
<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:m="http://www.example.org">
<soap:Header>
</soap:Header>
<soap:Body>
<m:GetStockPrice>
<m:StockName>T</m:StockName>
</m:GetStockPrice>
</soap:Body>
</soap:Envelope>
相比較XML-RPC,它的功能更多,當然消息結構也更復雜。SOAP是W3C推薦的Webservice標準,一度也是非常的流行,但是我們看到基于XML的消息比較復雜,消息本身因為XML的原因,有相當多的開銷。于是后面又有了基于JSON的RPC格式。但總的來說,SOAP也已經是昨日黃花,當今的應用構建,你選它的概率應該也不大了。
REST是當今最為流行的API。因為大量的Web應用采用REST作為其API的選擇。REST是 Representational State Transfer 的縮寫。是Roy Thomas Fielding博士于2000年在他的博士論文中提出來的一種萬維網軟件架構風格。
目的是便于不同軟件/程序在網絡(例如互聯網)中互相傳遞信息。表現層狀態轉換是根基于超文本傳輸協議(HTTP)之上而確定的一組約束和屬性,是一種設計提供萬維網絡服務的軟件構建風格。
符合或兼容于這種架構風格(簡稱為 REST 或 RESTful)的網絡服務,允許客戶端發出以統一資源標識符訪問和操作網絡資源的請求,而與預先定義好的無狀態操作集一致化。因此表現層狀態轉換提供了在互聯網絡的計算系統之間,彼此資源可交互使用的協作性質(interoperability)。相對于其它種類的網絡服務,例如SOAP服務,則是以本身所定義的操作集,來訪問網絡上的資源。目前在三種主流的Web服務實現方案中,因為REST模式與復雜的SOAP和XML-RPC相比更加簡潔,越來越多的Web服務開始采用REST風格設計和實現。所以我們可以看到軟件的發展,大體是從復雜變得簡單,只有簡單的東西才會變得更有生命力。
為了使任何應用程序真正實現RESTful,必須遵循六個體系結構約束:
基于REST的Web服務被稱為RESTful Web服務。在這些應用程序中,每個組件都是一種資源,可以使用HTTP標準方法通過公共接口訪問這些資源。以下四種HTTP方法通常用于基于REST的體系結構中:
RESTFul風格API所有的操作都是一個動詞,對應HTTP請求的一種類型。每一個操作都定義了對操作的資源的某種行為。這種抽象,特別適合相當多的Web應用,后臺是一個數據庫,每一個REST的端點對應了一張數據庫的表,很自然的利用REST操作來實現表的增刪查改。當然RESTFul的風格也有它的不足:
于是新的API類型會出現來解決這些問題。
GraphQL是一個開源的API數據查詢和操作語言及實現為了實現上述操作的相應運行環境。2012年,GraphQL由Facebook內部開發,2015年公開公布。2018年11月7日,Facebook將GraphQL項目轉移到新成立的GraphQL基金會 。GraphQL規范概述了5條設計原則,這使其成為現代前端開發的精心設計的解決方案。讓我們研究一下GraphQL的設計原則。
像RESTful API一樣,GraphQL API旨在處理HTTP請求并提供對這些請求的響應。但是,相似之處到此結束。在REST API建立在請求方法和端點之間的連接上的情況下,GraphQL API設計為僅使用一個始終通過POST請求查詢的端點,通常使用URL yourdomain.com/graphql。
達到GraphQL端點后,客戶端請求的負擔將完全在請求主體內處理。該請求主體必須遵守GraphQL規范,并且API必須具有適當的服務器端邏輯來處理這些請求并提供適當的響應。與RESTful API相比,這提供了更流暢的客戶端體驗,后者可能要求客戶端對多個數據進行多次請求,并在數據返回后進行操作。
如上圖的例子,用戶通過RESTFul的API來請求數據,需要兩個GET請求,先獲取Assets,再通過AssetID獲取comments。而通過GraphQL,用戶只需要描述需要請求的數據的結構和條件,就可以通過一個請求獲取全部所需要的數據,簡化了客戶端與服務器的交互。
GraphQL提供的性能優于REST API,可以為前端開發人員帶來回報。使用GraphQL規范創建服務器可能需要更多設置和編寫預測性服務器端邏輯來解析和處理請求。盡管GraphQL的安裝成本可能會高于傳統的REST架構,但更具可維護性的代碼,強大的開發工具以及簡化的客戶端查詢,這些都是不錯的收益。
除了靈活性這個最大的優點外,GraphQL還有以下的優點:
當然,GraphQL也不是沒有缺點:
gRPC是一個開源的遠程過程調用框架,用于在服務之間進行高性能的通信。這是將以不同語言編寫的服務與可插拔支持(用于負載平衡,跟蹤,運行狀況檢查和身份驗證)相連接的有效方法。默認情況下,gRPC使用Protobuf(協議緩沖區)序列化結構化數據。通常,對于微服務體系結構,gRPC被認為是REST協議的更好替代方案。gRPC中的” g”可以歸因于最初開發該技術的Google。
gRPC是對傳統RPC框架的改編。那么,它與現有的RPC框架有何不同?
最重要的區別是gRPC使用protobuf 協議緩沖區作為接口定義語言進行序列化和通信,而不是JSON / XML。協議緩沖區可以描述數據的結構,并且可以從該描述中生成代碼,以生成或解析表示結構化數據的字節流。這就是為什么gRPC首選多語言(使用不同技術實現)的Web應用程序的原因。二進制數據格式使通信更輕松。gRPC也可以與其他數據格式一起使用,但是首選的是protobuf。
同樣,gRPC建立在HTTP / 2之上,它支持雙向通信以及傳統的請求/響應。gRPC允許服務器和客戶端之間的松散耦合。在實踐中,客戶端打開與gRPC服務器的長期連接,并且將為每個RPC調用打開一個新的HTTP / 2流。
如上圖所示,gRPC支持不同模式的客戶端和服務器端的通信方式,極大的方便了不同的互操作能力。
與使用JSON(主要是JSON)的REST不同,gRPC使用Protobuf,這是編碼數據的更好方法。由于JSON是基于文本的格式,因此它比protobuf格式的壓縮數據要重得多。
與REST相比,gRPC的另一個顯著改進是它使用HTTP 2作為其傳輸協議。REST使用的HTTP 1.1基本上是一個請求-響應模型。gRPC利用HTTP 2的雙向通信功能以及傳統的響應請求結構。在HTTP 1.1中,當多個請求來自多個客戶端時,它們將被一一處理。這會降低系統速度。HTTP 2允許多路復用,因此可以同時處理多個請求和響應。
gRPC的開發模式和之前提到的CORBA有些類似。Protobuf充當了IDL的角色,然后利用工具生成各種語言的代碼,最后在生成的代碼上實現服務器端和客戶端的邏輯。
gRPC的優點是:
缺點:
因為其高性能,gRPC更適合被用于系統內部組件的通信選擇。在下圖的微服務架構中,對外的服務采用了REST或者GraphQL的API,而內部微服務之間使用的是gRPC。
好了,看了這么多的API選擇之后,我們做一個小結。系統間的API選項經過多年的發展,現階段的主流是RESTful API,gRPC 和GraphQL。具體怎么選擇,要結合你的業務上下文,我的推薦是:
文章轉自微信公眾號@Python貓