.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

【.NET 8】ASP.NET Core计划 - 支持更完善的AOT发布的更多相关文章

  1. 使Asp.net Core同时支持输出Json/Xml

    我们知道Asp.net Core是支持输出为Json格式的.同时也支持输出为xml格式.只要我们正确的配置.并在Request时指定正确的Accept,即可根据不同的Header来输出不同的格式. 前 ...

  2. 让你的ASP.NET Core应用程序更安全

    让你的ASP.NET Core应用程序更安全 对于ASP.NET Core应用程序,除了提供认证和授权机制来保证服务的安全性,还需要考虑下面的一些安全因素: CSRF 强制HTTPS 安全的HTTP ...

  3. asp.net core 实现支持多语言

    asp.net core 实现支持多语言 Intro 最近有一个外国友人通过邮件联系我,想用我的活动室预约,但是还没支持多语言,基本上都是写死的中文,所以最近想支持一下更多语言,于是有了多语言方面的一 ...

  4. asp.net core 实现支持自定义 Content-Type

    asp.net core 实现支持自定义 Content-Type Intro 我们最近有一个原本是内网的服务要上公网,在公网上有一层 Cloudflare 作为网站的公网流量提供者,CloudFla ...

  5. 将 ASP.NET Core 1.0 应用作为 docker 镜像发布 (Linux版)

    var appInsights=window.appInsights||function(config){ function r(config){t[config]=function(){var i= ...

  6. ASP.NET Core中实现单体程序的事件发布/订阅

    标题:ASP.NET Core中实现单体程序的事件发布/订阅 作者:Lamond Lu 地址:https://www.cnblogs.com/lwqlun/p/10468058.html 项目源代码: ...

  7. 快速搭建CentOS+ASP.NET Core环境支持WebSocket

    环境:CentOS 7.x,.net core 2 以下.net core 2安装操作为官方方法.如果你使用Docker,那么更简单了,只需要docker pull microsoft/dotnet就 ...

  8. Asp.Net Core 已支持 gRPC-Web !!

    grpc-dotnet 项目在 PR #695 完成了 ASP.NET Core 服务与 .NET Core gRPC 客户端的 gRPC-Web 实现. 虽然目前还是实验性项目,但是并不阻碍我们为之 ...

  9. asp.net core计划任务探索之hangfire+redis+cluster

    研究了一整天的quartz.net,发现一直无法解决cluster模式下多个node独立运行的问题,改了很多配置项,仍然是每个node各自为战.本来cluster模式下的各个node应该是负载均衡的, ...

  10. Asp.net Core WebApi 支持json/xml格式的数据返回

    Asp.net core 在做webapi项目的时候,默认是只返回json格式的数据的,如果想要开启xml数据返回,需要在startup里配置如下: public void ConfigureServ ...

随机推荐

  1. Pycharm自定义实时模板

    pycharm添加模板 添加装饰器模板 # 1.file-->Setting-->Editor-->Code Style -->Live Templates# 2." ...

  2. Datatable 数据源

    数据源类型 Datatable可以使用三种基本的JavaScript数据类型作为数据源 数组(Arrays[]) 对象(objects{}) 实例(new myclass()) 目前使用过的为前两种, ...

  3. 😊SpringBoot 整合 Elasticsearch (超详细).md

    SpringBoot 整合 Elasticsearch (超详细) 注意: 1.环境搭建 安装es Elasticsearch 6.4.3 下载链接 为了方便,环境使用Windows 配置 解压后配置 ...

  4. CH58X/CH57X/V208 Observer(观察者)例程讨论讲解

    使用的是沁恒的CH582M的Observer例程与官方的demo板. 本例程的功能是主机扫描到从机的MAC地址并打印出来. 先对宏定义进行理解讨论. 最大响应扫描数为8,在串口调试助手那里可以看到打印 ...

  5. 镜像制作工具diskimage-builder介绍

    简介 diskimage-builder(简称dib)是一款用于构建系统镜像的工具,它被设计用于OpenStack的TripleO项目,支持qocw2.vhd.raw等主流镜像格式. 在众多系统镜像构 ...

  6. C#和Open eVision Studio图像库联合编程-读取图像

    OpenFileDialog openFileDialog = new OpenFileDialog(); openFileDialog.Filter = "Image Files (*.t ...

  7. 谷歌、微软、Meta?谁才是 Python 最大的金主?

    你知道维护 Python 这个大规模的开源项目,每年需要多少资金吗? 答案是:约 200 万美元! PSF(Python 软件基金会)在 2022 年 6 月发布了 2021 的年度报告,其中披露了以 ...

  8. laravel框架部署

    每一个 Laravel 程序都会生成一个随机的 32 位长度的字符串存储在 .env 文件中的 APP_KEY 键值中, 当我们新建 Laravel 项目的时候会自动为你创建一个,只有在克隆的时候你才 ...

  9. 关于Linux mint更换中文字体后全局楷体修改办法

    问题描述 linux mint 更新中文字体后,全局都变成了楷体,浏览器里面,终端里(英文字体可以在终端设置里面修改),这里指的是中文字体,而英文字体可以在 linux mint 设置 - 选择字体 ...

  10. POST请求发送的表单数据和json数据的区别及python代码实现

    前言 这篇博客会介绍最常见post 请求form表单数据和json数据 数据类型之间的区别, urllib代码的实现(python), requests库实现, 以及如何使用postman软件发送这些 ...