集群伺服器訊息通訊辦法

2021-06-25 11:23:16 字數 3615 閱讀 3484

對於一些基於tcp socket的大型c/s應用來說,能進行跨伺服器通訊可能是乙個繞不開的功能性需求。出現這種需求的場景類似於下面描述的這種情況。

如何解決了?這就需要引入群集平台的概念。群集平台中有乙個應用群集管理伺服器acms可以將所有的tcp應用伺服器管理起來,並且能在它們之間**訊息。這樣,即使位於不同的tcp應用伺服器上的客戶端之間也可以相互傳送訊息了。結構模型簡化後如下所示:

以上圖為例,兩個客戶端client01與client02分別連上不同的應用伺服器as01和as02,我們假設由於路由器的原因(比如兩個路由器的nat型別都是symmetric),client01與client02之間的p2p通道沒有建立成功。此時,如果client01與client02之間要相互溝通資訊,那麼資訊就會經過acms中轉。比如client01要發資訊給client02,資訊經過的路線將會是:client01 => as01 => acms => as02 => client02。

能簡單地實現這種模型嗎?並且讓這種跨伺服器通訊對於客戶端而言是透明的?當然,基於esplatform群集平台,我們很容易做到這一點。 本文我們就實現乙個這樣的demo。我們之前有個老的簡單的im的demo,它演示了客戶端與伺服器、以及客戶端與客戶端之間的基本通訊功能。只不過,在那個demo中,相互通訊的客戶端連上的是同乙個服務端。本文的demo就是在那個老demo的基礎上來進行公升級,使得位於不同伺服器上的兩個客戶端之間也可以相互通訊。

一.demo專案結構

本demo總共包含4個專案。

1.esplatform.acmserver:這個是基於esplatform的應用群集伺服器acms。

2.esplatform.******demo.core:用於定義公共的資訊型別、通訊協議。

3.esplatform.******demo.server:demo的服務端。

4.esplatform.******demo.client:demo的客戶端。

二.應用群集管理伺服器acms

我們不需要對acms進行任何修改,只需要關注配置檔案中transferport和remoting埠的值。

<

configuration

>

<

>

<

add

key="serverassignedpolicy"

value

="minusercount"

/>

<

add

key="transferport"

value

="12000"

/>

>

<

system.runtime.remoting

>

<

>

<

channels

>

<

channel

ref="tcp"

port

="11000"

>

<

serverproviders

>

<

provider

ref="wsdl"

/>

<

formatter

ref="soap"

typefilterlevel

="full"

/>

<

formatter

ref="binary"

typefilterlevel

="full"

/>

serverproviders

>

<

clientproviders

>

<

formatter

ref="binary"

/>

clientproviders

>

channel

>

channels

>

>

system.runtime.remoting

>

configuration

>

三.demo服務端在公升級老的demo時,首先需要新增esplatform.dll的引用,然後,使用esplatform.dll程式集中的esplatform.rapid.rapidserverengine替代esplus.rapid.rapidserverengine,並在建構函式中指定:當前服務端例項的id、acms的ip位址及其transferport和remoting埠。

//

esplatform.server.defaultfriendsmanager friendmanager = new

esplatform.server.defaultfriendsmanager();

this.engine = new

esplatform.rapid.rapidserverengine(int.parse(this.textbox_serverid.text), this.textbox_acmsip.text, int.parse(this.textbox_acmsport.text) ,int.parse(this

.textbox_transferport.text));

this.engine.friendsmanager =friendmanager;

this.engine.initialize(int.parse(this.textbox_serverport.text), new customizehandler(), new

basichandler());

friendmanager.platformusermanager

= this.engine.platformusermanager;

其它的部分與老demo完全一致。

四.demo客戶端

相對於老的demo而言,客戶端的修改非常小,只是將配置檔案中的伺服器的ip和埠移到了登入介面上,這樣方便指定要連線的服務端的位址。除此之外,沒有其它變化,甚至,客戶端的專案都不需要引用esplatform.dll。

五.執行demo

1.啟動應用群集管理伺服器acms。

2.啟動第乙個服務端,serverid指定為0,監聽6000埠。

3.啟動第二個服務端,serverid指定為1,監聽6001埠。

4.啟動第乙個客戶端,連線serverid為0的服務端。

5.啟動第二個客戶端,連線serverid為1的服務端。

6.兩個客戶端之間可以相互對話了。

(在正式的應用場景中,acms、兩個服務端、兩個客戶端 可以部署在不同的機器器上)

下圖是demo執行起來的效果:

集群伺服器

集群,英文名稱為cluster,通俗地說,集群是這樣一種技術 它將多個系統連線到一起,使多台伺服器能夠像一台機器那樣工作或者看起來好像一台機器。採用集群系統通常是為了提高系統的穩定性和網路中心的資料處理能力及服務能力。舉個例子來說,我們架設了一台www伺服器,上面構建了乙個電子商務 然而隨著時間的推...

tomcat伺服器集群

server info out.println request.getlocaladdr request.getlocalport out.println id session.getid 如果有新的 session 屬性設定 string dataname request.getparameter...

伺服器訊息推送

客戶端定時向伺服器傳送ajax請求,伺服器接到請求後馬上返回響應資訊並關閉連線 優點 後端程式編寫比較容易 缺點 求中有大半是無用,浪費頻寬和伺服器資源 客戶端向伺服器傳送ajax請求,伺服器接到請求後hold住連線,直到有新訊息才返回響應資訊並關閉連線,客戶端處理完響應資訊後再向伺服器傳送新的請求...