一、前言

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.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的配置管理功能:

负载节点监控,会监控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.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。

高并发应用场景下的负载均衡与故障转移实践,AgileEAS.NET SOA 负载均衡介绍与实践的更多相关文章

  1. Kafka在高并发的情况下,如何避免消息丢失和消息重复?kafka消费怎么保证数据消费一次?数据的一致性和统一性?数据的完整性?

    1.kafka在高并发的情况下,如何避免消息丢失和消息重复? 消息丢失解决方案: 首先对kafka进行限速, 其次启用重试机制,重试间隔时间设置长一些,最后Kafka设置acks=all,即需要相应的 ...

  2. SSD磁盘,CPU居高不下,高并发的情况下,是不是mysql解析器耗费的cpu资源高?

    你看看我做的实验,这个user表是300多W纪录,普通磁盘下,消耗时间最多的是Copy to tmp table 0.81秒,当然在ssd下,这个可以减少很多很多的,第二高就是sending data ...

  3. 使用数据库乐观锁解决高并发秒杀问题,以及如何模拟高并发的场景,CyclicBarrier和CountDownLatch类的用法

    数据库:mysql 数据库的乐观锁:一般通过数据表加version来实现,相对于悲观锁的话,更能省数据库性能,废话不多说,直接看代码 第一步: 建立数据库表: CREATE TABLE `skill_ ...

  4. Flume-Failover Sink Processor 故障转移与 Load balancing Sink 负载均衡

    接上一篇:https://www.cnblogs.com/jhxxb/p/11579518.html 使用 Flume1 监控一个端口,其 sink 组中的 sink 分别对接 Flume2 和 Fl ...

  5. MySQL 高可用:mysql+Lvs+Keepalived 负载均衡及故障转移

    系统信息: mysql主库 mysql从库 VIP 192.168.1.150 mysql 主主同步都设置 auto-increment-offset,auto-increment-increment ...

  6. 高CPU业务场景下的任务分发方案Gearman搭建一览

      Gearman是当年LiveJournal用来做图片resize的,大家也明白图片resize是一个高CPU的操作,如果让web网站去做这个高CPU的功能,有可能会拖垮你的 web应用,那本篇我们 ...

  7. mysql 是如何保证在高并发的情况下autoincrement关键字修饰的列不会出现重复

    转载自 https://juejin.im/book/5bffcbc9f265da614b11b731/section/5c42cf94e51d45524861122d#heading-8 mysql ...

  8. 高并发下载tomcat下的文件时,发生java.net.SocketException: Connection reset解决方案

    (1)问题产生:使用500个线程并发下载tomcat工程中的一个文件时,服务器出现java.net.SocketException: Connection reset异常, 客户端出现connect ...

  9. Alibaba高并发业务秒杀系统落地实战文档,已实践某大型秒杀场景

    前言: 高并发,几乎是每个程序员都想拥有的经验.原因很简单:随着流量变大,会遇到各种各样的技术问题,比如接口响应超时.CPU load升高.GC频繁.死锁.大数据量存储等等,这些问题能推动我们在技术深 ...

随机推荐

  1. 自定义View其实很简单系列1-12

    作者: AigeStudio  http://blog.csdn.net/aigestudio 说明:文中的1/12表示12篇中的第1篇, 1/6=2/12表示12篇中的第2篇,其它类似. 自定义控件 ...

  2. PE启动菜单修改工具 MsgDiyer(GfxMenu Message制作工具) V2.0.3官方版

    MsgDiyer基本功能  1.新建message文件.修改现有message文件:2.自定义背景图片:3.制作message字体,包括行高.大小等(目前不兼容WIN7):4.自定义字库:5.导入外置 ...

  3. SpringBoot源码解析:AOP思想以及相应的应用

    spring中拦截器和过滤器都是基于AOP思想实现的,过滤器只作用于servlet,表现在请求的前后过程中:拦截器属于spring的一个组件,由spring管理, 可以作用于spring任何资源,对象 ...

  4. [bigdata] 启动CM出现 “JDBC Driver class not found: com.mysql.jdbc.Driver” 以及“Error creating bean with name 'serverLogFetcherImpl'”问题的解决方法

    问题:“JDBC Driver class not found: com.mysql.jdbc.Driver”  通过以下命令启动cm [root@hadoop1 ~]# /etc/init.d/cl ...

  5. MongoDB系列二

    简介 MongoDB是一个基于分布式文件存储的数据库.由C++语言编写.旨在为WEB应用提供可扩展的高性能数据存储解决方案.  MongoDB是一个高性能,开源,无模式的文档型数据库,是当前NoSql ...

  6. 自定义Docker容器的 hostname

    自定义Docker容器的 hostname   作者: John Deng 原创内容,欢迎传播,请注明出处:http://www.cnblogs.com/johnd/p/set-docker-host ...

  7. JS事件-事件处理程序-笔记总结ing...

    html事件处理程序:缺点-行为与结构耦合<input type="button" onclick = "diaoyong();"> dom0级事件 ...

  8. Example: Encoded SNMP Message - SNMP Tutorial

    30.11 Example Encoded SNMP Message The encoded form of ASN.1 uses variable-length fields to represen ...

  9. Ambari——大数据平台的搭建利器

    转载自http://www.ibm.com/developerworks/cn/opensource/os-cn-bigdata-ambari/ 扩展 Ambari 管理一个自定义的 Service ...

  10. AE套宗获取内环

    主要根据IPolygon4的get_InteriorRingBag方法. IGeometry geo = null; IRing exring = null; (geo as IPolygon2).Q ...