高并发应用场景下的负载均衡与故障转移实践,AgileEAS.NET SOA 负载均衡介绍与实践
一、前言
AgileEAS.NET SOA 中间件平台是一款基于基于敏捷并行开发思想和Microsoft .Net构件(组件)开发技术而构建的一个快速开发应用平台。用于帮助中小型软件企业建立一条适合市场快速变化的开发团队,以达到节省开发成本、缩短开发时间,快速适应市场变化的目的。
AgileEAS.NET SOA中间件平台提供了敏捷快速开发软件工程的最佳实践,通过提供大量的基础支撑功能如IOC、ORM、SOA、分布式体系及敏捷并发开发方法所支撑的插件开发体系,以及提供了大量的实体、数据模型设计生成工具、代码生成工具,用于帮助中小软件开发商快速成长。
AgileEAS.NET平台充分把握目前软件行业快速发展的新趋势,基于敏捷并行开发、快速适应市场这样淳朴的软件工程实践,采用业界广泛使用的Microsoft .Net构件(组件)开发技术实践了这种开发思想,帮助软件企业实现“敏捷变化、快速适合”的目标,从而帮助软件企业在激烈的市场竞争中赢得先机并获得更高的回报。
二、关于AgileEAS.NET SOA中间件的分布式结构
AgileEAS.NET SOA中间件平台吸吸引人的一个特色就是其分布式架构体系,其可以基于高层的WCF协议和底层的.NET Socket通信建设统一一致的分布式通信服务,如下图所示的分布式结构:
系统中所有的客户端业务处理请求都经由AppServer处理之后返回结果给客户端,这个一个极其经典的SOA架构的分布式结构。
当系统的业务运行量大到一台AppServer无法满足情况下,那么我们就要考虑纵向扩展或者横向扩展以满足系统性能和业务响应的问题,最常用的选择是横向扩展,使用负载均衡机制以确保业务请求由多台AppServer完成;以及对系统的可靠性要求很高的时候,因为只有一台AppServer如果AppServer宕机了,那么整个系统都无法运行。我们就必须的考虑整个系统的故障切换能力,以确定系统的高可用性,系统的架构就会衍生为以下结构:
可以对比发布,前面架构图之中的AppServer已经由一台NlbServer和多台AppServer组成的服务器组合替换,系统之中不再存在当AppServer宕机之后系统无法服务的问题,也解决了随着业务量增加动态扩容的问题。
三、AgileEAS.NET SOA平台NLB支持
AgileEAS.NET SOA中间件平台的AppServer支持程序为EAS.SOA.Server.exe或EAS.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.exe或EAS.NLB.Server.x64.exe。
在AgileEAS.NET SOA中间件平台5.0版本之中为AppServer、NLB.Server提供了运行监控程序,NLB.Server的服务监控程序同时提供了NLB.Server的配置管理功能:
负载节点监控,会监控NLBServer后挂接的所有AppServer清单以及各个AppServer服务器的工作状态,是在线还是离线,在线的则能向客户端提供服务,如果离线了则表示不能向客户端提供服务了,在NLBServer负载过程之中,只会在在线的AppServr之间进行负载。
四、AgileEAS.NET NLBServer配置案例
在第三节我们已经对NLB做过一些简单的介绍,接下来我们以DrugShop案例环境为基础实例演示一下如何在应用环境之中启用NLBServer支持:
首先我们简单规划一下测试环境:
接下为我们一一配置,首先,我们参考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:
接下来我们在客户端文件夹之中启动“负载均衡监控”程序EAS.NLB.Monitor.exe配置负载均衡服务的负载节点:
在服务连接之中选择新建连接,弹出新建连接对话框:
修改连接名为nlbServer,服务器为127.0.0.1,即连接本机nlbserver,实际情况之中请根据实际情况配置,端口号填入前面配置的NlbServer端口参数,我们此处选择以wcf-tcp连接,端口配置为6607,然后确定保存配置,并且进入“负载均衡监控”主界面:
“负载均衡监控”第一个界面为负载均衡服务器的CPU、内存、网络、磁盘等各种资源参数,供管理人员参考,我们切换到负载节点监控:
在空白区域右键打开快捷菜单点=>"添加节点":
根据AppServer参数添加负载节点信息,确定后保存负载节点信息,使用同样的方法添加AppSever2节点,完成后如下图:
也可以选择直接修改配置配置负载节点信息,负载节点信息存储在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,可以选择启动多个客户端程序实例,可以看到以控制台运行的两个服务实例都有不同程序的请求响应:
我们可以看到,客户端的业务请求被NLBServer进行了有效的负载,当我们随便停止其他任务一个AppServer,我们可以通过“负载均衡监控”程序看到其处于离线状态:
在实际项目之中可以是某一台AppServer宕机了或者人为的进行某种维护升级活动,在这个时间,所有的客户端程序的所有业务操作都是可以的,从这一点我们可以看出,AppServer被NLBServer进行了有效的故障转移,有效的提高了系统的高可用性。
如果所有的AppServer都离线了,即所有AppServer都宕机了,如下图:
那么这个时间,系统就不能提供任务的服务了,当我们在客户端执行任何操作都会报错:
当我们恢复负载之中的任务一个节点之后,系统则可以向使用者提供全部的业务服务。
六、联系我们
为完善、改进和推广AgileEAS.NET而成立了敏捷软件工程实验室,是一家研究、推广和发展新技术,并致力于提供具有自主知识产权的业务基础平台软件,以及基于业务基础平台开发的管理软件的专业软件提供商。主要业务是为客户提供软件企业研发管理解决方案、企业管理软件开发,以及相关的技术支持,管理及技术咨询与培训业务。
AgileEAS.NET SOA中间件平台自2004年秋呱呱落地一来,我就一直在逐步完善和改进,也被应用于保险、医疗、电子商务、房地产、铁路、教育等多个应用,但一直都是以我个人在推广,2010年因为我辞职休息,我就想到把AgileEAS.NET推向市场,让更多的人使用。
我的技术团队成员都是合作多年的老朋友,因为这个平台是免费的,所以也没有什么收入,都是由程序员的那种理想与信念坚持,在此我感谢一起奋斗的朋友。
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。
作者:魏琼东
出处:http://www.cnblogs.com/eastjade
关于作者:有13年的软件从业经历,专注于中小软件企业软件开发过程研究,通过在技术与管理帮助中小软件企业实现技术层面开源节流的目的。熟悉需求分析、企业架构、项目管理。现主要从事基于AgileEAS.NET平台的技术咨询工作,主要服务于医疗卫生、铁路、电信、物流、物联网、制造、零售等行业。如有问题或建议,请多多赐教!
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,如有问题,可以通过mail.james@qq.com 联系我,也可以加入QQ群:113723486、199463175、116773358、116773358、212867943、147168308、59827496、193486983、15118502和大家共同讨论,非常感谢。