高并发应用场景下的负载均衡与故障转移实践,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。

相关文章
相关标签/搜索