.NET 生态系统是一个不断变化的生态圈,我相信它正在朝着一个伟大的方向发展。正好,最近 InfoQ 上发布了一篇文章《.NET 生态系统概览》,有了开源和跨平台这两个关键优先事项,我们就可以放心了。 下面我们来参考文章《进击的 Java ,云原生时代的蜕变》对云原生对应用运行时的不同需求,说明一个.NET Core 3.0 在云原生时代所完成的蜕变:
.NET Core 3.0 新增功能 大部分的功能特性已经公开,可以通过网页.NET Core 3.0 的新增功能,其中有几个特性是非常期待应用到生产的,很多人都在等待着明天的正式发布。
.NET Core 现在默认生成依赖于框架的可执行文件,这个行为是和 .NET Framework 保持一致了。 对于使用全局安装的 .NET Core 版本的应用程序而言,这是一种新行为。 以前,仅独立部署会生成可执行文件。
在 dotnet build
或 dotnet publish
期间,将创建一个与你使用的 SDK 的环境和平台相匹配的可执行文件。 和其他本机可执行文件一样,可以使用这些可执行文件执行相同操作,例如:
dotnet publish
命令支持将应用打包为特定于平台的单文件可执行文件。 该可执行文件是自解压缩文件,包含运行应用所需的所有依赖项(包括本机依赖项)。 首次运行应用时,应用程序将根据应用名称和生成标识符自解压缩到一个目录中。 再次运行应用程序时,启动速度将变快。 除非使用了新版本,否则应用程序无需再次进行自解压缩。
若要发布单文件可执行文件,请使用 dotnet publish
命令在项目或命令行中设置 PublishSingleFile
:
<PropertyGroup>
<RuntimeIdentifier>win10-x64RuntimeIdentifier>
<PublishSingleFile>truePublishSingleFile>
PropertyGroup>
或者
dotnet publish -r win10-x64 /p:PublishSingleFile=true
这个单文件是大家一直期待的 go 特性,.NET Core 3.0 正式有了,更详细的信息参看 Single-file Publish。
.NET core 3.0 SDK 随附了一种工具,可以通过分析 IL 并剪裁未使用的程序集来减小应用的大小。
自包含应用包括运行代码所需的所有内容,而无需在主计算机上安装 .NET。 但是,很多时候应用只需要一小部分框架即可运行,并且可以删除其他未使用的库。
.NET Core 现在包含一个设置,将使用 IL 链接器工具扫描应用的 IL。 此工具将检测哪些代码是必需的,然后剪裁未使用的库。 此工具可以显著减少某些应用的部署大小。
要启用此工具,请使用项目中的
设置并发布自包含应用:
<PropertyGroup>
<PublishTrimmed>truePublishTrimmed>
PropertyGroup>
或者
dotnet publish -r
例如,包含的基本 “hello world” 新控制台项目模板在发布时命中大小约为 70 MB。 通过使用
,其大小将减少到约 30 MB,这个特性可以用于进一步的减小应用程序的大小。请务必考虑到使用反射或相关动态功能的应用程序或框架(包括 ASP.NET Core 和 WPF)通常会在剪裁时损坏。
.NET Core 3.0 中默认启用了 分层编译 (TC)。 此功能使运行时能够更适应地使用实时 (JIT) 编译器来获得更好的性能,这也是一个可以加速应用启动的选项。
TC 的主要优势是使(重新)实时编译方法能够要么牺牲代码质量以更快地生成代码,要么以较慢的速度生成更高质量的代码。 这有助于提高应用程序在从启动到稳定状态的各个执行阶段的性能。 这与非 TC 方法完全不同,其中每种方法均以单一方式进行编译(与高质量层相同),这种方法偏向于稳定状态而不是启动性能。
若要启用快速 JIT(第 0 层实时编译的代码),请在项目文件中使用此设置:
<PropertyGroup>
<TieredCompilationQuickJit>trueTieredCompilationQuickJit>
PropertyGroup>
可以通过将应用程序集编译为 ReadyToRun (R2R)
格式来改进.NET Core 应用程序的启动时间。R2R 是一种预先 (AOT) 编译形式,这也是一项加速应用启动时间的选项。
R2R 二进制文件通过减少应用程序加载时实时 (JIT) 编译器需要执行的工作量来改进启动性能。 二进制文件包含与 JIT 将生成的内容类似的本机代码。 但是,R2R 二进制文件更大,因为它们包含中间语言 (IL) 代码(某些情况下仍需要此代码)和相同代码的本机版本。仅当发布面向特定运行时环境 (RID)(如 Linux x64 或 Windows x64)的自包含应用时 R2R 才可用。
.NET Core 3.0 引入了一项选择加入功能,该功能允许应用前滚到 .NET Core 最新的主要版本。 此外,还添加了一项新设置来控制如何将前滚应用于应用。 这可以通过以下方式配置:
必须指定以下值之一。 如果省略该设置,则默认值为“Minor” 。
从预览版 3 开始,在 Linux 上使用 Docker 运行 .NET Core 3.0 时,可以更好地处理 cgroup 内存限制。 运行具有内存限制的 Docker 容器(例如使用 docker run -m)会更改 .NET Core 的行为方式。
垃圾回收器的默认堆大小已减小,以使 .NET Core 使用更少的内存。 此更改更符合具有现代处理器缓存大小的第 0 代分配预算。
大型页面(也称为 Linux 上的巨型页面)是一项功能,其中操作系统能够建立大于本机页面大小(通常为 4K)的内存区域,以提高请求这些大型页面的应用程序的性能。
现在可以使用 GCLargePages 设置将垃圾回收器配置为一项选择加入功能,以选择在 Windows 上分配大型页面。
.NET 技术在云原生时代也在不停地进化。.NET Core 作为.NET 生态的非常重要的一员,在对现有 .NET 应用保持高度兼容的同时,对启动速度和内存占用做了细致的优化,比较适于微服务架构配合使用, 在以kubernetes 为代表的云原生应用开发平台上发生蜕变。
在云原生时代,我们要能够在横向的应用开发生命周期中,将开发、交付、运维过程进行有效的分割和重组,提升研发协同效率;并且要能在整个纵向软件技术栈中,在编程模型、应用运行时和基础设施等多层面进行系统优化,实现 radical simplification,提升系统效率。