高併發應用場景下的負載均衡與故障轉移實踐,AgileEAS.NET SOA 負載均衡介紹與實踐

魏瓊東發表於2014-01-02

一、前言

     AgileEAS.NET SOA 中介軟體平臺是一款基於基於敏捷並行開發思想和Microsoft .Net構件(元件)開發技術而構建的一個快速開發應用平臺。用於幫助中小型軟體企業建立一條適合市場快速變化的開發團隊,以達到節省開發成本、縮短開發時間,快速適應市場變化的目的。

     AgileEAS.NET SOA中介軟體平臺提供了敏捷快速開發軟體工程的最佳實踐,通過提供大量的基礎支撐功能如IOC、ORM、SOA、分散式體系及敏捷併發開發方法所支撐的外掛開發體系,以及提供了大量的實體、資料模型設計生成工具、程式碼生成工具,用於幫助中小軟體開發商快速成長。

     AgileEAS.NET平臺充分把握目前軟體行業快速發展的新趨勢,基於敏捷並行開發、快速適應市場這樣淳樸的軟體工程實踐,採用業界廣泛使用的Microsoft .Net構件(元件)開發技術實踐了這種開發思想,幫助軟體企業實現“敏捷變化、快速適合”的目標,從而幫助軟體企業在激烈的市場競爭中贏得先機並獲得更高的回報。

二、關於AgileEAS.NET SOA中介軟體的分散式結構

     AgileEAS.NET SOA中介軟體平臺吸吸引人的一個特色就是其分散式架構體系,其可以基於高層的WCF協議和底層的.NET Socket通訊建設統一一致的分散式通訊服務,如下圖所示的分散式結構:

 

image_thumb[5]

     系統中所有的客戶端業務處理請求都經由AppServer處理之後返回結果給客戶端,這個一個極其經典的SOA架構的分散式結構。

     當系統的業務執行量大到一臺AppServer無法滿足情況下,那麼我們就要考慮縱向擴充套件或者橫向擴充套件以滿足系統效能和業務響應的問題,最常用的選擇是橫向擴充套件,使用負載均衡機制以確保業務請求由多臺AppServer完成;以及對系統的可靠性要求很高的時候,因為只有一臺AppServer如果AppServer當機了,那麼整個系統都無法執行。我們就必須的考慮整個系統的故障切換能力,以確定系統的高可用性,系統的架構就會衍生為以下結構:

image_thumb[11]

     可以對比釋出,前面架構圖之中的AppServer已經由一臺NlbServer和多臺AppServer組成的伺服器組合替換,系統之中不再存在當AppServer當機之後系統無法服務的問題,也解決了隨著業務量增加動態擴容的問題。

三、AgileEAS.NET SOA平臺NLB支援

     AgileEAS.NET SOA中介軟體平臺的AppServer支援程式為EAS.SOA.Server.exeEAS.SOA.Server.x64.exe,其中EAS.SOA.Server.exe為32位服務程式,EAS.SOA.Server.x64.exe為64位服務程式。

     AppServer能在同一個程式之內同時支援Socket通訊和WCF通訊,即能同樣的業務同步提供Socket和WCF通訊方式,WCF通訊提供http和net.tcp通道的訪問,客戶端應用使用何種通訊方式由客戶段程式決定。

     AgileEAS.NET SOA中介軟體平臺的在5.0版本之後增加了一個應用負載均衡服務程式EAS.NLB.Server,也同樣提供了32位與64位的服務應用程式EAS.NLB.Server.exeEAS.NLB.Server.x64.exe

     在AgileEAS.NET SOA中介軟體平臺5.0版本之中為AppServer、NLB.Server提供了執行監控程式,NLB.Server的服務監控程式同時提供了NLB.Server的配置管理功能:

EVR~2]%N9Q~23S(CCT3]Q_C_thumb[2]

     負載節點監控,會監控NLBServer後掛接的所有AppServer清單以及各個AppServer伺服器的工作狀態,是線上還是離線,線上的則能向客戶端提供服務,如果離線了則表示不能向客戶端提供服務了,在NLBServer負載過程之中,只會在線上的AppServr之間進行負載。

四、AgileEAS.NET NLBServer配置案例

     在第三節我們已經對NLB做過一些簡單的介紹,接下來我們以DrugShop案例環境為基礎例項演示一下如何在應用環境之中啟用NLBServer支援:

     首先我們簡單規劃一下測試環境:

image_thumb[16]

     接下為我們一一配置,首先,我們參考AgileEAS.NET SOA 中介軟體平臺5.2版本下載、配置學習(二):配置WinClient分散式執行環境一文配置好一個AppServer例項AppServer1,埠號設定Socket:6706,Wcf-tcp:6707,Wcf-http:6708:

   1: <appserver>
   2:   <channel>
   3:     <wcf enable="true">
   4:       <config tcpPort="6707" httpPort="6708"/>
   5:       <serviceThrottling maxConcurrentCalls="128" maxConcurrentInstances="128" maxConcurrentSessions="256"/>
   6:       <wcfServices>
   7:         <wcfService key="Key" type="TValue"/>
   8:       </wcfServices>
   9:     </wcf>
  10:     <socket enable ="true">
  11:       <config tcpPort="6706"/>
  12:       <serviceThrottling maxConcurrence="1024"/>
  13:       <socketServices>
  14:         <socketService key="IMSocketService" type="AgileIM.Service.IMSocketService,AgileIM.Service"/>
  15:       </socketServices>
  16:     </socket>
  17:   </channel>
  18:   <appServices>
  19:     <appService key="Key" type="TValue"/>
  20:   </appServices>
  21: </appserver>

     然後複製配置好的AppServer目錄到其他地方建立AppSerer2,埠資訊修改為Socket:6706,Wcf-tcp:6707,Wcf-http:6708:

   1: <channel>
   2:   <wcf enable="true">
   3:     <config tcpPort="6807" httpPort="6808"/>
   4:     <serviceThrottling maxConcurrentCalls="128" maxConcurrentInstances="128" maxConcurrentSessions="256"/>
   5:     <wcfServices>
   6:       <wcfService key="Key" type="TValue"/>
   7:     </wcfServices>
   8:   </wcf>
   9:   <socket enable ="true">
  10:     <config tcpPort="6806"/>
  11:     <serviceThrottling maxConcurrence="1024"/>
  12:     <socketServices>
  13:       <socketService key="IMSocketService" type="AgileIM.Service.IMSocketService,AgileIM.Service"/>
  14:     </socketServices>
  15:   </socket>
  16: </channel>
  17: <appServices>
  18:   <appService key="Key" type="TValue"/>
  19: </appServices>
  20: appserver>

     同樣複製AppServer目錄配置NlbServer,NlbServer服務目前沒有配置工具,只能自己修改配置檔案EAS.NLB.Server.exe.config或者EAS.NLB.Server.x64.exe.config:

   1: <?xml version="1.0"?>
   2: <configuration>
   3:   <configSections>
   4:     <section name="eas" type="EAS.ConfigHandler,EAS.MicroKernel"/>
   5:   </configSections>
   6:   <!--支援混合程式集-->
   7:   <startup useLegacyV2RuntimeActivationPolicy="true">
   8:     <supportedRuntime version="v4.0"/>
   9:   </startup>
  10:   <eas>
  11:     <configurations>
  12:       <item name="Key"  value="Value"/>
  13:     </configurations>
  14:     <nlbserver>
  15:       <config>
  16:         <keepAlive timeSpan="6" chnanel="WCF"/>
  17:       </config>
  18:       <channel>
  19:         <wcf enable="true">
  20:           <config tcpPort="6607" httpPort="6608"/>
  21:           <serviceThrottling maxConcurrentCalls="128" maxConcurrentInstances="128" maxConcurrentSessions="256"/>
  22:           <wcfServices>
  23:             <wcfService key="Key" type="TValue"/>
  24:           </wcfServices>
  25:         </wcf>
  26:         <socket enable ="true">
  27:           <config tcpPort="6606" gatewayStyle="NetPacket"/>
  28:           <serviceThrottling maxConcurrence="10000"/>
  29:         </socket>
  30:       </channel>
  31:     </nlbserver>
  32:     <objects>
  33:       <!--NLB日誌記錄-->
  34:       <object name="Logger" assembly="EAS.MicroKernel" type="EAS.Loggers.TextLogger" LifestyleType="Singleton">
  35:         <property name="Path" type="string" value="..\logs" />
  36:       </object>
  37:     </objects>
  38:   </eas>
  39:   <startup>
  40:     <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/>
  41:   </startup>
  42: </configuration>

     配置其埠號為6606,Wcf-tcp:6607,Wcf-http:6608,配置完成後參考AgileEAS.NET SOA 中介軟體平臺5.2版本下載、配置學習(二):配置WinClient分散式執行環境一文編寫AppServer服務的安裝、解除安裝和控制檯啟動指令碼。

     NLBServer的安裝解除安裝和控制檯啟動指令碼類似,都是由EAS.NLB.Server.exe -引數組成,只不過,EAS.NLB.Server只能支援在一臺伺服器安裝一個例項,即同一臺服務不充許像AppServer一樣安裝多個實現,以下是指令碼示例:

   1: @rem 安裝NLB服務
   2: EAS.NLB.Server.x64.exe -i
   3:  
   4: @rem 解除安裝NLB服務
   5: EAS.NLB.Server.x64.exe -u
   6:  
   7: @rem 控制檯啟動NLB服務
   8: EAS.NLB.Server.x64.exe -run
   9: pause

     OK,我們啟動NLBServer和AppServer1、AppServer2:

Q%}BF5G[24(YQ5S}WJ5U64N_thumb[2]

     接下來我們在客戶端資料夾之中啟動“負載均衡監控”程式EAS.NLB.Monitor.exe配置負載均衡服務的負載節點:

1EM465}RP@9MM~Z}1~536WX_thumb[2]

    在服務連線之中選擇新建連線,彈出新建連線對話方塊:

G{M}}~FK}%N]1%U3]91RN)9_thumb[2]

    修改連線名為nlbServer,伺服器為127.0.0.1,即連線本機nlbserver,實際情況之中請根據實際情況配置,埠號填入前面配置的NlbServer埠引數,我們此處選擇以wcf-tcp連線,埠配置為6607,然後確定儲存配置,並且進入“負載均衡監控”主介面:

ORHRE8PQAQ_QB$%6P)S3W]O_thumb[2]

     “負載均衡監控”第一個介面為負載均衡伺服器的CPU、記憶體、網路、磁碟等各種資源引數,供管理人員參考,我們切換到負載節點監控:

KCWX$_PF%U~26QL91(S01@D_thumb[2]

     在空白區域右鍵開啟快捷選單點=>"新增節點":

67J016R(545M1K`}](F@WQC_thumb[2]

     根據AppServer引數新增負載節點資訊,確定後儲存負載節點資訊,使用同樣的方法新增AppSever2節點,完成後如下圖:

854$8TM3F0@9KHCY29GQ9}X_thumb[2]

     也可以選擇直接修改配置配置負載節點資訊,負載節點資訊儲存在NlbServer工作目錄中的“NLB.config”檔案:

   1: <?xml version="1.0" encoding="utf-16"?>
   2: <NLB xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
   3:   <items>
   4:     <NlbWorkItem>
   5:       <host>127.0.0.1</host>
   6:       <wcfChannel>
   7:         <HttpPort>6708</HttpPort>
   8:         <TcpPort>6707</TcpPort>
   9:       </wcfChannel>
  10:       <socketChannel>
  11:         <TcpPort>6706</TcpPort>
  12:       </socketChannel>
  13:       <enabled>true</enabled>
  14:       <runing>true</runing>
  15:     </NlbWorkItem>
  16:     <NlbWorkItem>
  17:       <host>127.0.0.1</host>
  18:       <wcfChannel>
  19:         <HttpPort>6808</HttpPort>
  20:         <TcpPort>6807</TcpPort>
  21:       </wcfChannel>
  22:       <socketChannel>
  23:         <TcpPort>6806</TcpPort>
  24:       </socketChannel>
  25:       <enabled>true</enabled>
  26:       <runing>false</runing>
  27:     </NlbWorkItem>
  28:   </items>
  29: </NLB>

     OK,現在已經完成了對負載均衡的配置,接下來我們配置客戶端程式“DrugShop.Main.exe”的連線資訊,可以選擇由配置工具生成,也可以選擇手工書寫,定義為SOA分散式環境下wcf-tcp連線,連線埠為127.0.0.1:6607(NLBServer),配置檔案如下:

   1: <?xml version="1.0" encoding="utf-8"?>
   2: <configuration>
   3:   <configSections>
   4:     <section name="eas" type="EAS.ConfigHandler,EAS.MicroKernel" />
   5:   </configSections>
   6:   <!--SQLite執行必需-->
   7:   <startup useLegacyV2RuntimeActivationPolicy="true">
   8:     <supportedRuntime version="v4.0"/>
   9:   </startup>
  10:   <eas>
  11:     <configurations>
  12:       <item name="Key" value="Value" />
  13:     </configurations>
  14:     <objects>
  15:       <!--分散式通訊元件。-->
  16:       <object name="ServiceBridger" assembly="EAS.Distributed" type="EAS.Distributed.ServiceBridger" LifestyleType="Thread" >
  17:         <property name="ServiceName" type="string" value="EAS.RMI.Service" />
  18:       </object>
  19:       <object name="DataAccessor" assembly="EAS.Distributed" type="EAS.Distributed.DataAccessor" LifestyleType="Thread" >
  20:         <property name="ServiceBridger" type="object" value="ServiceBridger" />
  21:       </object>
  22:       <object name="OrmAccessor" assembly="EAS.Distributed" type="EAS.Distributed.OrmAccessor" LifestyleType="Thread" >
  23:         <property name="ServiceBridger" type="object" value="ServiceBridger" />
  24:         <property name="DataAccessor" type="object" value="DataAccessor" />
  25:       </object>
  26:       <!--日誌管理-->
  27:       <object name="Logger" assembly="EAS.MicroKernel" type="EAS.Loggers.TextLogger" LifestyleType="Singleton" />
  28:       <!--資源-->
  29:       <object name="EAS.Explorer.Resource" assembly="DrugShop.Res" type="DrugShop.Res.Resources" LifestyleType="Singleton" />
  30:     </objects>
  31:     <services>
  32:       <service name="EAS.RMI.Service" service-type="WcfService" singleton="true" url="net.tcp://127.0.0.1:6607/eas/services/EAS.RMIService" />
  33:     </services>
  34:   </eas>
  35: </configuration>

     OK,客戶端程式配置完成。

五、測試驗證

     啟動DrugShop.Main.exe,可以選擇啟動多個客戶端程式例項,可以看到以控制檯執行的兩個服務例項都有不同程式的請求響應:

0L`$I$6L673RQT~E``F~P7Q_thumb[2]

     我們可以看到,客戶端的業務請求被NLBServer進行了有效的負載,當我們隨便停止其他任務一個AppServer,我們可以通過“負載均衡監控”程式看到其處於離線狀態:

3G~)8E1DHD0AKGF1FN4JA(X_thumb[2]

     在實際專案之中可以是某一臺AppServer當機了或者人為的進行某種維護升級活動,在這個時間,所有的客戶端程式的所有業務操作都是可以的,從這一點我們可以看出,AppServer被NLBServer進行了有效的故障轉移,有效的提高了系統的高可用性

     如果所有的AppServer都離線了,即所有AppServer都當機了,如下圖:

CYD9B}K{0P%`XLC6P~(YV41_thumb[2]

     那麼這個時間,系統就不能提供任務的服務了,當我們在客戶端執行任何操作都會報錯:

1L_[QARM1]~)5RU9Z%WVEK5_thumb[2]

     當我們恢復負載之中的任務一個節點之後,系統則可以向使用者提供全部的業務服務。

六、聯絡我們

     為完善、改進和推廣AgileEAS.NET而成立了敏捷軟體工程實驗室,是一家研究、推廣和發展新技術,並致力於提供具有自主智慧財產權的業務基礎平臺軟體,以及基於業務基礎平臺開發的管理軟體的專業軟體提供商。主要業務是為客戶提供軟體企業研發管理解決方案、企業管理軟體開發,以及相關的技術支援,管理及技術諮詢與培訓業務。

     AgileEAS.NET SOA中介軟體平臺自2004年秋呱呱落地一來,我就一直在逐步完善和改進,也被應用於保險、醫療、電子商務、房地產、鐵路、教育等多個應用,但一直都是以我個人在推廣,2010年因為我辭職休息,我就想到把AgileEAS.NET推向市場,讓更多的人使用。

     我的技術團隊成員都是合作多年的老朋友,因為這個平臺是免費的,所以也沒有什麼收入,都是由程式設計師的那種理想與信念堅持,在此我感謝一起奮鬥的朋友。

團隊網站:http://www.agilelab.cn

AgileEAS.NET網站:http://www.smarteas.net

官方部落格:http://eastjade.cnblogs.com

QQ:47920381,AgileEAS.NET

QQ群:113723486(AgileEAS SOA 平臺)/上限1000人

199463175(AgileEAS SOA 交流)/上限1000人

212867943(AgileEAS.NET研究)/上限500人

147168308(AgileEAS.NET應用)/上限500人

172060626(深度AgileEAS.NET平臺)/上限500人

116773358(AgileEAS.NET 平臺)/上限500人

125643764(AgileEAS.NET探討)/上限500人

193486983(AgileEAS.NET 平臺)/上限500人

郵件:james@agilelab.cn,mail.james@qq.com,

電話:18629261335。

相關文章