中国首个坚持原创严肃内容的健康医疗信息化新媒体
最新消息:欢迎您,亲爱的读者!您可以通过QQ号或新浪、腾信微博账号直接在评论处登录,发表评论并选择转发到微博、QQ空间。

传统C/S软件的“断骨增高”疗法

技术产业 HIT金子 1856浏览 评论

来源:HIT专家网   作者:南京都昌信息科技有限公司 袁永福

由于院内临床业务存在高频、功能强的用户信息交互要求,使得HIT行业中存在大量的C/S型软件,尽管B/S软件应用范围正在扩大,但在很多场景中,C/S软件仍然顽强地生存和发展着。

不过随着行业软件开发技术水平的提升,传统的C/S软件,也就是客户端程序直接连接数据库的模式越来越显得过时和不符合需求了。此时需要对这些C/S软件进行升级。这些C/S软件是各种开发组织(软件公司和医院信息科)花费数万人月完成的,是不可能一下子替换的,只能渐进地升级。

C/S + Web Service混合模式

目前比较常见的模式就是C/S + Web Service的混合模式。

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程序结构如下:

传统C/S软件

这种结构下,UI模块、业务逻辑模块、数据库处理模块相互纠缠,到处都有直接访问数据库的代码,混乱不堪。

为此,我们需要首先改造,整改之后的程序结构如下:

传统C/S软件

这种结构下,UI模块、业务逻辑模块、数据库处理模块之间分离比较清晰,只有数据库处理模块才能直接连接数据,其他模块尽量少地连接数据库。

不过考虑到实际情况,不能要求太高,但底线是UI模块必须分离开来,若业务逻辑模块和数据库处理模块不能低成本地分离开来,那也能凑合着继续,但是UI模块绝对不能直接连接数据库。UI模块不能清晰分离出来,后续操作也就无法执行了。

对C/S软件的内部功能模块分层后,这时候我们就用到一种叫透明代理的机制。在.NET开发中就是调用类型System.Runtime.Remoting.Proxies.RealProxy中的功能。原理图如下:

新型C/S软件

其工作步骤如下:

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服务器是停用的。而且客户端是直连数据库。

新型C/S软件

这种模式是非常适合软件开发和调试过程的。可以单步调试一通到底,“编辑并继续”也能随时执行。

这样我们的软件具有开发模式和运行模式。开发模式非常适合程序员的软件开发和调试过程;运行模式适合生产环境下的运行,具有强大的伸缩性和可维护性。两头都方便,按需配置,有利于快速开发和部署。

“断骨增高”方案的推广价值

这种技术方案的推广也会对整个HIT行业带来巨大的利益。业界已经运行着大量的C/S软件,它们是各种开发组织投入数万人月编写数千万行的代码,并和用户一起历经数年时间反复磨合而得到的。这些软件凝聚了客户大量的投资,不能随便抛弃。

而我们可以采用“断骨增高”来改良这些C/S软件,在无需重大修改的情况下显著增加软件的可伸缩性和可维护性,重用历史代码,大幅延长软件的运行寿命,保护客户投资,创造巨大的经济效益。

都昌公司专门进行底层技术研究和输出,研制出“断骨增高”这种非常接地气的技术方案,然后反复重构优化和产品化,并制定一套开发指南,然后融入到“都昌赋能框架”中,可以针对所有基于.NET平台的C/S程序进行优化,帮助开发组织利用已有技术力量开发出高度可伸缩性和可维护性的软件,增强解决问题的能力,提高市场竞争力。

【作者简介】

袁永福,南京东南大学毕业,微软MVP,南京都昌信息科技有限公司创始人,长期从事电子病历编辑器控件的研发和推广工作,其产品成为编辑器细分市场的第一品牌。(邮箱:28348092@qq.com)

 【责任编辑:谭啸】

 

您必须 登录 才能发表评论!