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

1、前言

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

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

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

2、關於AgileEAS.NET SOA中間件的分佈式結構

     AgileEAS.NET SOA中間件平臺吸吸引人的一個特點就是其分佈式架構體系,其能夠基於高層的WCF協議和底層的.NET Socket通訊建設統一一致的分佈式通訊服務,以下圖所示的分佈式結構:github

 

image_thumb[5]

     系統中全部的客戶端業務處理請求都經由AppServer處理以後返回結果給客戶端,這個一個極其經典的SOA架構的分佈式結構。數組

     當系統的業務運行量大到一臺AppServer沒法知足狀況下,那麼咱們就要考慮縱向擴展或者橫向擴展以知足系統性能和業務響應的問題,最經常使用的選擇是橫向擴展,使用負載均衡機制以確保業務請求由多臺AppServer完成;以及對系統的可靠性要求很高的時候,由於只有一臺AppServer若是AppServer宕機了,那麼整個系統都沒法運行。咱們就必須的考慮整個系統的故障切換能力,以肯定系統的高可用性,系統的架構就會衍生爲如下結構:服務器

image_thumb[11]

     能夠對比發佈,前面架構圖之中的AppServer已經由一臺NlbServer和多臺AppServer組成的服務器組合替換,系統之中再也不存在當AppServer宕機以後系統沒法服務的問題,也解決了隨着業務量增長動態擴容的問題。網絡

3、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.exeapp

     在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之間進行負載。

4、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和AppServer一、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,客戶端程序配置完成。

5、測試驗證

     啓動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]

     當咱們恢復負載之中的任務一個節點以後,系統則能夠向使用者提供所有的業務服務。

6、聯繫咱們

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

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

     個人技術團隊成員都是合做多年的老朋友,由於這個平臺是免費的,因此也沒有什麼收入,都是由程序員的那種理想與信念堅持,在此我感謝一塊兒奮鬥的朋友。

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

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

官方博客:http://eastjade.cnblogs.com

github:https://github.com/agilelab/eas

QQ:47920381

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。

相關文章
相關標籤/搜索