高并发应用场景下的负载均衡与故障转移实践,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推向市场,让更多的人使用。
我的技术团队成员都是合作多年的老朋友,因为这个平台是免费的,所以也没有什么收入,都是由程序员的那种理想与信念坚持,在此我感谢一起奋斗的朋友。
团队网站: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。
本文转自魏琼东博客园博客,原文链接:http://www.cnblogs.com/eastjade/p/3482717.html,如需转载请自行联系原作者
高并发应用场景下的负载均衡与故障转移实践,AgileEAS.NET SOA 负载均衡介绍与实践...相关推荐
- 高并发读场景下的利器:本地缓存+分布式缓存
本地缓存和分布式缓存并不是二者取其一甚至对立的关系,而是要结合使用:常见的电商高并发读场景下下,本地缓存存放热点数据,分布式缓存存放全量数据:当然这里有一个很重要的点,即要结合业务,本地缓存中的数据一 ...
- Python高并发应用场景下四种写入SQLite数据库的速度比较
"Python小屋"编程比赛正式开始 中国大学MOOC"Python程序设计基础"第5次开课 推荐图书: <Python程序设计基础(第2版)>,I ...
- 高并发的场景下,不能不说的限流算法
来自:会点代码的大叔 先举个例子,说明为什么要做"限流". 旅游景点通常都会有最大的接待量,不可能无限制的放游客进入,比如故宫每天只卖八万张票,超过八万的游客,无法买票进入,因为如 ...
- 深入浅出!阿里运维专家三种方法教你如何应对高并发“海啸”场景
作者:田杰,阿里云数据库高级运维专家 在数据库的日常使用中,来自应用的高并发场景并不罕见,其标志性的表现为 高新连接创建速率(CPS,比如 PHP 短连接).发送大量请求到 DB 数据库层. 如同 海 ...
- 如何处理高并发业务场景
要具备高并发的经验确实需要有实际项目,因为业务逻辑其实很容易理清,但是要在高并发的情况下如何找到业务繁忙的热点并进行优化,完全只能凭经验. 假如没有靠谱的公司,接触不到高并发的业务场景怎么办? 从处理 ...
- 引领高并发直播场景进入毫秒时代,阿里云发布超低延时直播服务
近日,阿里云上线超低延时直播服务RTS(Real-time Streaming),该服务在视频直播产品的基础上,进行全链路延时监控.传输协议改造等底层技术优化,支持千万级并发场景下的毫秒级延迟直播能力 ...
- 高并发支付场景分析及设计
一.专题分享-高并发支付场景分析及设计1.1 背景 大家好,我是20XX年加入永乐票务,之前一直负责公司票务系统的整体规划.实现.优化及改造.目前主要负责公司的基础平台.支付平台.消息平台.云平台.运 ...
- CPU占用率过高和OOM场景下如何排查问题
本文来说下CPU占用率过高和OOM场景下如何排查问题 文章目录 CPU占用率过高 OOM场景下如何排查问题 CPU占用率过高 CPU占用率过高 CPU占用率过高可以通过top命令去看占用CPU最多的J ...
- 在高并发的情况下,利用redis来处理库存超卖和遗留问题
在高并发的情况下,利用redis来处理库存超卖和遗留问题 首先现在redis中放上商品的库存数量为100间商品,在初始化一个set集合用于放秒杀成功的用户id,本用例先放进去一个id=10000的用户 ...
最新文章
- SecureCRT 6.7.1 注冊机 和谐 破解 补丁 方法
- PNAS:人类首次利用新型脑磁图可视化快速大脑信号
- 《基于张量网络的机器学习入门》学习笔记1
- pdfbox 第一页加内容_你用代码做过哪些很酷/有趣的事?
- [BZOJ5312]冒险(势能线段树)
- 今天,你精通Spring Cloud了吗?
- 比特币锚定币总锁仓量触及38亿美元 创历史新高
- 从被动到主动,换个角度看 DB
- 给 Chrome浏览器 添加 Javascript小书签,查看当前页面全部加载的javascript文件及代码片段...
- 地图投影——高斯-克吕格投影、墨卡托投影和UTM投影
- 免费 WebOffice使用
- android 怎么反编译,Android反编译工具的用法
- 基于KNN的离群点检测算法的Matlab版实现
- ps怎么更改背景图层大小_如何利用Photoshop软件修改图片尺寸的大小
- 如何自给自足获取磁力种子
- 中国大学MOOC动物遗传学试题及答案
- nacos服务注册不上
- 种群遗传学的多态性衡量参数
- [转组第10天] | Android6.0.0_r1源码编译和POC程序的编译
- 如何解决网站限制IP访问的问题
热门文章
- java直接内存为什么快_直接内存与 JVM 源码分析
- html h 不换行,css 强制不换行
- php 安装rabbitmq拓展_【RabbitMQ】——centos7安装rabbitmq教程 以及 PHP开启rabbitmq扩展...
- 公司 表名规则 TN基础表 TR关系表 TL定义表
- CSS3来绘制一个3维立体游泳圈_立体墙绘画绘制技巧来了,襄阳墙体彩绘公司介绍...
- linux卸载kodi,如何在Ubuntu上安装Kodi 18 Beta
- linux系统启动盘怎么制作工具,windows系统制作linux启动盘工具介绍
- 第十六届智能车竞赛广东省线上比赛成绩汇总
- 2021年春季学期-信号与系统-第八次作业参考答案
- 服务器装什么系统可以模拟器多开,安卓模拟器多开哪个最好 流畅不卡、省资源、群控刷机都有...