在讨论多层开发前,先谈一下老的C/S 程序。
几个月前,我的一个朋友找我,说是我以前给他做的一个系统,原来是在局域网的运行的,现在有两个校区,另外一个校区也想使用,
两个校区都可以上互联网,让想办法解决。我去看了一下,是我10年前给开发的c/s 系统,源代码早都不见了。我说可以按现在的模式
重新开发一套,但是需要时间和money.朋友要求一周内就要解决,同时认为系统现有的功能已经足够了,而且系统非常稳定,他们已经习惯操作了,
没有必要再开发了。看现有的条件下如何快速、安全的实现两个校区的联网运行。没有了源代码,只能通过网络来解决这个问题,可以把数据库服务器
IP直接设为公网IP,远程直接访问。但是这是一个愚蠢的做法,因为直接把数据库暴露在互联网上,估计不出一天服务器就完蛋了(同时系统传输的数据随时都可以被黑客或木马嗅探)。
所以必须使用硬件VPN办法解决这个问题了。还好现在有非常便宜的VPN 设备(大概就是1000-2000元)。我们一天就实现了系统的扩展。
系统网络拓扑图如下:
当然还有一种解决方法就是利用windows 的vpn 功能,服务器端需要一台windows VPN 服务器,客户端需要运行程序时,先进行
VPN 拨号,然后就可以使用了,当然为了保证windows 服务器自身的安全,必须安装或开启防火墙功能。
这种系统的网络拓扑图如下:
以上两个办法由于不用改动源代码,因此理论上适合任何C/S 系统程序。
当然如果有源代码的话,我们可以更加灵活的实现以上功能,当然前提条件是对系统功能不产生任何改变。
这里我们要使用SSH建立安全连接,SSH 是目前较可靠,专为远程登录会话和其他网络服务提供安全性的协议。利用 SSH 协议可以有效防止远程管理过程中的信息泄露问题。
建立连接后,再使用端口转发功能,把远程数据库监听端口,映射到本地服务器或本机上,实现安全访问数据库服务器。
delphi 里面可以使用Devart 的 SecureBridge实现以上功能。
其工作网络拓扑图如下:
上图是把远程服务器的端口映射到本地服务器上,为了简单,下面以把端口映射到本机为例,介绍一下实现方法。
首先在客户端系统的dadamodule 模块里面 先要增加三个控件
sserver: TScSSHClient;
sch: TScSSHChannel;
ScRegStorage1: TScRegStorage;
首先databse 的server 要设为本机,即127.0.0.1.
再设置TScSSHClient 的属性,使其可以访问到远程的ssh 服务器。
主要设置 ssh 服务器的hostname,port,username,password 和keystorage.
keystorage 用来在客户端保存以上的登录信息和远程ssh 服务器的公匙。
如果远程服务器设置好的话,就可以直接设置connected 为True,并与远程SSH 服务器建立连接。
最后就是建立隧道,实现端口转发。
这个用来设置将远程数据库服务器192.168.10.254 的1521端口(oralce 的监听端口)映射到
本地的1521 上,就像oracle 安装在本地了(呵呵,欺骗一下客户端)。
到现在为止,我们就设置好了一切,开始运行客户端,就可以安全访问远程的数据库了。
以上三种方式介绍了老的C/S 系统访问远程数据库的方法,适合一下几种情况:
1.原来的系统运行稳定,功能不需要再增加;
2.时间来不及改造旧的系统;
3.每次访问的数据量不能太大(因为数据要经过互联网,当然多层系统也存在这个问题);
4.客户端不是对外开放的,客户端数量可控。
总之,虽然多层系统有很多优点(后面会陆续介绍),但是C/S 系统也有自己的一些不可替代的优点,
没有最好的系统架构,只有最适合的系统架构。如果C/S 可以用、够用的话,我们就让它发挥最后余热吧。