系统在正常运行情况下,当我们进行业务变更时,我们不希望系统停下来,这会对我们的用户造成不好的影响,php,python 可以直接更换文件来实现,也可以用多层来实现,但多层无形中也会增加工作量,
dephi这里的解决方法是使用bpl技术,把具体的业务封装在bpl中,当进行业务更换时,通过升级类版本,修改配置文件来实现动态更新业务,从而达到热部署。
下面说下DelphiWebMVC如何实现:
项目结构:
这里4个项目DelphiMVC,UserPackage,LoginPackage,Share
DelphiMVC 主工程用来进行bpl包的调用及框架结构
UserPackage 用户业务包
LoginPackage 登录业务包
share 共享包,其他包开发是需要引用
上图指出了启用bpl包模式的设置,打开包开发模式,设置包检测时间与旧包卸载时间,
这里默认5秒进一次配置文件检测当版本升级后加载新包,包类名称需要修改可以加上版本号,否则加载时会提示 包类重复,无法加载成功,当检测到新包是,旧包这里默认10秒后卸载,这里为了防止并发时旧业务还在进行操作,进行延时卸载。
下面说配置文件package.json
userpackage 包名升级是不可以修改
pakcage:bpl文件存放位置,升级时指向新位置,因为旧包还在使用无法替换,也不能替换。
ver:版本
TUserPackage 类的别名,在程序内部调用
getdata 类方法别名,内部调用使用。
下面看下具体调用:
这是 userService 类 用户服务类,在此类来调用 包中具体的业务,
通过调用父类的 exec 方法 设置 包名,类别名,类方法别名,和参数,来调用配置文件中指定的方法
我们看下包内方法怎么编写
打开 userpakage 包内的类 userpackage 类 这里类我升级到V1版本,如果再升级可以到V2 版本,批量替换即可。
方法参数必须是 map 参数以json结构传入,继承 TBasePackage类
initialization
RegisterClass(TUserPackageV1);finalization
UnRegisterClass(TUserPackageV1);这块是必须的否则包无法加载。
注意:方法必须放在published 下否则方法无法被调用。
这样即可实现在服务不停止下进行业务的更新切换。