国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

網絡協議 21 - RPC 協議(中)- 基于 JSON 的 RESTful 接口協議

Paul_King / 601人閱讀

摘要:服務發現問題對于來講,我們已經解決了傳輸協議的問題基于,協議約定問題基于,最后要解決的是服務發現問題。另外一方是服務消費方,向獲取服務提供方的注冊信息。

????上一節我們了解了基于 XML 的 SOAP 協議,SOAP 的 S 是啥意思來著?是 Simple,但是好像一點兒都不簡單啊!

傳輸協議問題

????對于 SOAP 來講,比如我創建一個訂單,用 POST,在 XML 里面寫明動作是 CreateOrder;刪除一個訂單,還是用 POST,在 XML 里面寫明了動作是 DeleteOrder。其實創建訂單完全可以使用 POST 動作,然后在 XML 里面放一個訂單的信息就可以了,而刪除用 DELETE 動作,然后在 XML 里面放一個訂單的 ID 就可以了。

????于是上面的那個 SOAP 就變成下面這個簡單的模樣。

POST /purchaseOrder HTTP/1.1
Host: www.cnblog.com
Content-Type: application/xml; charset=utf-8
Content-Length: nnn


 
     2018-07-01
       板栗燜雞 
       58
  

????而且 XML 的格式也可以改成另外一種簡單的文本化的對象表示格式 JSON。

????經常寫 Web 應用的應該已經發現,這就是 RESTful 格式的 API 的樣子。

協議約定問題

????然而 RESTful 可不僅僅是指 API,而是一種架構風格,全稱 Representational State Transfer,表述性狀態轉移,來自一篇重要的論文《架構風格與基于網絡的軟件架構設計》(Architectural Styles and the Design of Network-based Software Architectures)。

????這篇文章從深層次,更加抽象地論證了一個互聯網應用應該有的設計要點,而這些設計要點,成為后來我們能看到的所有高并發應用設計都必須要考慮的問題,再加上 REST API 比較簡單直接,所以后來幾乎成為互聯網應用的標準接口。

????因此,和 SOAP 不一樣,REST 不是一種嚴格規定的標準,它其實是一種設計風格。如果按這種風格進行設計,RESTful 接口和 SOAP 接口都能做到,只不過后面的架構是 REST 倡導的,而 SOAP 相對比較關注前面的接口。

????而且由于能夠通過 WSDL 生成客戶端的 Stub,因而 SOAP 常常被用于類似傳統的 RPC 方式,也即調用遠端和調用本地是一樣的。

????然而本地調用和遠程跨網絡調用畢竟不一樣,這里的不一樣還不僅僅是因為有網絡而導致的客戶端和服務端的分離,從而帶來的網絡性能問題。更重要的問題是,客戶端和服務端誰來維護狀態。所謂的狀態就是對某個數據當前處理到什么程度了。

????這里舉幾個例子,例如,我瀏覽到哪個目錄了,我看到第幾頁了,我要買個東西,需要扣減一下庫存,這些都是狀態。本地調用其實沒有人糾結這個問題,因為數據都在本地,誰處理都一樣,而且一邊處理了,另一邊馬上就能看到。

????當有了 RPC 之后,我們本來期望對上層透明,就像上一節說的“遠在天邊,盡在眼前”。于是使用 RPC 的時候,對于狀態的問題也沒有太多的考慮。

????就像 NFS 一樣,客戶端會告訴服務端,我要進入哪個目錄,服務端必須要為某個客戶端維護一個狀態,就是當前這個客戶端瀏覽到哪個目錄了。例如,客戶端輸入 cd hello,服務端要在某個地方記住,上次瀏覽到 /root/liuchao 了,因而客戶的這次輸入,應該給它顯示 /root/liuchao/hello 下面的文件列表。而如果有另一個客戶端,同樣輸入 cd hello,服務端也在某個地方記住,上次瀏覽到 /var/lib,因而要給客戶顯示的是 /var/lib/hello。

????不光 NFS,如果瀏覽翻頁,我們經常要實現函數 next(),在一個列表中取下一頁,但是這就需要服務端記住,客戶端 A 上次瀏覽到 20~30 頁了,那它調用 next(),應該顯示 30~40 頁,而客戶端 B 上次瀏覽到 100~110 頁了,調用 next() 應該顯示 110~120 頁。

????上面的例子都是在 RPC 場景下,由服務端來維護狀態,很多 SOAP 接口設計的時候,也常常按這種模式。這種模式原來沒有問題,是因為客戶端和服務端之間的比例沒有失衡。因為一般不會同時有太多的客戶端同時連上來,所以 NFS 還能把每個客戶端的狀態都記住。

????公司內部使用的 ERP 系統,如果使用 SOAP 的方式實現,并且服務端為每個登錄的用戶維護瀏覽到報表那一頁的狀態,由于一個公司內部的人也不會太多,把 ERP 放在一個強大的物理機上,也能記得過來。

????但是互聯網場景下,客戶端和服務端就徹底失衡了。你可以想象“雙十一”,多少人同時來購物,作為服務端,它能記得過來嗎?當然不可能,只好多個服務端同時提供服務,大家分擔一下。但是這就存在一個問題,服務端怎么把自己記住的客戶端狀態告訴另一個服務端呢?或者說,你讓我給你分擔工作,你也要把工作的前因后果給我說清楚啊!

????那服務端索性就要想了,既然這么多客戶端,那大家就分分工吧。服務端就只記錄資源的狀態,例如文件的狀態,報表的狀態,庫存的狀態,而客戶端自己維護自己的狀態。比如,你訪問到哪個目錄了啊,報表的哪一頁了啊,等等。

????這樣對于 API 也有影響,也就是說,當客戶端維護了自己的狀態,就不能這樣調用服務端了。例如客戶端說,我想訪問當前目錄下的 hello 路徑。服務端說,我怎么知道你的當前路徑。所以客戶端要先看看自己當前路徑是 /root/liuchao,然后告訴服務端說,我想訪問 /root/liuchao/hello 路徑。

????再比如,客戶端說我想訪問下一頁,服務端說,我怎么知道你當前訪問到哪一頁了。所以客戶端要先看看自己訪問到了 100~110 頁,然后告訴服務器說,我想訪問 110~120 頁。

????這就是服務端的無狀態化。這樣服務端就可以橫向擴展了,一百個人一起服務,不用交接,每個人都能處理。

????所謂的無狀態,其實是服務端維護資源的狀態,客戶端維護會話的狀態。對于服務端來講,只有資源的狀態改變了,客戶端才調用 POST、PUT、DELETE 方法來找我;如果資源的狀態沒變,只是客戶端的狀態變了,就不用告訴我了,對于我來說都是統一的 GET。

????雖然這只改進了 GET,但是已經帶來了很大的進步。因為對于互聯網應用,大多數是讀多寫少的。而且只要服務端的資源狀態不變,就給了我們緩存的可能。例如可以將狀態緩存到接入層,甚至緩存到 CDN 的邊緣節點,這都是資源狀態不變的好處。

????按照這種思路,對于 API 的設計,就慢慢變成了以資源為核心,而非以過程為核心。也就是說,客戶端只要告訴服務端你想讓資源狀態最終變成什么樣就可以了,而不用告訴我過程,不用告訴我動作。

????還是文件目錄的例子。客戶端應該訪問哪個絕對路徑,而非一個動作,我就要進入某個路徑。再如,庫存的調用,應該查看當前的庫存數目,然后減去購買的數量,得到結果的庫存數。這個時候應該設置為目標庫存數(但是當前庫存數要匹配),而非告知減去多少庫存。

????這種 API 的設計需要實現冪等,因為網絡不穩定,就會經常出錯,因而需要重試,但是一旦重試,就會存在冪等的問題,也就是同一個調用,多次調用的結果應該一樣,不能一次支付調用,因為調用三次變成了支付三次。不能進入 cd a,做了三次,就變成了 cd a/a/a。也不能扣減庫存,調用了三次,就扣減三次庫存。

????當然按照這種設計模式,無論 RESTful API 還是 SOAP API 都可以將架構實現成無狀態的,面向資源的、冪等的、橫向擴展的、可緩存的。

????但是 SOAP 的 XML 正文中,是可以放任何動作的。例如 XML 里面可以寫 < ADD >,< MINUS > 等。這就方便使用 SOAP 的人,將大量的動作放在 API 里面。

????RESTful 沒這么復雜,也沒給客戶提供這么多的可能性,正文里的 JSON 基本描述的就是資源的狀態,沒辦法描述動作,而且能夠出發的動作只有 CRUD,也即 POST、GET、PUT、DELETE,也就是對于狀態的改變。

????所以,從接口角度,就讓你死了這條心。當然也有很多技巧的方法,在使用 RESTful API 的情況下,依然提供基于動作的有狀態請求,這屬于反模式了。

服務發現問題

????對于 RESTful API 來講,我們已經解決了傳輸協議的問題——基于 HTTP,協議約定問題——基于 JSON,最后要解決的是服務發現問題。

????有個著名的基于 RESTful API 的跨系統調用框架叫 Spring Cloud。在 Spring Cloud 中有一個組件叫 Eureka。傳說,阿基米德在洗澡時發現浮力原理,高興得來不及穿上褲子,跑到街上大喊:“Eureka(我找到了)!”所以 Eureka 是用來實現注冊中心的,負責維護注冊的服務列表。

????服務分服務提供方,它向 Eureka 做服務注冊、續約和下線等操作,注冊的主要數據包括服務名、機器 IP、端口號、域名等等。

????另外一方是服務消費方,向 Eureka 獲取服務提供方的注冊信息。為了實現負載均衡和容錯,服務提供方可以注冊多個。

????當消費方要調用服務的時候,會從注冊中心讀出多個服務來,那怎么調用呢?當然是 RESTful 方式了。

????Spring Cloud 提供一個 RestTemplate 工具,用于將請求對象轉換為 JSON,并發起 Rest 調用,RestTemplate 的調用也是分 POST、PUT、GET、 DELETE 的,當結果返回的時候,根據返回的 JSON 解析成對象。

????通過這樣封裝,調用起來也很方便。

小結

SOAP 過于復雜,而且設計是面向動作的,因而往往因為架構問題導致并發量上不去;

RESTful 不僅僅是一個 API,而且是一種架構模式,主要面向資源,提供無狀態服務,有利于橫向擴展應對高并發。

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/72995.html

相關文章

  • 網絡協議 21 - RPC 協議)- 基于 JSON RESTful 接口協議

    摘要:服務發現問題對于來講,我們已經解決了傳輸協議的問題基于,協議約定問題基于,最后要解決的是服務發現問題。另外一方是服務消費方,向獲取服務提供方的注冊信息。 ????上一節我們了解了基于 XML 的 SOAP 協議,SOAP 的 S 是啥意思來著?是 Simple,但是好像一點兒都不簡單啊! 傳輸協議問題 ????對于 SOAP 來講,比如我創建一個訂單,用 POST,在 XML 里面寫明...

    K_B_Z 評論0 收藏0
  • 網絡協議 22 - RPC 協議(下)- 二進制類 RPC 協議

    摘要:但是只不過都是以二進制的形式編碼的。這其實相當于綜合了和二進制共同優勢的一個協議。在上面的架構中,如果使用二進制的方式進行序列化,雖然不用協議文件來生成,但是對于接口的定義,以及傳的對象,還是需要共享。 ????前面我們認識了兩個常用文本類的 RPC 協議,對于陌生人之間的溝通,用 NBA、CBA 這樣的縮略語,會使得協議約定非常不方便。 ????在講 CDN 和 DNS 的時候,我們...

    付倫 評論0 收藏0
  • 網絡協議 22 - RPC 協議(下)- 二進制類 RPC 協議

    摘要:但是只不過都是以二進制的形式編碼的。這其實相當于綜合了和二進制共同優勢的一個協議。在上面的架構中,如果使用二進制的方式進行序列化,雖然不用協議文件來生成,但是對于接口的定義,以及傳的對象,還是需要共享。 ????前面我們認識了兩個常用文本類的 RPC 協議,對于陌生人之間的溝通,用 NBA、CBA 這樣的縮略語,會使得協議約定非常不方便。 ????在講 CDN 和 DNS 的時候,我們...

    wing324 評論0 收藏0
  • Java 遠程通訊技術及原理分析

    摘要:對于與而言,則可以看做是消息傳遞技術的一種衍生或封裝。在生產者通知消費者時,傳遞的往往是消息或事件,而非生產者自身。通過消息路由,我們可以配置路由規則指定消息傳遞的路徑,以及指定具體的消費者消費對應的生產者。采用和來進行遠程對象的通訊。 消息模式 歸根結底,企業應用系統就是對數據的處理,而對于一個擁有多個子系統的企業應用系統而言,它的基礎支撐無疑就是對消息的處理。與對象不同,消息本質上...

    rozbo 評論0 收藏0
  • 分布式服務框架之遠程通訊技術及原理分析

    摘要:微軟的雖然引入了事件機制,可以在隊列收到消息時觸發事件,通知訂閱者。由微軟作為主要貢獻者的,則對以及做了進一層包裝,并能夠很好地實現這一模式。 在分布式服務框架中,一個最基礎的問題就是遠程服務是怎么通訊的,在Java領域中有很多可實現遠程通訊的技術,例如:RMI、MINA、ESB、Burlap、Hessian、SOAP、EJB和JMS等,這些名詞之間到底是些什么關系呢,它們背后到底是基...

    sorra 評論0 收藏0

發表評論

0條評論

Paul_King

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<