【.NET 8】ASP.NET Core计划 - 支持更完善的AOT发布

.NET7.0刚发布不久,.NET社区开始了.NET8.0的开发,重心重新回到了新功能的迭代。

我们知道在.NET7.0中一个令人激动的特新就是支持了NativeAOT,我们可以通过NativeAOT生成本机程序,由于无需JIT编译,所以无需安装.NET Runtime,也进一步的提升了.程序的启动速度,降低了程序的体积,在客户端软件开发、ServerLess等场景会有不错的前景。关于NativeAOT发布的详情可以点下方链接:
https://learn.microsoft.com/zh-cn/dotnet/core/deploying/native-aot/

作为地表最强的.NET WEB服务器ASP.NET Core,自然也是支持NativeAOT编译,而今天就是为大家介绍关于.NET8.0中ASP.NET Core中计划的一些NativeAOT改进。

概述

.NET 7引入了对将.NET控制台项目作为本地AOT发布的支持,产生了一个独立的、针对平台的可执行文件,没有任何运行时JIT。本地AOT应用程序启动非常快,而且使用的内存更少。该应用程序可以被部署到没有安装任何.NET运行时的机器或容器中。在.NET 8中,我们将把对本地AOT的支持扩展到ASP.NET Core,首先是以云为重点,用最小的API构建的API应用程序,满足关于发布文件大小、启动时间、工作集和吞吐性能的期望。

范围

如前所述,.NET8.0的主要重点是使用Minimal APIs实现ASP.NET Core API应用程序的本地AOT发布。这里的 "支持本地AOT"是指确保项目能够通过<PublishAOT>项目属性启用本地AOT发布,并且由此产生的开发经验能够引导开发人员制作本地AOT发布的应用程序,而不会出现构建、发布或运行时警告和错误。这意味着ASP.NET Core和.NET的大多数基础功能领域都需要更新,以支持本地AOT,包括:

  • 托管API,包括WebApplication,等等。
  • Kestrel HTTP服务器
  • 配置和选项
  • 日志
  • 依赖性注入
  • 通用中间件
  • 认证和授权
  • 最低限度的API
  • 健康检查
  • 用ADO.NET进行数据访问(SQLite和PostgreSQL为主要目标)
  • 支持OpenAPI
  • 可观测性和诊断

此外,作为一个次要目标,我们将在实现以下功能领域的NativeAOT发布方面取得进展:

  • gRPC
  • SignalR
  • MVC Web APIs
  • Entity Framework

以下功能领域暂时不在NativeAOT支持的范围内:

  • MVC视图和Razor页面
  • Blazor服务器

开发经验原则

本地AOT有一些限制,这意味着在发布本地AOT时不支持.NET中的某些API和代码模式。这些包括依赖运行时JIT的功能,如动态代码生成和编译、汇编加载等,以及导致代码被本地AOT编译过程修剪掉的模式,这些都是执行应用程序所需要的,导致运行时失败。

在为ASP.NET Core增加对本地AOT的支持时,我们必须确保开发体验是这样的:开发人员可以合理地确定他们的应用程序在发布为本地AOT后将如何运行。如果当前的API和功能的设计方式与原生AOT不兼容,我们将利用包括源码生成器、分析器和代码修复器在内的工具,让现有的API与NativeAOT协同工作,或者让开发者以合理的方式更新他们的应用程序与NativeAOT协同工作。

阶段

阶段 1

这项工作的第一阶段是使用新的项目模板创建ASP.NET Core API项目,启用本地AOT,可以在没有任何警告或错误的情况下构建、发布和运行,并且满足可执行文件大小、启动时间、工作集和吞吐量的定义指标。

度量目标

这些指标主要以Linux为重点,因为它是主要的部署目标,但Windows和macOS上的大小仍将被跟踪,并与这些目标保持一致,因为在候选平台调查期间,它往往有助于感知。

  • 10MB的可执行文件大小
  • <50毫秒的启动时间(准备接受第一个请求)。
  • <50 MB的工作集内存足迹(准备接受第一个请求)。
  • <50 MB的工作集内存占用(处理完负载测试)。
  • 在Citrine perf环境下,默认CoreCLR RPS的5%以内

这里的 "默认"是指与基于CoreCLR的应用程序部署的默认配置相比,例如包括分层JIT。

阶段 2

第二阶段建立在第一阶段的基础上,使更多的"真实世界"的ASP.NET Core API应用程序成为本地AOT发布。这些应用程序将使用更多通常与在云环境中运行API应用程序有关的功能,包括AuthN/Z、数据访问、OpenTelemetry等。TrimmedTodo API应用程序将作为这种应用程序的最初例子。

度量目标

这些主要是以Linux为重点,因为这是主要的部署目标,但在Windows和macOS上的大小仍将被跟踪,并与这些目标保持一致,因为它往往有助于在候选平台调查中的感知。

  • 20MB的可执行文件大小
  • <150毫秒的启动时间(准备接受第一个请求)。
  • <60 MB工作集内存占用(准备接受第一个请求)。
  • <60 MB的工作集内存占用(处理完负载测试)。
  • RPS在Citrine性能环境中的目标待定

总结

我们从.NET社区最新的计划可以看出,ASP.NET Core将继续在云原生场景发力,通过支持NativeAOT来降低可执行文件大小、缩短启动时间降低内存占用,笔者本人是非常期待这样的更新,在之前笔者的文章AOT和单文件发布对程序性能的影响中测试了.NET6.0时代ASP.NET Core AOT的的一些数据,后面.NET8.0发布以后期待它的改进。

以下是.NET6.0 ASP.NET Core AOT的数据:


Github对应链接:https://github.com/dotnet/aspnetcore/issues/45910

posted @ 2023-02-08 22:05  InCerry  阅读(4653)  评论(7编辑  收藏  举报