1.1 ASP.NET Core发展史
首先,在讨论ASP.NET Core之前,先说一下另一个基本概念,那就是平台和框架是什么意思?相信本书的读者,大部分都是与计算机相关的从业人员,不论是产品经理,还是软件工程师,或是系统架构师,对于我们来说,“平台(Platform)”是一个每天都会说到的词语,在不同的地方它具有不同的含义,在软件领域中,它可以指代操作系统环境和CPU架构类型,也可以表示硬件设备类型,当然还有复杂的云服务平台。
1.1.1 站在巨人的肩膀上
那么到底什么是ASP.NET Core呢?来看一下官方的概念:
ASP.NET Core是一个跨平台的高性能开源框架,用于生成启用云且连接Internet的新式应用。使用ASP.NET Core,可以生成Web应用和服务、物联网(IoT)应用和移动后端。在Win-dows、macOS和Linux上使用喜爱的开发工具,部署到云或本地。
如果要详细讨论.NET Core,就肯定离不开.NET Framework这个框架。自从2000年开始,经过多年的苦心经营,微软已经在Windows平台下构建了一个完整的支持多种设备的.NET生态系统。
微软在2002年推出了第一个版本的.NET Framework,这是一个主要面向Windows桌面端(Windows Forms)和服务端(ASP.NET Web Forms)的基础框架。在此之后,PC的霸主地位不断受到其他设备的挑战,为此微软根据设备自身的需求对.NET Framework做了相应的简化和改变,不断推出了针对具体设备类型的.NET Framework,主流的包括Windows Phone、Windows Store、Silverlight和.NET Micro Framework等,它们分别对移动、平板和嵌入式设备提供支持。
与此同时,通过借助于Mono和Xamarin,.NET已经可以被成功移植到包括macOS X、Linux、iOS、Android和FreeBSD等非Windows平台。但是设备运行环境的差异性导致了针对它们的应用不能构建在一个统一的.NET Framework平台上,所以微软采用独立的.NET Framework平台来对它们提供针对性的支持。
由于这些不同的.NET Framework分支是完全独立的,这使我们很难开发一个支持多种设备的“可移植(Portable)”应用。微软目前发布的最新.NET Framework版本为4.7,作为整个.NET平台的基础框架,.NET Framework在不断升级的过程中,使自己变得更加强大和完备,但是在另一方面也使自己变得越来越臃肿。随着版本的不断升级,构成.NET Framework的应用模型、BCL和运行时(CLR)都在不断膨胀。
就这样,因为自身的一些束缚和限制,想要做一些快速的迭代和更新,就变成了一件不是很容易的事,它就像一座大山,挡在了微软快速发展的高速路上。与此同时,随着整个互联网行业的分布式与跨平台的呼声愈发强烈,除了框架自身越来越臃肿之外,如何实现从强依赖Windows系统,到可以任意平台运行,这也是摆在微软面前的另一座大山。
从本质上讲,按照CLI规范设计的.NET Framework从其诞生的那一刻开始就具有一定的跨平台基因。由于采用了统一的中间语言,微软只需要针对不同的平台设计不同的虚拟机(运行时),就能弥合不同操作系统与处理器架构之间的差异,但是做起来并不是一帆风顺的。在过去十多年中,微软将.NET引入到了各个不同的应用领域,表面上看起来似乎欣欣向荣,但是由于采用完全独立的多目标框架的设计思路,导致针对多目标框架的代码平台只能通过PCL这种“妥协”的方式来解决。如果依然按照这条道路走下去,.NET的触角延伸得越广,枷锁将越来越多。
所以.NET已经到了不得不做出彻底改变的时候了,当然,微软并不是从0开始,.NET Framework这个巨人,为微软能做一个可以跨平台并能快速迭代的新框架,提供了巨大的帮助。
1.1.2 将开源进行到底
上边我们重点说到了轻量级快速迭代和跨平台两大新特性,要真正实现.NET的跨平台目标,主要需要解决两个问题,一是针对不同的平台设计相应的运行时,为中间语言CIL提供一个一致性的执行环境,二是提供统一的BCL以彻底解决代码复用的难题。对于真正跨平台的.NET Core来说,微软不仅为它设计了针对不同平台被称为CoreCLR的运行时,同时还重新设计了一套被称为CoreFX的BCL。.NET Core目前支持的AppModel主要有两种,其中ASP.NET Core用于开发服务器Web应用和服务,而UWP(Universal Windows Platform)则用于开发能够在各种客户端设备上运行的通用应用平台。迁移的过程是很复杂的,本书主要偏重于实战,这里不再做过多的讨论和讲解。
微软为了实现自己的跨平台战略,经过架构师们夜以继日的努力,终于在2016年,将.NET Framework提取出了.NET Core版本,同年发布了1.0版本,并在GitHub上正式开源,在GitHub上的地址是https://github.com/dotnet/core。与此同时,发布了ASP.NET Core RTM版,正式版发布于2017年。
从此.NET Core带着它的“小伙伴” EF Core和ASP.NET Core一路高歌猛进,然后发展成了如今的现状。
截至目前.NET 5.0正式发布,一共包含9个大版本的发布时间和主要核心产品特征,从.NET Core 1.0到.NET 5.0,作者都参与其中。不过.NET Core是从2.0以后才正式走向了成熟,作者核心的多个开源项目,也都是基于.NET Core 2.0进行迭代的。到目前为止,.NET Core的9大核心版本如表1-1所示。
表1-1 .NET Core发展版本特征表
微软在开源的道路上一直是态度坚决且认真的,自从.NET Core 3.0核心组件完善以后,.NET Core项目已经基本完成,但是却依然保持着快速更新迭代的步伐,从微软这几年的迭代路线来看,以后每年都会发布一个大版本,核心版本则为长期支持(LTS)版本。如图1-1所示。
●图1-1 .NET Core的迭代路线
.Net Core可以用来开发各种不同的应用程序,例如移动端、桌面端、Web、Cloud、IoT、机器学习、微服务、游戏开发等。.Net Core是从头到尾重新开发的一个模块化、轻量级、快速的、跨平台框架。它包含了运行一个.NET Core基本程序所必需的核心特性。其他特性,例如NuGet包,可以根据需要添加到应用程序中,所以.Net Core启动快,占用内存少,并且易于维护,当然还有其他的优点。
(1)开源的框架:.NET Core是一个开源的框架,由微软维护,此外.NET Core是一个.NET基金会项目。
(2)跨平台:.Net Core可以运行在Windows、macOS以及Linux操作系统上,对于每个操作系统有不同的.Net Core运行时,执行代码,生成相同的输出,操作十分简单。
(3)一致的架构:在不同的指令集架构中,以相同的行为执行代码,包括x64、x86以及ARM。
(4)支持广泛领域的应用:各种不同类型的应用程序,都能被开发并且运行在.NET Core任意平台上。
(5)支持多个语言:可以使用C#、F#,以及Visual Basic编程语言来开发.NET Core应用程序。可以使用自己喜欢的开发工具(IDE),如Visual Studio、Visual Studio Code、Sublime Text、Vim等。
(6)模块化的结构:.Net Core通过使用NuGet包管理,支持模块化开发。有各种不同的NuGet包,可以根据需要添加到项目中,甚至.NET Core类库也是以包管理的形式提供的。.NET Core应用程序默认的包就是Microsoft.NET Core.App,其模块化的结构,减少了内存的占用,提升了性能,并且更易于维护。
(7)CLI工具:.Net Core包含CLI(Command-line interface)工具用于开发和持续集成。
(8)更灵活的部署:.Net Core应用程序可以部署在用户范围内、系统范围内、Docker容器中。
(9)兼容性:.NET Core通过使用.NET标准,可以兼容.NET Framework以及Mono的部分API,特别是.NET 5.0正式推出以来,实现了大一统的战略目标。
说到一个框架的优劣标准,有两大核心的标准,一是社区的活跃度,在国内很多省市都会有一个当地的.Net俱乐部,定期举办一些活动,比如讲座或者比赛,每个俱乐部都在如火如荼地开展着,同时微软每年都会有一个开发者Conf大会,这里是技术的盛宴,集结了国内外的.NET开发人员和爱好者,从这么多的活动和组织来看,其活跃度可见一斑。
另一个标准就是开源框架自身的性能问题,目前关于框架性能检测的平台有很多,最广泛的就是TechEmpower了,他们会定期对全球的Web框架,从JSON序列号,数据并发与大数据处理等多方面进行评分,地址是http://www.techempower.com/benchmarks/,我们可以通过这个Web框架性能测试来看看ASP.NET Core的性能到底如何。
为了更有说服力,作者勾选了目前全球主流的平台、语言进行对比,如图1-2所示。
目前采用的是Round 20(2021-02-08),即第二十轮的数据标准,结果如图1-3所示。
在.NET相关框架大版本发布时,每次都有关于性能提升的报告。ASP.NET Core的性能与Go的Web框架旗鼓相当。如图1-4所示。
整体效果还是特别明显的,如果对主流的框架进行筛选,.NET Core排名肯定会更高。
在以前,每次说到微软,都会提到微软闭源的诟病,从.NET Core正式公布那一刻,.NET就走向了开源的道路,项目代码采用MIT许可协议。与此同时,微软为了推动.NET开源社区的发展,2014年联合社区成立了.NET基金会。基金会的创始成员中,有六位均非微软公司员工,随着微软的收购动作,Miguel也成了微软员工,Miguel一直在努力让.NET基金会独立于微软。
●图1-2 目前主流的平台和语言
●图1-3 主流框架性能对比排序
●图1-4 .NET 5与其他框架速度对比
.NET基金会是一个独立的组织,支持.NET社区和开源,旨在拓宽和加强.NET生态系统和社区。这可以通过多种方式完成,包括项目指导,法律和营销帮助,技术和财务支持设置等。2014年以来已经有众多知名公司加入了.NET基金会,仅在平台项目中,.NET平台上有87%的贡献者其实不在Microsoft工作。在.NET Conf 2019上,AWS加入了支持.NET基金会的.NET开源生态系统中有越来越多的行业领导者,这些成员包括Microsoft、Google、Red Hat、JetBrains、Unity、三星、Pivotal、Insight和Telerik、AWS等公司。
直到今天,.NET已经完成了华丽的蜕变,从一个闭源的、单一平台的.NET Framework臃肿框架,变成了一个积极开源并大力拓宽生态社区的、跨平台的、轻量级的.NET Core便捷框架。
1.1.3 .NET的未来
从2016年到2020年,.NET Core已经取得了巨大的进步和发展,被众多的厂商所接受和认可,但是微软的目标不会仅限于此,2020年11月,微软正式发布了.NET 5.0版本,那么什么是.NET 5呢?官方是这样解释的:.NET 5 = .NET Core vNext。
.NET Core是.Net的未来,而.NET 5又是.NET Core的未来发展。
.NET 5已经融合了三方的技术,正式更名为.NET:单个SDK,一个BCL,统一的工具链;单一开源代码库;跨平台原生UI;投资于云原生;在速度、尺寸、诊断等方面持续改进;选择性合并.NET Framework,mono/xamarin,完全兼容.NET Core 3.1。
在微服务盛行的年代,肯定是一个多语言,多服务,大融合的时代,.NET已经致力于并实现了这个目标,特别是在容器化、云原生、人工智能等方面有着长足的发展。
截止2021年5月,全球有超过500万的.NET开发者。2020年的跨平台.NET Core活跃开发者数量增长超过60万。而这些数据仅来源于Visual Studio IDE,不包含使用其他IDE的开发者。
在2020年的Stack Overflow开发者年度调查报告中,ASP.NET Core被评为最受欢迎的开发框架,参考地址https://insights.stackoverflow.com/survey/2020 # technology-most-loved-dreaded-and-wanted-languages-loved。如图1-5所示。
●图1-5 2020年最受欢迎的Web框架排名