c# 说说开发通用通信库,尤其是分布式服务的通信
来,牛皮需要吹起,IT行业需要自娱自乐。开篇吹牛。。。。。
现在我们通信真是各种各样,各种组件,但是就我的看法,功能越完善,封装越完善,牺牲的性能可能就越大,代码量就越大。
当然这不能阻挡IT大军的脚步,那我们一套软件上线后怎么办,软件到中途发现通信组件有问题怎么办,怎么去改?如果是多部门,多单位协作怎么办?
所以面对通用的模块处理时,就需要解决相关的问题,如果在可以预见的范围,你的通信仅仅自己用,这个项目用,用于不会改,那就无所谓了;这里涉及一个软件开发矛盾。你想要要灵活,那么意味着你的配置多,代码多,需要各种判断,你的代码就多了很多分支,性能可能就低了。相反,你写的越死,代码可能就越少,分支少,性能可能高。如何在项目中控制,需要根据自己的业务去预判,预判不等于全对,但是如果你是项目负责人,那就可以为大家减少重复工作。
废话完了,给大家一个通信模型,其实就是一个接口库。给大家提供思路。
1.定义客户端通信接口, ISocketClient<TData>,解决客户端通信
2.定义服务端通信接口, ISocketServer<TData>,解决服务端通信
3.定义一个特写NetProtocol,里面有一个名称字段。
4.定义一个接收数据的委托和传递给业务层的数据类NetChannel。
5.定义一个通信配置类TransferConfig,静态类,里面就一个属性,表示传输组件的dll文件目录
6.定义一个组件加载类TransferDLL,动态加载通信组件,找到客户端,服务端的类对象
7.定义一个通信对象的创建类NetFactory,解决通信对象创建问题
具体说说:
有了以上的接口定义库,可以动态加载通信组件,我们在使用时,通过NetFactory创建不同通信对象,
原理:在NetFactory中提供创建客户端和服务端的通信对象,返回的都是我们定义的通信接口对象。
在创建方法中,需要你传送一个名字,这个名字就是你通信组件的名字。
例如:
我们使用dotnetty,你们我在实现通信的项目中,客户端类NettyClient继承ISocketClient,同时在NettyClient类上使用特性NetProtocol,比如是这样:NetProtocol(“netty_client”),那么创建客户端对象时,传入名称“netty”即可,这样通信对象就建立了。;服务端一样,服务端名称就是netty_server.
在软件的最外层,只需订阅配置,采用的传输组件名称,即可启用不同的传输组件。还可以动态替换,只要你的配置是动态加载的。
多说一句,我们的配置如果要达到动态,一般是采用什么方法呢?
1.定时重新加载,每1天或者几个小时,重新加载一次设置的配置。然后重新处理。
2.c#提供了文件监视,发现文件动了,简单的比较下文件,采用不同处理
3.你的程序提供简单的文件替换升级功能。
例如:设置一个目录,程序定时监测或者直接监视目录,发现有新的配置文件,就说明你升级了配置文件,监测文件进行处理。
项目地址:
https://github.com/jinyuttt/StremCloud.git
其中的SrvNetSocket项目就是通信接口定义。