传统C/S软件的"断骨增高"
前言:
由于院内临床业务需要高频强功能的用户界面互操作性要求,使得在HIT行业中存在大量的C/S型软件,尽管B/S软件应用范围正在扩大,但在很多场景中,C/S软件仍然顽强的生存和发展着。
不过随着行业软件开发技术水平的提升,传统的C/S的软件,也就是客户端程序直接连接数据库的模式越来越显得过时和不符合需求了。此时需要对这些C/S软件进行升级。这些C/S软件是各种开发组织(软件公司和医院信息科)花费数万人月完成的,是不可能一下子替换的,只能渐进的升级。
C/S+Web Service混合模式:
目前比较常见的模式就是C/S+WebService的混合模式。
C/S+B/S混合模式就是建立一个WEB服务器,开放大量的Web Service接口,然后让C/S客户端软件调用。WEB服务器直连数据库,而C/S客户端程序不再直接连接数据库。这样的好处主要有:
1.客户端仍然保留C/S软件具有的高频强性能的用户界面互操作性的要求。
2.客户端不用直连数据库,避免客户端的数据库配置操作,降低实施工作量。
3.只有WEB服务器直连数据库,降低系统中数据库连接数量,减轻数据库服务器的负荷。
4.一些业务功能的更新只需要更新WEB服务器程序,Web Service接口保持不变,降低更新客户端程序文件的概率,这有利于运维。
不过这种混合模式加大了开发工作量,主要有
1.WEB服务器需要频繁的定义和修改Web Service。使得客户端程序需要频繁的更新WEB引用,需要两头修改代码。导致客户端软件的重新编译和部署。
2.调试不方便,在调试客户端程序时断点进入到WEB服务器程序中比较麻烦。单步调试不能一通到低,本来使用方便的“编辑并继续”等调试手段无法使用。
在现代软件项目中,软件开发和调试工作量(包括公司内部开发和驻场开发)占据了整个工作量的很大的一部分。很多项目的失败是源自软件开发不力。因此降低开发工作量和工作时间有利于保障项目按时完成,让开发组织的利益最大化。
“断骨增高”模式:
为了比较稳妥的升级C/S软件为混合模式,并能方便的开发和调试,在此笔者提出了对传统C/S软件进行“断骨增高”的手段进行升级。
“断骨增高”原本是一种医学手术。是根据肢体组织在一定应力刺激下再生的生物学原理,应用骨科截骨术,在小腿或大腿把已经闭合的骨生长线重新“打开”,并在体外安装一种具有牵伸作用的肢体延长器,根据每个人组织再生能力和特点,每天以0.5毫米至1毫米的速度将肢体缓慢地延长。
而笔者将利用一种透明代理的软件技术,对传统的C/S软件进行模块整理、内部分层,然后软件模块分裂,但仍然保持软件模块之间的调用关系,将传统的C/S软件改造成B/S,C/S混合模式的软件。让传统软件重新焕发活力,延长系统寿命。其原理如下:
首先传统的C/S程序结构如下:
这种结构下,UI模块、业务逻辑模块、数据库处理模块相互纠缠,到处都有直接访问数据库的代码,混乱不堪。
为此,我们需要首先改造,整改之后的程序结构如下:
这种结构下,UI模块、业务逻辑模块、数据库处理模块之间分离比较清晰,只有数据库处理模块才能直接连接数据,其他模块尽量少的连接数据库。
不过考虑到实际情况,不能要求太高,但底线是UI模块必须分离开来,业务逻辑模块和数据库处理模块不能低成本的分离开来那也能凑合着继续,但是UI模块绝对不能直接连接数据库。UI模块不能清晰分离出来,后续操作也就无法执行了。
对C/S软件的内部功能模块分层后,这时候我们就用到一种叫透明代理的机制。在.NET开发中就是调用类型System.Runtime.Remoting.Proxies.RealProxy中的功能。原理图如下:
其工作步骤如下:
1.透明代理客户端针对业务逻辑模块或数据库处理模块这些底层功能模块创建透明代理对象,并将透明代理对象替换掉真正的底层功能模块推送到UI等上层模块前面。
2.上层模块是无法区别透明代理和真实的功能模块,因为两者具有相同的函数签名,并能进行类型强制转换。
3.当上层模块调用透明代理的成员函数时,透明代理客户端会立刻截断函数的调用,将函数名和参数值二进制序列化成一个数据包,然后通过HTTP协议发往WEB服务器的透明代理服务器端模块。
4.WEB服务器接受数据包,进行二进制反序列化,获得其中的模块名、函数名和参数值。然后创建相应的功能模块并调用其函数。在ASP.NET开发中就是调用System.Runtime.Remoting.RemotingServices类型的ExecuteMessage()方法。
5.在WEB服务器端内部真实的功能模块运行后得到的结果返回给透明代理服务器端,然后被二进制序列化生成一个数据包,然后作为HTTP响应发送给透明代理客户端。
6.透明代理客户端接受到的数据包并进行解析,生成返回值,然后返回给上层功能模块。上层功能模块就能欢天喜地的拿到数据进行后续处理了。
在这种模式下,为了部署和维护方便,我们可以让客户端和服务器端使用一样的程序文件。客户端虽然加载了底层功能模块,但这些模块是废弃不用的;而服务器端加载了UI层等上层模块,也是废弃不用的。不过这些都不影响整个系统的使用。通过这种模式,我们实现了传统C/S软件的断骨增高。实现了一种分布式运算,大大提高C/S软件的灵活度和伸缩性。
而且这种模式下,更改底层功能模块只需要改一处,不需要两边同时更改,降低工作量。
另外这个过程统一了数据传输通道,可以很方便的加上自定义的数据验证、压缩和加密。而实现自定义的Web Service传输过程比较复杂。
更进一步的,经过灵活配置,可以让C/S软件同时支持透明代理远程调用和真实的本地调用。以下是客户端不采用透明代理而使用本地真实功能模块的情况。此时WEB服务器是停用的。而且客户端是直连数据库。
这种模式是非常适合软件开发和调试过程的。可以单步调试一通到底,“编辑并继续”也能随时执行。
这样我们的软件具有开发模式和运行模式。开发模式非常适合程序员的软件开发和调试过程;运行模式适合生产环境下的运行,具有强大的伸缩性和可维护性。两头都方便,按需配置,有利于快速开发和部署。
推广:
这种技术方案的推广也会对整个HIT行业带来巨大的利益。业界已经运行着大量的C/S软件,它们是各种开发组织投入数万人月编写数千万行的代码,并和用户一起历经数年时间反复磨合而得到的。这些软件凝聚了客户大量的投资,不能随便抛弃。
而我们可以采用“断骨增高”来改良这些C/S软件,在无需重大修改的情况下显著增加软件的可伸缩性和可维护性,重用历史代码,大幅延长软件的运行寿命,保护客户投资,创造巨大的经济效益。
我们都昌公司专门进行底层技术研究和输出,研制出“断骨增高”这种非常接地气的技术方案,然后反复重构优化和产品化,并制定一套开发指南,然后融入到“都昌赋能框架”中,可以针对所有基于.NET平台的C/S程序进行优化,帮助开发组织利用已有技术力量开发出高度可伸缩性和可维护性的软件,增强解决问题的能力,提高市场竞争力。
posted on 2018-03-12 16:24 袁永福 电子病历,医疗信息化 阅读(653) 评论(0) 编辑 收藏 举报