进击的.NET 在云原生时代的蜕变

你一定看过这篇文章 《进击的 Java ,云原生时代的蜕变》,  本篇文章的灵感来自于这篇文章。北京时间9.24 就将正式发布.NET Core 3.0, 所以写下这篇文章让大家全面认识.NET Core。

.NET 生态系统是一个不断变化的生态圈,我相信它正在朝着一个伟大的方向发展。正好 最近 InfoQ 上发布了一篇文章《进击的 Java ,云原生时代的蜕变》对云原生对应用运行时的不同需求,说明一个.NET Core 3.0 在云原生时代所完成的蜕变:

  • 体积更小:对于微服务分布式架构而言,更小的体积意味着更少的下载带宽,更快的分发下载速度,.NET Core 的镜像体积都很小,alpine的镜像更小,带上应用程序通常80M。

  • 启动速度更快:对于传统单体应用,启动速度与运行效率相比不是一个关键的指标。原因是,这些应用重启和发布频率相对较低。然而对于需要快速迭代、水平扩展的微服务应用而言,更快的的启动速度就意味着更高的交付效率,和更加快速的回滚。尤其当你需要发布一个有数百个副本的应用时,缓慢的启动速度就是时间杀手。对于Serverless 应用而言,端到端的冷启动速度则更为关键,即使底层容器技术可以实现百毫秒资源就绪,如果应用无法在 500ms 内完成启动,用户就会感知到访问延迟。这里我拿AWS Lambda来举例,因为各大云厂商都是以AWS是模仿的目标,AWS Lambda中可用的所有语言都是高级的,而不是像Assembler,C / C ++或Objective C那样。从脚本语言到JavaScript和Python,再到像Java和C#到Go这样被编译为二进制文件的托管运行时的语言,所有语言都是他们有自己的长处。在基准测试中,最重要的.NET Core是 冠军,具体参看https://react-etc.net/entry/aws-lambda-benchmarks-node-js-python-java-c-go-dotnet-core

  • 占用资源更少:运行时更低的资源占用,意味着更高的部署密度和更低的计算成本。.NET Core的 CLR启动速度非常快,降低启动时资源消耗,可以减少资源争抢,更好保障其他应用 SLA。

  • 支持水平扩展:.NET Core 3.0默认更好的支持Docker资源限制,官方团队也在努力让.NET Core成为真正的容器运行时,使其在低内存环境中具有容器感知功能并高效运行。 具体可以参看文章《》,随着内存成本的下降和虚拟化的流行,大内存配比已经成为趋势。所以我们一般是采用水平扩展的方式,同时部署多个应用副本,在一个计算节点中可能运行一个应用的多个副本来提升资源利用率。

.NET Core 3.0 新增功能 大部分的功能特性已经公开,可以通过网页:https://docs.microsoft.com/zh-cn/dotnet/core/whats-new/dotnet-core-3-0,其中有几个特性是非常期待应用到生产的,很多人都在等待着明天的正式发布。

默认可执行文件

.NET Core 现在默认生成依赖于框架的可执行文件,这个行为是和.NET Framework保持一致了。对于使用全局安装的 .NET Core 版本的应用程序而言,这是一种新行为。以前,仅独立部署会生成可执行文件。

单文件可执行文件

在 dotnet build 或 dotnet publish 期间,将创建一个与你使用的 SDK 的环境和平台相匹配的可执行文件。和其他本机可执行文件一样,可以使用这些可执行文件执行相同操作,例如:

  • 可以双击可执行文件。

  • 可以直接从命令提示符启用应用程序,如 Windows 上的 myapp.exe,以及 Linux 和 macOS 上的 ./myapp

dotnet publish 命令支持将应用打包为特定于平台的单文件可执行文件。该可执行文件是自解压缩文件,包含运行应用所需的所有依赖项(包括本机依赖项)。首次运行应用时,应用程序将根据应用名称和生成标识符自解压缩到一个目录中。再次运行应用程序时,启动速度将变快。除非使用了新版本,否则应用程序无需再次进行自解压缩。

若要发布单文件可执行文件,请使用 dotnet publish 命令在项目或命令行中设置 PublishSingleFile

<PropertyGroup>
   <RuntimeIdentifier>win10-x64</RuntimeIdentifier>
   <PublishSingleFile>true</PublishSingleFile>
</PropertyGroup>

或者

dotnet publish -r win10-x64 /p:PublishSingleFile=true

这个单文件是大家一直期待的go 特性,.NET Core 3.0正式有了,更详细的信息参看 https://github.com/dotnet/designs/blob/master/accepted/single-file/design.md

.NET core 3.0 SDK 随附了一种工具,可以通过分析 IL 并剪裁未使用的程序集来减小应用的大小。

自包含应用包括运行代码所需的所有内容,而无需在主计算机上安装 .NET。但是,很多时候应用只需要一小部分框架即可运行,并且可以删除其他未使用的库。

.NET Core 现在包含一个设置,将使用 IL 链接器工具扫描应用的 IL。此工具将检测哪些代码是必需的,然后剪裁未使用的库。此工具可以显著减少某些应用的部署大小。

要启用此工具,请使用项目中的 <PublishTrimmed> 设置并发布自包含应用:

<PropertyGroup>
   <PublishTrimmed>true</PublishTrimmed>
</PropertyGroup>

或者

dotnet publish -r <rid> -c Release

例如,包含的基本“hello world”新控制台项目模板在发布时命中大小约为 70 MB。通过使用 <PublishTrimmed>,其大小将减少到约 30 MB,这个特性可以用于进一步的减小应用程序的大小。请务必考虑到使用反射或相关动态功能的应用程序或框架(包括 ASP.NET Core 和 WPF)通常会在剪裁时损坏。

.NET Core 3.0 中默认启用了分层编译 (TC)。此功能使运行时能够更适应地使用实时 (JIT) 编译器来获得更好的性能,这也是一个可以加速应用启动的选项。

TC 的主要优势是使(重新)实时编译方法能够要么牺牲代码质量以更快地生成代码,要么以较慢的速度生成更高质量的代码。这有助于提高应用程序在从启动到稳定状态的各个执行阶段的性能。这与非 TC 方法完全不同,其中每种方法均以单一方式进行编译(与高质量层相同),这种方法偏向于稳定状态而不是启动性能。

若要启用快速 JIT(第 0 层实时编译的代码),请在项目文件中使用此设置:

<PropertyGroup>
   <TieredCompilationQuickJit>true</TieredCompilationQuickJit>
</PropertyGroup>

可以通过将应用程序集编译为 ReadyToRun (R2R) 格式来改进.NET Core 应用程序的启动时间。R2R 是一种预先 (AOT) 编译形式,这也是一项加速应用启动时间的选项。

R2R 二进制文件通过减少应用程序加载时实时 (JIT) 编译器需要执行的工作量来改进启动性能。二进制文件包含与 JIT 将生成的内容类似的本机代码。但是,R2R 二进制文件更大,因为它们包含中间语言 (IL) 代码(某些情况下仍需要此代码)和相同代码的本机版本。仅当发布面向特定运行时环境 (RID)(如 Linux x64 或 Windows x64)的自包含应用时 R2R 才可用。

.NET Core 3.0 引入了一项选择加入功能,该功能允许应用前滚到 .NET Core 最新的主要版本。此外,还添加了一项新设置来控制如何将前滚应用于应用。这可以通过以下方式配置:

  • 项目文件属性:RollForward

  • 运行时配置文件属性:rollForward

  • 环境变量:DOTNET_ROLL_FORWARD

  • 命令行参数:--roll-forward

必须指定以下值之一。如果省略该设置,则默认值为“Minor” 。

  • LatestPatch
    前滚到最高补丁版本。这会禁用次要版本前滚。

  • Minor
    如果缺少所请求的次要版本,则前滚到最低的较高次要版本。如果存在所请求的次要版本,则使用 LatestPatch 策略。

  • Major
    如果缺少所请求的主要版本,则前滚到最低的较高主要版本和最低的次要版本。如果存在所请求的主要版本,则使用 Minor 策略。

  • LatestMinor
    即使存在所请求的次要版本,仍前滚到最高次要版本。适用于组件托管方案。

  • LatestMajor
    即使存在所请求的主要版本,仍前滚到最高主要版本和最高次要版本。适用于组件托管方案。

  • Disable
    不前滚。仅绑定到指定的版本。建议不要将此策略用于一般用途,因为它会禁用前滚到最新补丁的功能。该值仅建议用于测试。

从预览版 3 开始,在 Linux 上使用 Docker 运行 .NET Core 3.0 时,可以更好地处理 cgroup 内存限制。运行具有内存限制的 Docker 容器(例如使用 docker run -m)会更改 .NET Core 的行为方式。

  • 默认垃圾回收器 (GC) 堆大小:最大为 20 MB 或容器内存限制的 75%。

  • 可以将显式大小设置为绝对数或 cgroup 限制的百分比。

  • 每个 GC 堆的最小保留段大小为 16 MB。 此大小可减少在计算机上创建的堆数量。

垃圾回收器的默认堆大小已减小,以使 .NET Core 使用更少的内存。此更改更符合具有现代处理器缓存大小的第 0 代分配预算。

大型页面(也称为 Linux 上的巨型页面)是一项功能,其中操作系统能够建立大于本机页面大小(通常为 4K)的内存区域,以提高请求这些大型页面的应用程序的性能。

现在可以使用 GCLargePages 设置将垃圾回收器配置为一项选择加入功能,以选择在 Windows 上分配大型页面。

.NET 技术在云原生时代也在不停地进化。.NET Core 作为.NET 生态的非常重要的一员,在对现有 .NET 应用保持高度兼容的同时,对启动速度和内存占用做了细致的优化,比较适于微服务架构配合使用, 在以kubernetes 为代表的云原生应用开发平台上发生蜕变。

在云原生时代,我们要能够在横向的应用开发生命周期中,将开发、交付、运维过程进行有效的分割和重组,提升研发协同效率;并且要能在整个纵向软件技术栈中,在编程模型、应用运行时和基础设施等多层面进行系统优化,实现 radical simplification,提升系统效率。

相关文章:

原文链接:https://www.cnblogs.com/shanyou/p/11566850.html


.NET社区新闻,深度好文,欢迎访问公众号文章汇总 http://www.csharpkit.com 

640?wx_fmt=jpeg

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/313679.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Hibernate懒加载问题的5种解决方案

** 1、Hibernate基础 ** Hibernate基础&#xff0c;传送门 ** 2、什么是Hibernate懒加载 ** 当我们查询一个对象的时候&#xff0c;在默认情况下&#xff0c;返回的只是该对象的代理对象&#xff0c;当用户去使用该对象的属性时&#xff0c;才会向数据库再一次发出查询语…

程序员过关斩将--要想获取我的用户信息,就得按照规矩来

菜菜君&#xff0c;我又来啦又有什么事吗&#xff1f;我按照你上篇文章写的JWT的方式已经把网站认证写完了&#xff0c;而且效果还不错那恭喜你呀&#xff0c;下次面试又多了一项技能不过&#xff0c;现在又有一个问题&#xff0c;我做的系统有一个合作商想要利用我们的用户信息…

E. Surprise me!(莫比乌斯反演 + 虚树 DP)

E. Surprise me! ∑i1n∑j1nϕ(aiaj)d(i,j)设paii∑i1n∑j1nϕ(ij)d(pi,pj)∑i1n∑j1nϕ(i)ϕ(j)ϕ(gcd⁡(i,j))gcd⁡(i,j)d(pi,pj)∑d1ndϕ(d)∑i1nd∑j1ndϕ(id)ϕ(jd)d(pid,pjd)[gcd⁡(i,j)1]∑d1ndϕ(d)∑k1ndμ(k)∑i1nkd∑j1nkdϕ(ikd)ϕ(jkd)d(pikd,pjkd)Tkd∑T1n(∑i1n…

Hibernate 的缓存机制

** 1、Hibernate 应用程序中按照缓存的范围&#xff0c;可以将缓存分为三类 ** &#xff08;1.1&#xff09;事务范围缓存&#xff08;单Session&#xff0c;即一级缓存&#xff09; 事务范围的缓存只能被当前事务访问&#xff0c;每个事务都有各自的缓存。缓存的生命周期依…

.NET分布式大规模计算利器-Orleans(一)

写在前面Orleans是基于Actor模型思想的.NET领域的框架&#xff0c;它提供了一种直接而简单的方法来构建分布式大规模计算应用程序&#xff0c;而无需学习和应用复杂的并发或其他扩展模式。我在2015年下半年开始应用Orleans&#xff0c;当时公司的交易系统采用的架构就是基于Orl…

从单机应用到微服务,用户认证走几步?

用户认证指在用户访问服务的时候确认用户的身份&#xff0c;受限于HTTP无状态的特性&#xff0c;应用开发者需要自行实现用户认证相关功能。通常是用户登录时服务端生成通行证返回给客户端&#xff0c;客户端在接下来的请求中携带通行证&#xff0c;然后服务端通过校验该通行证…

编写优雅代码,从挖掉恶心的if/else 开始

背景长话短说&#xff0c; 作为开发人员经常需要根据条件灵活查询数据库&#xff0c;不管你是用rawsql 还是EFCore&#xff0c; 以下类似伪代码大家都可能遇到&#xff1a;特别是在大数据产品或者物联网产品中&#xff0c;字段甚多&#xff1b;if/else 写到死&#xff0c;一边写…

.NET Conf 2019 大会上发布.NET Core 3.0

北京时间今天凌晨如期在.NET Conf 上发布.NET Core 3.0,Keynotes 由Scott Hunter 主演&#xff0c;主要围绕.NET Core 3.0的新特性和社区展开。多功能性是.Net Core 成为我们的生活一部分的最好解释。如果您是Web开发人员还是想开发桌面或移动应用程序&#xff0c;如果您是游戏…

Spring AOP实现原理

先说结论&#xff1a; Spring AOP采用的是JDK动态代理 CGLIB动态代理模式。当当前类为接口的实现时&#xff0c;采用JDK动态代理&#xff0c;否则用CGLIB、 1、AOP 的存在价值 在传统 OOP 编程里以对象为核心&#xff0c;整个软件系统由系列相互依赖的对象所组成&#xff0c…

微软推出Python免费在线教程视频

开源中国曾报道过最近微软针对 Python 初学者&#xff0c;推出了一套免费的教程视频。这套视频名为 Python for Beginners&#xff0c;该在线教学视频由微软高级项目经理 Christopher Harrison、以及微软 AI Gaming 的商业开发经理 Susan Ibach 共同讲解&#xff0c;在课程中加…

推荐neter常用优秀开源项目系列之一

.net社区有很多优秀的开源项目&#xff0c;我们今天先推荐6个开源项目&#xff1b;1.MassTransitMassTransit 是一个自由、开源、轻量级的消息总线, 用于使用. NET 框架创建分布式应用程序。MassTransit在现有消息传输上提供了一组广泛的功能, 从而使开发人员能够友好地使用基于…

聊聊高并发下库存加减那些事儿——“异步扣减库存”

聊聊高并发下库存加减那些事儿不定期福利发放哦聊聊高并发下库存加减那些事儿背景一般在日常开发中经常会遇到打折促销&#xff0c;秒杀活动&#xff0c;就如拼多多最近的4999抢券买爱疯11促销活动&#xff0c;毕竟谁的钱也不是大风刮来的&#xff0c;有秒杀有促销必定带来大量…

什么是MVC

什么是MVC&#xff1f; MVC全名是Model View Controller&#xff0c;是模型(model)&#xff0d;视图(view)&#xff0d;控制器(controller)的缩写&#xff0c;一种软件设计典范。 用一种业务逻辑、数据、界面显示分离的方法&#xff0c;将业务逻辑聚集到一个部件里面&#xf…

SpringMVC 、Struts的区别

先说结论&#xff1a;目前Spring MVC已经一统江山&#xff0c;Struts正在被抛弃 1、Spring MVC原理 Spring 体系&#xff1a; Spring MVC工作流程图 SpringMVC的工作流程描述 1. 用户向服务器发送请求&#xff0c;请求被Spring前端控制Servelt DispatcherServlet捕获&#x…

基于Asp.Net Core MVC和AdminLTE的响应式管理后台之侧边栏处理

说明&#xff1a;.NET Core版本为:2.2 AdminLTE版本为:2.4.18 Bootstrap版本为:3.4.1 font-awesome版本为:4.7.01、新建项目&#xff1a;AdminLteDemo&#xff0c;添加区域Admin 在Areas/Admin/Views文件夹添加文件并分别添加如下代码&#xff1a;_ViewImports.cshtmladdTagHel…

Spring boot——起步依赖

一、起步依赖 1、是什么 本质上是一个Maven项目对象模型&#xff08;Project Object Model&#xff0c; POM&#xff09;&#xff0c; 定义了对其他库的传递依赖&#xff0c;这些东西加在一起即支持某项功能。 比如&#xff1a; spring-boot-dependencies^ spring-boot-pare…

[翻译] ASP.NET Core 3.0 的新增功能

全文翻译自微软官方文档英文版 Whats new in ASP.NET Core 3.0本文重点介绍了 ASP.NET Core 3.0 中最重要的更改&#xff0c;并提供相关文档的连接。BlazorBlazor 是 ASP.NET Core 中的一个新的框架&#xff0c;用于使用 .NET 构建交互式的客户端 Web UI&#xff1a;使用 C# 而…

Sprig boot自动配置

1、概述 Spring Boot是Spring旗下众多的子项目之一&#xff0c;其理念是约定优于配置&#xff0c;它通过实现了自动配置&#xff08;大多数用户平时习惯设置的配置作为默认配置&#xff09;的功能来为用户快速构建出标准化的应用。Spring Boot的特点可以概述为如下几点&#x…

.NET Core 3.0稳定版发布

一年一度的 .NET 开发者盛会 .NET Conf 2019 已正式开始了&#xff08;举办时间为 9.23-9.25&#xff09;。大会第一天最重磅也是最激动人心的消息莫过于 .NET Core 3.0 稳定版的发布。.NET 项目管理总监 Scott Hunter 在大会宣布了这则消息&#xff0c;并在主题演讲环节围绕 .…

深入理解 Spring Boot Starters 原理(手写Spring boot Start)

一、Spring Boot Starter诞生原因 Spring Boot Starter是在SpringBoot组件中被提出来的一种概念&#xff0c;stackoverflow上面已经有人概括了这个starter是什么东西&#xff0c;想看完整的回答戳这里 Starter POMs are a set of convenient dependency descriptors that you …