我正在开发部署到Azure的Service Fabric应用程序。它目前只包含5个无状态服务。压缩存档的重量约为200MB,这已经成为问题所在。
通过检查存档的内容,我可以看到主要问题是所有服务都需要许多文件。因此,每个服务的文件夹中都存在这些文件的精确副本。但是,zip压缩格式对于存档中的重复文件没有任何巧妙之处。
作为一个实验,我写了一个小脚本来查找部署中的所有重复文件,并删除除了每个文件之外的所有文件。然后我试着压缩结果,它以更实用的38MB进入。
我还注意到系统库是捆绑的,包括:
这些都是大文件,所以我有兴趣知道是否有办法让我只捆绑一次。我已经尝试完全删除它们,但随后Service Fabric无法启动应用程序。
任何人都可以提供任何关于如何大幅减少部署包大小的建议吗?
注意:我已经阅读过关于compressing packages的文档,但我很困惑为什么他们的压缩方法会有所帮助。的确,我试过了,但事实并非如此。他们所做的只是在主zip文件中压缩每个子文件夹,但不涉及重复数据删除文件。
有一种方法可以减小包装的大小,但我会说它不是一种好方法或应该做的事情,但我认为它在某些情况下可以使用。
请注意:此方法要求目标计算机安装所有先决条件(包括.NET Core Runtime等)
构建.NET Core应用程序时,有两种部署模型:自包含和依赖于框架。
在自包含模式下,所有必需的框架二进制文件都与应用程序二进制文件一起发布,而在依赖于框架的应用程序二进制文件中。
默认情况下,如果项目已指定运行时:<RuntimeIdentifier>win7-x64</RuntimeIdentifier>
中的.csproj
,则发布操作是自包含的 - 这就是为什么所有服务都会复制所有内容的原因。
要关闭此功能,您只需将SelfContained = false属性添加到您拥有的每个服务项目中即可。
以下是新的.NET Core无状态服务项目的示例:
<PropertyGroup>
<TargetFramework>netcoreapp2.2</TargetFramework>
<AspNetCoreHostingModel>InProcess</AspNetCoreHostingModel>
<IsServiceFabricServiceProject>True</IsServiceFabricServiceProject>
<ServerGarbageCollection>True</ServerGarbageCollection>
<RuntimeIdentifier>win7-x64</RuntimeIdentifier>
<TargetLatestRuntimePatch>False</TargetLatestRuntimePatch>
<SelfContained>false</SelfContained>
</PropertyGroup>
我做了一个小测试,并创建了五个服务的新Service Fabric应用程序。 Debug中未压缩的包大小约为500 MB。在我修改了所有项目后,包大小下降到~30MB。
部署的应用程序在本地群集上运行良好,因此它表明此概念是减少包大小的有效方法。
最后,我将再次强调警告:
请注意:此方法要求目标计算机安装所有先决条件(包括.NET Core Runtime等)
您通常不希望知道哪个节点运行哪个服务,并且您希望彼此独立地部署服务版本,因此在其他独立服务之间共享二进制文件会产生非常不自然的运行时依赖性。我建议不要这样做,除了像AspNet和DotNet这样的平台二进制文件。
但是,你读过关于创建差异包的内容吗? https://docs.microsoft.com/en-us/azure/service-fabric/service-fabric-application-upgrade-advanced#upgrade-with-a-diff-package将在最初的200MB命中后减少升级包的大小。