我们有一个在生产服务器上作为Windows服务运行的应用程序。应用程序被划分为几个程序集,主要在部署边界上。我想简化应用程序程序集热修复的部署。目前,我执行以下步骤来部署热修复程序。(我们有一个用于分期的生产环境的副本,所以每件事都要做两次)
我想我想要的是上传(SFTP)一个dll到预置文件夹,并让应用程序拿起新的dll。
我考虑过的一个解决方案是在服务器上运行一个单独的服务。让我们把它称为热修复部署服务。它将监视新文件的文件系统,并从上面的列表中执行步骤2-6。
任何洞察力都是值得赞赏的。我对其他替代方案持开放态度,只要它们减少部署摩擦。
发布于 2009-12-07 19:32:02
拥有单独的服务可能是你最好的选择。
您可以,潜在地,在一个单一的服务中这样做。但是,实现服务自我更新所需要的“技巧”有点难实现。
您需要做的是让您的服务从非常轻量级的shell服务开始。然后,它可以启动一个单独的绝缘AppDomain,并让该应用程序域加载您的服务程序集,并初始化并运行。
稍后,当您想要更新时(这可以通过服务可以获取的任何事件触发,包括通过FileSystemWatcher将新程序集复制到更新文件夹,通过网络显式告诉它等等),它需要触发一种方法来通知内部AppDomain的类型停止,然后卸载AppDomain。此时,它可以执行上面的步骤3和4。然后,它只需要重新加载AppDomain,重新运行它的初始化,等等。
因为服务将位于一个单独的AppDomain中,所以这一切都可能发生在一个可执行文件中,而不需要停止服务。卸载AppDomain时,它加载的程序集也会被卸载。
这里唯一让您感到困难的要求是,您必须确保不将任何类型从构造的AppDomain传递到主AppDomain中,否则就会将程序集加载到主AppDomain中。这将阻止您在运行时更新它们。
发布于 2009-12-07 19:32:38
在构建服务器上,我们使用powershell脚本远程停止服务、复制新文件并重新启动服务。
发布于 2009-12-07 19:31:44
我认为温莎城堡是“热插拔”程序集的一个很好的选择。
它是一个高级的、支持良好的IoC/DI框架,它帮助您完成您提到的许多任务,除了将文件实际移动到目标机器上。然而,实际的管道将很好地与CW一起处理。
https://stackoverflow.com/questions/1862289
复制相似问题