TCP/IP、HTTP、WEBSERVICE、SOAP、ICE都使用後才有感慨

長征2號發表於2017-09-06

TCP是TCP/IP的第三層傳輸層,對應OSI的第四層傳輸層;
IP是TCP/IP的第二層互聯層,對應OSI的第三層網路層。

 

ICE(Internet Communications Engine)是ZeroC提供的一款高效能的中介軟體,基於ICE可以實現電信級的解決方案。前面我們提到過在設計網站架構的時候可以使用ICE實現對網站應用的基礎物件操作,將基礎物件操作和資料庫操作封裝在這一層,在業務邏輯層以及表現層(java,php,.net,python)進行更豐富的表現與操作,從而實現比較好的架構。基於ICE的資料層可以在未來方便的進行擴充套件。ICE支援分散式的部署管理,訊息中介軟體,以及網格計算等等。 

大道理講完,言歸正傳,最近育兒網新增了不少新服務,服務間經常會需要相互呼叫資料,例如使用者中心要取部落格系統裡的文章啊,論壇裡發文後要在積分系統裡增加使用者積分啊。由於設計時這些服務僅僅基於統一的使用者中心,服務間基本是獨立的,所以要實現這些呼叫只能在每個服務上新增為其它服務提供服務的服務-_-!。這個時候有幾個可選方案,我們開始選擇了xml-rpc,基於http和xml的選程呼叫,用了一段時間,發現維護成本和訪問效能都存在問題。 

由於這些中間服務部署的時候是和各自所屬的服務部署在一起的,對這些服務做整體的改動就非常困難,要維護起來就比較麻煩。另外由於是什麼http和xml作為通訊協議,由php實現業務邏輯,效能問題也很明顯,而且這些http請求都會在http日誌留下足跡,導致我們的日誌分析很不精確。這個問題不是太大,但很鬱悶,所以我們考慮使用ICE來解決這個問題,至於SOAP什麼的就不考慮了,同樣效率低下。 

實現的過程還是比較順利,花了三天的時間用c++實現了大部分常用的介面,服務端採用deamon的方式執行,錯誤日誌記在syslog裡(/var/log/messages),客戶端PHP,編譯進去了IcePHP,呼叫的方法很簡單。現在還存在一些問題,執行的時候會異常退出,還需要一段時間來解決,暫時加了只狗看著,一旦程式裡沒了就重新啟動。 

既然要跨平臺通訊,就涉及物件描述,ICE使用Slice來對結構,類,方法等進行定義。完了以後伺服器端,客戶端都按這個來呼叫和實現。ICE內建的Linux 下後臺Deamon實現方案非常簡單,只需要從Ice::Service裡派生出一個類來,實現run方法,在這個方法裡建立adapter物件,並在adapter物件裡新增Servants,然後啟用這個adapter就可以了,網路層的通訊都由ICE接管了。由於是基於tcp/ip的直接通訊,比更高層的http通訊效率要高很多。 

在客戶端實現時,我們也碰到了一些小麻煩。一個是內建的$ICE物件用的時候有時需要用global宣告,否則可能會出錯,另外由於預設情況下Slice中struct對應到php的型別是一個類的例項,而不是一個陣列,所以在賦值給頁面的時候,smarttemplate以及其它模板系統中可能都會存在問題,可以通過修改模板系統的資料賦值顯示程式碼解決。 

我們做了一些效能的測試,同樣執行1千次請求,使用xml-rpc實現需要28秒左右,使用ICE實現,只需要3秒多,效能的差距還是很大的,同時在這個過程中沒發現有記憶體洩露的情況,效果還比較理想。 
//////////////////

WEBSERVICE   所遵循的SOAP協議 是建立在HTTP協議之上的協議 

簡單物件訪問協議(SOAP)是W3C組織的一個Note, 它描述了一種在分散的或分散式的環境中如何交換資訊的輕量級協議。SOAP是一個基於XML的協議,它包括三個部分:SOAP封裝(Envelop),封裝定義了一個描述訊息中的內容是什麼,是誰傳送的,誰應當接受並處理它以及如何處理它們的框架;SOAP編碼規則(Encoding Rules),用於表示應用程式需要使用的資料型別的例項;SOAP RPC表示(RPC Representation),表示遠端過程呼叫和應答的協定;SOAP可以和多種傳輸協議繫結(Binding),使用底層協議交換資訊。在這個文件中,目前只定義了SOAP如何和HTTP以及HTTP擴充套件進行繫結的框架。

SOAP是個通訊協議, SOAP在HTTP協議的基礎上,把編寫成XML的REQUEST引數, 放在HTTP BODY上提交個WEB SERVICE伺服器(SERVLET,ASP什麼的) 處理完成後,結果也寫成XML作為RESPONSE送回使用者端, 為了使使用者端和WEB SERVICE可以相互對應,可以使用WSDL作為這種通訊方式的描述檔案,利用WSDL工具可以自動生成WS和使用者端的框架檔案,SOAP具備把複雜物件序列化捆綁到XML裡去的能力。

SOAP的前身是RPC, 就是遠端呼叫處理的協議,這個協議安全性不是很好,多數防火牆都會阻擋RPC的通訊包,而SOAP則使用HTTP協議作為基本的協議,使用埠80使得SOAP可以透過防火牆,完成RPC的功能。

SOAP協議和HTTP協議一樣,都是底層的通訊協議,只是請求包的格式不同而已,SOAP包是XML格式的,現在我們編寫WEB SERVICE不需要深入理解SOAP也沒關係。如果SERVICE和CLIENT在同樣的環境下使用SOAP,由於一般情況下都有自動生成SOAP程式框架的工具,因此不知道細節也沒關係. 可是, 如果CLIENT和SERVICE的環境不同,比如說JAVA的Client和.NET的SERVICE進行通訊,或者是VB CLIENT和TOMCAT下的JAVA SERVICE通訊,還是要知道一點細節為好. 特別是, WSDL或者UDDI都不是標準,如果不讓用就只好手工配製SOAP MESSAGE啦。

本文轉自茄子_2008部落格園部落格,原文連結:http://www.cnblogs.com/xd502djj/archive/2010/07/21/1782414.html,如需轉載請自行聯絡原作者。


相關文章