服務通信(dubbo)

如何實現遠程通信?

1、Webservice:效率不高基於soap協議。項目中不推薦使用。

2、使用restful形式的服務:http+json。很多項目中應用。如果服務太多,服務之間調用關係混亂,需要治療服務。

3、使用dubbo。使用rpc協議進行遠程調用,直接使用socket通信(進程間通信)。傳輸效率高,並且可以統計出系統之間的調用關係、調用次數

 

首先了解一下IPC概念:

進程間通信(IPC,InterProcess Communication):是指在不同進程之間傳播或交換信息。

IPC的方式通常有管道(包括無名管道和命名管道)、消息隊列、信號量、共享存儲、Socket、Streams等。其中 Socket和Streams支持不同主機上的兩個進程IPC。

ISO模型:

 

   

       應用層:TFTP,HTTP,SNMP,FTP,SMTP,DNS,Telnet 等等

  傳輸層:TCP,UDP

  網絡層:IP,ICMP,OSPF,EIGRP,IGMP

  數據鏈路層:SLIP,CSLIP,PPP,MTU

 

socket是在應用層和傳輸層之間的一個抽象層,它把TCP/IP層複雜的操作抽象爲幾個簡單的接口供應用層調用,從而實現進程在網絡中通信。 
在設計模式中,Socket其實就是一個門面模式,它把複雜的TCP/IP協議族隱藏在Socket接口後面,對用戶來說,一組簡單的接口就是全部,讓Socket去組織數據,以符合指定的協議。所謂的socket編程,只要熟悉這些接口即可。

 

短連接

連接->傳輸數據->關閉連接

HTTP是無狀態的,瀏覽器和服務器每進行一次HTTP操作,就建立一次連接,但任務結束後就中斷連接。短連接是指SOCKET連接後發送後接收完數據後馬上斷開連接。

長連接

連接->傳輸數據->保持連接->傳輸數據->....->關閉連接

長連接指建立SOCKET連接後不管是否使用都保持連接,但安全性較差。

http的長連接

HTTP也可以建立長連接的,使用Connection:keep-alive,HTTP1.1默認進行持久連接。HTTP1.1和HTTP1.0相比較而言,最大的區別就是增加了持久連接支持,但還是無狀態的,或者說是不可以信任的。

那什麼場景下使用長連接或者短連接?

長連接多用於操作頻繁,點對點的通訊(及時通訊),而且連接數不能太多。每個TCP連接都需要三次握手,建立連接,會比較耗時。如果每個操作都要先連接,再操作的話,處理速度會降低很多。長連接的特點是每個操作完後都不斷開連接,直接發送數據包就可以了,不需要每次都建立連接。

使用場景如下:

1.數據庫的連接用長連接。如果用短連接頻繁的通信會造成socket錯誤,而且頻繁的socket創建也是對資源的浪費。

2.像web網站的http服務一般都是用短連接,因爲長連接對於服務器來說會耗費一定的資源,而像WEB網站這麼頻繁的成千上萬甚至上億客戶端的連接用短連接會更省一點資源,如果用長連接,而且同時又成千上萬的用戶,如果每個用戶都佔用一個連接的話,併發量大,對服務器的壓力比較大。如果每個用戶無需頻繁操作情況下需用短連接。

 

備註理解:

連接的長短跟Socket沒有關係,Socket只是操作系統提供給應用程序進行網絡通信的抽象API。但是需要理解的是Socket API大多數情況下工作在傳輸層(偶爾可以工作在數據鏈路層),這意味着,你可以使用Socket開發基於TCP、UDP等的應用。

HTTP是基於TCP的應用層協議,雖然TCP是支持長連接的,但是HTTP並不強制要求長連接,大部分情況下,一次HTTP請求的完成經過了建立TCP鏈接->客戶端發送報文->服務端返回報文->服務端或客戶端關閉此連接這個過程,由於每次都要建立連接,並在完成一次請求響應後關閉連接,所以大家稱爲“短連接”。HTTP的所謂Keep-Alive,實際上是一種不可控的行爲,是爲了在一定程度上改善HTTP性能的,即服務端和客戶端希望不立刻斷開連接,這樣下次發送數據時就不需要建立TCP連接了,但是服務端和客戶端的任何一方都可以隨時斷開。

 

HTTP keep-alive connection timeouts
Firefox: 約115秒(定義在about:config中的network.http.keep-alive.timeout)
Chrome:  約320秒
Opera:   約120秒
MSIE:    約60秒(可以在註冊表中自定義)
Nginx:   默認值75秒(keepalive_timeout 75s)

HTTP 1.1默認啓用的HTTP持久連接(keep-alive)能夠在keepalive_timeout前省去每次傳輸報文都要建立TCP連接(三次握手)的時間和開銷.
keep-alive期間服務端和客戶端的TCP連接狀態是ESTABLISHED,執行以下命令可見:
date && sudo netstat -antp |grep "127.0.0.1"|egrep "firefox|nginx"|egrep "ESTABLISHED|WAIT"
i表示不區分大小寫,在查一次相當於"AND條件","|"表示"OR條件".
sudo netstat -antp|head -n2 && sudo netstat -antp|grep firefox
  •  
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章