多服務器實例
關鍵字: 多服務器實例, 多實例, 隔離, 多實例交互
SuperSocket 支持在同一進程中運行多個服務器實例
多個服務器實例可以是同一個服務器類型:
<superSocket>
<servers>
<server name="EchoServerA" serverTypeName="EchoService">
<listeners>
<add ip="Any" port="80" />
</listeners>
</server>
<server name="EchoServerB" serverTypeName="EchoService" security="tls">
<certificate filePath="localhost.pfx" password="supersocket"></certificate>
<listeners>
<add ip="Any" port="443" />
</listeners>
</server>
</servers>
<serverTypes>
<add name="EchoService"
type="SuperSocket.QuickStart.EchoService.EchoServer, SuperSocket.QuickStart.EchoService" />
</serverTypes>
</superSocket>
也可以是不同的服務器類型:
<superSocket>
<servers>
<server name="ServerA"
serverTypeName="MyAppServerA"
ip="Any" port="2012">
</server>
<server name="ServerB"
serverTypeName="MyAppServerB"
ip="Any" port="2013">
</server>
</servers>
<serverTypes>
<add name="MyAppServerA"
type="SuperSocket.QuickStart.MultipleAppServer.MyAppServerA, SuperSocket.QuickStart.MultipleAppServer" />
<add name="MyAppServerB"
type="SuperSocket.QuickStart.MultipleAppServer.MyAppServerB, SuperSocket.QuickStart.MultipleAppServer" />
</serverTypes>
</superSocket>
服務器實例的隔離級別
前面提到過, 在 SuperSocket 配置的根節點有這樣一個屬性:
<superSocket isolation="AppDomain">//None, AppDomain, Process
....
</superSocket>
如果這個isolation屬性的值是 'None' (默認值), 這些服務器實例將會在同一進程的同一 AppDomain 中運行. 因策他們能夠直接互相訪問. (我們將會在后面討論這一點)
但是如果isolation屬性的值是 'AppDomain', SuperSocket將為每個實例創建獨立的AppDomai, 所有的服務器實例都會運行在各自獨立的AppDomain之中。
但是如果isolation屬性的值是 'Process', SuperSocket將為每個實例創建獨立的進程, 所有的服務器實例都會運行在各自獨立的進程之中。
下面這張圖展示了隔離模型如何工作:
進程級別隔離
如果你想啟用進程級別隔離,除了上面的配置, 你還需要包含可執行文件 "SuperSocket.Agent.exe" 到你的項目輸出里面去, 這個可執行文件是由SuperSocket提供的。
當你啟動你的 SuperSocket 之后, 你將會發現 SuperSocket 啟動了多個進程:
SuperSocket.SocketService.exe
SuperSocket.Agent.exe
SuperSocket.Agent.exe
多服務器實例之間的交互
前面一部分提到了, 如果 isolation 設成 'None', 多服務器實例之間的交互是非常簡單的事情.
舉個例子, 他們能通過 SuperSocket 提供的 Bootstap 來彼此訪問:
interface IDespatchServer
{
void DispatchMessage(string sessionKey, string message);
}
public class MyAppServerB : AppServer, IDespatchServer
{
public void DispatchMessage(string sessionKey, string message)
{
var session = GetAppSessionByID(sessionKey);
if (session == null)
return;
session.Send(message);
}
}
public class MyAppServerA : AppServer
{
private IDespatchServer m_DespatchServer;
protected override void OnStartup()
{
m_DespatchServer = this.Bootstrap.GetServerByName("ServerB") as IDespatchServer;
base.OnStartup();
}
internal void DespatchMessage(string targetSessionKey, string message)
{
m_DespatchServer.DispatchMessage(targetSessionKey, message);
}
}
上面的示例代碼演示了如何從一個服務器實例轉發一條消息到另一個服務器實例一個 Session。
獨立控制服務器實例
默認情況下, 所有的服務器實例會和SuperSocket程序一起啟動和停止。是否有辦法啟動或停止一個實例而不影響其他它實例呢? 當然,答案是有,而且SuperSocket提供了多種方案:
-
SuperSocket 控制腳本
SuperSocket 在 SuperSocket.SocketService 項目中提供了兩個控制腳本:
-
supersocket.cmd - for Windows
supersocket list supersocket start FTPServer supersocket stop FTPServer
-
supersocket.sh - for Linux/Unix
./supersocket list ./supersocket start FTPServer ./supersocket stop FTPServer
-
-
SuperSocket ServerManager
你可以使用SuperSocket ServerManager 客戶端程序以圖形界面的形式來控制服務器實例。請閱讀下面文檔來學習如何使用SuperSocket ServerManager. SuperSocket ServerManager文檔
© 2018 - GetDocs.Net - Hosted by BuyVM