回《【开源】EFW框架系列文章索引》 html
EFW框架源代码下载V1.3:http://pan.baidu.com/s/1c0dADO0算法
EFW框架实例源代码下载:http://pan.baidu.com/s/1eQCc69G数据库
前言:之前的系统都是直接客户端直连数据库服务器,后来考虑到服务器的安全性、数据库链接数的限制、分布能力差等问题,特别是那几年中间件、SOA、ESB等炒得比较火,为了跟上时代脚本有必要开发一个中间件,把后台逻辑业务在中间件中运行。刚开始考虑过WebServices,可是须要部署在IIS中,还有性能问题都比较严重,试了一下效果不是很好,后来以为WCF不错,但一直没有找到好的方式怎么与现有的架构结合,若是把业务代码全改写成WCF服务方式提供给客户端调用,感受工做量很大,光看着WCF那些配置文件就头大,特别是破坏了现有程序架构,这样使用WCF对现有框架也没什么意义。后来在完善Web版框架中从HttpHandlers中找到了思路,发现没有必要把业务功能作成WCF服务,而WCF服务只是用来实现客户端与后台业务的通信,这样中间件只须要一个WCF服务用来链接客户端控制器与服务端控制器,把Winform版控制器层也分拆成wcfclientController与wcfController。这样原来的程序结构基本没变,保证了Web版、Winform版、WCF版三种类型系统的程序架构,编码风格等都一致,让EFW框架全面支持多种系统开发;api
本文要点:缓存
1.WCFHosting服务主机介绍安全
2.WCFHosting服务主机实现服务器
3.WCFHosting服务主机必须解决的两个问题网络
4.总结架构
WCFHosting程序只是一个WCF自托管宿主,固然你能够修改此程序让WCF服务托管在IIS或Windows Services中,WCFHosting程序只有三个核心功能:WCFHandlerService服务用来实现客户端与服务端通信,RemoteLoader用来实现访问对应的服务端控制器程序,Router服务用来实现中间件的链接路由和负载均衡。负载均衡
源代码项目解决方案目录:
WCFHosting程序界面
配置文件说明,包括客户端的App.Config和服务端的App.Config两个配置文件
1)客户端的App.Config
主要是ClientType参数和WCF_endpoint参数的设置,ClientType必须设置为WCFClient,WCF_endpoint设置为WCF地址;
2)服务端的App.Config
1)FrmHosting.cs界面,启动、中止WCF服务
启动的时候能够根据设置里的配置开启相应功能,好比:
显示调试信息,那么每一个客户端每次与服务端交互的内容都会在日志界面显示出来
开启WCF服务,若是此主机是做为系统的中间件那么必须勾上此处
开启路由服务,若是此主机设置为路由器那么必须勾上此处
开启心跳检测,正式使用的系统必须勾上次处,若是是开发阶段的时候能够不勾,便于调试程序
2)WCFHandlerService服务,客户端经过调用此wcf服务链接、执行、断开与中间件通信
WCFHandlerService服务的IapiWCFHandlerService契约使用了CallbackContract回调操做,这样实现了客户端与服务端之间双向通信,服务端能够主动向客户端发送数据,这是Web程序没有的功能,Web程序只能经过定时访问来实现此功能。
WCFHandlerService服务对象有5个核心方法,
CreateDomain:打开客户端(EFWWin.exe程序)会调用此方法在服务端建立在线用户
ProcessRequest:客户端调用此方法访问服务端控制器代码
UnDomain:客户端(EFWWin.exe程序)退出前调用此方法清除服务端在线用户
Heartbeat:客户端像心跳同样,调用此方法定时向服务端发送在线状态
SendBroadcast:服务端向客户端发送消息
3)Loader对象,管理每一个链接的客户端,并经过反射调用wcf控制器
4)BaseWCFClientController客户端控制器基类
5)BaseWCFController服务端控制器基类
6)JsonWCFController客户端与服务端数据交换基于Json字符串格式
7)Router服务,中间件路由功能及负载均衡实现
问题一:因为网络中断问题等问题引发通信错误,再恢复以后必须能够继续使用,不须要关闭系统从新登陆系统;再就是wcf服务器主机必须反馈此客户机是断开状态;
问题二:因为WCF主机异常奔溃,再重启后能从新接管之前链接到此主机的全部客户端链接;不须要客户端退出系统从新启动;
解决问题的办法:
问题一,增长心跳机制,让客户端定时向wcf主机发送一条消息,若是超时没有接收到就证实客户端断开了链接;解决网络中断客户端自动重连服务端,首先客户端设置为取消服务器凭据认证,再就是客户端调用重连方法;
<netTcpBinding> <binding name="netTcpExpenseService_ForSupplier" closeTimeout="00:01:00" openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00" transactionFlow="false" transferMode="Buffered" transactionProtocol="OleTransactions" hostNameComparisonMode="StrongWildcard" listenBacklog="10" maxBufferPoolSize="2147483647" maxBufferSize="2147483647" maxConnections="10" maxReceivedMessageSize="2147483647"> <readerQuotas maxDepth="32" maxStringContentLength="2147483647" maxArrayLength="2147483647" maxBytesPerRead="4096" maxNameTableCharCount="16384" /> <reliableSession ordered="true" inactivityTimeout="00:10:00" enabled="false" /> <security mode="None"> <transport clientCredentialType="Windows" protectionLevel="EncryptAndSign" /> <message clientCredentialType="Windows" /> </security> </binding> </netTcpBinding>
/// <summary> /// 从新链接wcf服务 /// </summary> /// <param name="mainfrm"></param> public static void ReConnectionWCFService(IClientService mainfrm) { try { NetTcpBinding binding = new NetTcpBinding("NetTcpBinding_WCFHandlerService"); //binding.OpenTimeout = TimeSpan.FromSeconds(10); //binding.TransferMode = TransferMode.Buffered; DuplexChannelFactory<IapiWCFHandlerService> mChannelFactory = new DuplexChannelFactory<IapiWCFHandlerService>(mainfrm, binding, System.Configuration.ConfigurationSettings.AppSettings["WCF_endpoint"]); IapiWCFHandlerService wcfHandlerService = mChannelFactory.CreateChannel(); using (var scope = new OperationContextScope(wcfHandlerService as IContextChannel)) { var router = System.ServiceModel.Channels.MessageHeader.CreateHeader("routerID", myNamespace, AppGlobal.cache.GetData("routerID").ToString()); OperationContext.Current.OutgoingMessageHeaders.Add(router); wcfHandlerService.Heartbeat(AppGlobal.cache.GetData("WCFClientID").ToString()); } if (AppGlobal.cache.Contains("WCFService")) AppGlobal.cache.Remove("WCFService"); AppGlobal.cache.Add("WCFService", wcfHandlerService); //开启发送心跳 //if (timer == null) // StartSendWCFHeartbeat(); //else // timer.Start(); } catch { } }
问题二,必须解决中间件可以把缓存的客户端信息进行持久化,从新启动中间件又能加载非正常退出的客户端信息;
WCF中间件基本功能都已具有,实现了客户端与服务端的通信,实现服务端分布式部署与负载均衡。但中间件仍是很是简陋的,如持久化客户端链接数据、更加灵活的负载均衡算法等还有许多功能须要不断完善。中间件路由与负载均衡的实现下一章详细讲解。