本文要点
- 与传统的.NET Framework 相比,.NET Core 平台具有显著的性能优势。
- .NET Core 在 Microsoft 平台之外也广为采用,并受益于强大的社区参与。
- .NET Core 在设计上采用以服务器为中心,而非聚焦于 Windows。.NET Core 开发受益于这种设计。
- .NET Core 现已成为一种适用于新应用开发的稳定平台。
随着.NET Core 2.0 的发布,这个最初发布于 2016 年的平台终于有了最新的主版本,该平台具有通用性、模块化、跨平台和开放源代码的特性。.Net Core 涵盖了当前.NET Framework 版本中可用的很多 API。其初衷是为下一代 ASP.NET 解决方案提供支持,但现在却已成为其它许多应用场景的基础,例如物联网、云计算和下一代移动解决方案。在本系列文章中,我们将探讨.NET Core 的一些优势,以及它如何给传统.NET 开发者以及所有需要为市场提供强大、高性能和经济解决方案的技术人员带来好处。
这篇是“.NET Core ”系列文章的一部分。读者可以通过订阅 RSS 接收更新通知。
在本文中,五位资深开发人员对.NET Core 平台开展做了一次探讨,内容涉及.NET Core 的应用情况,以及其未来的发展方向。通过本文,读者可一窥平台的优缺点,并确定自己是否可在未来做开发时从中受益。
讨论小组成员
- Jeff Ammons
- Jeremy Miller
- David Pine
- Mark Rendle
- Spencer Schneidenbach
InfoQ:先请大家做个简要的自我介绍,以及目前使用.NET Core 的情况。
Jeff:我早在.NET Core 还被称为 ASP.NET vNext 时就开始跟进。虽然我在 2012 年几乎远离了 Microsoft 开发,但是 vNext 让我重拾旧业!我从 2014 年开始着手宣讲 Core,因为在我看来,它为服务器端 /Web 项目提供了一个更好的基础。
Jeremy:我牵头了多个.NET 社区的 OSS 项目,其中部分项目的目标就是混用整个.NET Framework 和 NETStandard。
David:我自 2015 年下半年以来就一直在使用.NET Core 做开发。此后在 2016 年 1 月,我开始做 PoC(概念验证,Proof-of-Concept)应用。从那时起,我们整个团队一直在积极使用.NET Core 做开发。我们借助 ASP.NET Core 构建企业 Web 应用。在当时,它还被称作 ASP.NET 5,依赖于.xproj 文件格式和 project.json。我认为自己是一名.NET Core 的早期采用者,非常高兴看到.NET Core 的发展。同样,我对开发者社区心存感激,正是社区帮助该 Microsoft 产品定型发展,并使其发展超出人们的预期。我相信 NET Core 只会变得更好。
Mark:我从开始就是一位.NET 用户,并自第一次预览版发布以来就在持续使用.NET Core,当时它被称为 Project K。我一直为团队和组织提供培训课程和咨询,其中包括.NET Core 本身,以及其开放的新生态系统,诸如 Linux、Docker、Kubernetes 等。我目前正在开发关于使用 ASP.NET Core 构建云原生应用的一系列在线课程。
Spencer:我曾在一些新建的项目中使用了.NET Core,这些项目主要是将 ASP.NET Core 用做 React-Redux 应用的后端。我还召集了数次 ASP.NET Core 的研讨会,其中一次是聚焦于 Angular,还有一次是聚焦于 ASP.NET Core 本身。它们均可由.NET Core 提供支持!
InfoQ:你们喜欢.NET Core 的哪些强大之处?
Jeff:每次我在做关于 Core 的演讲中,该问题都会被问及。例如,“作为一名 Windows 开发人员,我为什么要关心跨平台问题?”。答案就在于性能上的考虑。最初,.NET 是在单台 Windows 计算机上针对单用户做的优化。与针对多台服务器上的大量用户做了优化的技术(例如 Node 等)相比,.NET 如果仅绑定于 Windows 并面向单一用户,那么其将难以在多用户服务器环境中创建超高性能的应用。Core 使得 Microsoft 得以将开发基础重置为以服务器为中心的模式。
Jeremy:我个人最喜欢之处在于它是跨平台的。我能够将.NET Core 的大部分开发工作移植到其它操作系统上。虽然简化 csproj 文件格式正的确是朝正确方向迈出的一大步,但我仍希望.Net Core 能够保持更简洁的 project.json 格式。dotnet cli 工具是我编写的书中的一个亮点。相比以往而言,它极大地简化了 OSS 工具脚本的构建,最终以简洁的命令行工具启动和管理项目文件。改进的 Nuget 工具结合了更好的 csproj 文件格式,这极大地降低了我们在上一代经常会碰到的 Nuget 和 Visual Studio.Net 的合并冲突问题,无需诉诸于 Paket 这类大多数开发人员不太了解的工具。
David:很明显,.NET Core 的开源、跨平台和卓越性能会受到大多数开发人员的喜爱。 但我的喜欢之处在于.NET Core 依然是.NET。如果你曾经在.NET 中做过开发,尤其是使用过 C#,那么你就会接触到那些优秀的工具、令人叹为观止的社区,以及世界上最强大的编程语言之一。我相信.NET Core 对 Microsoft 而言是迈向正确方向的一步,这对于所有的框架开发人员来说尤为重要。开放源码和跨平台应该成为标准。开发人员可以对 C#语言或者是.NET Core 中的一项功能做出贡献,并产生影响,这是 Microsoft 所取得的一项令人难以置信的成就。赋予开发人员阅读源代码、设计实现和运作内部架构的能力是非常有必要的。为此,我向 Microsoft 脱帽(“红帽子”,Red Hat)致敬。
Mark:.NET Core 的强大之处主要在于跨平台支持。事实上,你可以开发一个运行在 Windows 或 Linux 上的独立应用,或者使用 macOS 开发可在 x86 和 ARM CPU 上运行的应用,这一点令人惊叹。最重要的是,由于采用了正确的开源发展方式,我们已经看到了由社区给出的一些惊人贡献。这使得其性能得到了改善,尤其是在网络方面,并且还有更多的改进即将推出。我们可以在继续使用 C#以及一些熟悉的框架和库的情况下,获得所有这些现代优点,这是非常美妙的事情。
Spencer:跨平台绝对是.NET Core 的最大卖点和最大优势。我先前曾提出过这一观点,即.NET Core 旨在吸引下一代的开发人员,而非那些目前使用.NET Framework 的开发人员。但是,随着.NET Core 中添加了越来越多的功能(例如 System.Drawing 和 System.DirectoryServices 等,不胜枚举),我想我们会看到更多的.NET 开发人员和商店转移到.NET Core。
InfoQ:目前.NET Core 中是否还存在一些缺点,这些缺点是你们希望在未来能得到改进的?
Jeff:一些重要遗漏将会随时间的推移而得到添加。在过去一年中,改善就非常显著。去年秋天之前,Core 的巨大弱点在于.NET、ASP.NET 和 Visual Studio 团队之间的脱节问题。但是在秋季发布之后,团队的脱节问题得到了解决,这才使我可以向其他人推荐使用 Core 做开发。另一个很好的例子是 project.json 转换为 *.csproj 的彻底失败。但是该过程的变化过晚,因此对于早期创建生产项目的人而言,这无疑是一种惩罚。我们需要 Core 能达到一个稳定的高度,才可以认真地考虑着手采纳的问题。
Jeremy:在我看来,如果开发人员需要直接编辑 csproj 文件,那么目前的文件格式仍然过于繁琐。为消除一些 MSBuild 内部关注的问题,同时将文件格式推向用户友好的方向,Core 在工具和文件格式方面还存在着一定的改进余地。我非常希望看到能推出 AssemblyLoadContext 概念,并以此作为曾经的 AppDomain 模型的一个轻量级继任者。
David:当前,.NET Core 的一个主要弱点就是随之而生的一些误解。无数的开发人员仍然在问,“.NET Core、.NET Standard 和.NET Framework 有什么区别?”。类似问题还包括,开发人员应该选择哪一个,以及为什么。选择并非总是那么简单或清楚。例如,实际上可能存在以.NET Framework 为目标的.NET Core 应用。这样的应用的确可能会令人困惑,因为我们知道.NET Framework 和.NET Core 都是.NET Standard 的运行时实现。.NET Core 的术语被重载,存在.NET Core 应用、.NET Core CLI、.NET Core SDK 和.NET Core 运行时。我相信,在使所有这些术语更易于理解和使用的方面上还有很大的提升空间。
Mark:Core 在性能方面还有一些工作要做。例如,在 TechEmpower“纯文本”基准测试中,ASP.NET Core 的 Web 服务器 Kestrel 表现极佳;但在涉及数据库查询等的高级测试中,Kestrel 则表现不佳。在性能方面上,大部分从完全(full-fat).NET Framework 迁移过来的代码都可以得到很大的改进。好消息是,现在人们正在深入研究代码,并挖掘这些性能问题。
Spencer: Core 缺乏一些与.NET Framework 相匹配的功能。这意味着当前的.NET 开发人员在尝试.NET Core 时,必须要决定.NET Framework 的某些核心功能是否值得弃用。如果你正在使用 System.Drawing、System.DirectoryServices,或是某些仅针对.NET Framework 的框架,那么你就不会那么好运了。ASP.NET Core 已经是一个非常成熟的产品,从 ASP.NET MVC/Web API 转向非常简单,但并非所有的事情都是如此。例如,Entity Framework 6 到 EF Core 的转换就并非易事。
InfoQ:如果现在你要为组织启动一个新项目,你会选择.NET Core 而非.NET Framework 吗?原因是什么?
Jeff: 是的,我就是这样做的!服务器端性能是我做出选择的一个主要原因。另一个主要原因是 MVC 和 WebAPI 控制器的整合。对我而言,具有两个独立的代码库是毫无意义的。第三个原因是标签助手(Tag Helpers)。我希望我的 HTML 看上去尽可能更像是 HTML。我一向不喜欢
@Html.ActionLink(“Which param is this”, “Or this”, “Wait What Is This One Again”, new { @class = "OhComeOnYouMustBeKidding"})
这样的风格。添加 CSS 类绝对是一个最好的做法。我非常喜欢这样的风格:
<a asp-controller=”book” asp-action=”edit” class=”MyCSS”>Edit</a>
Jeremy:当然是的,并且我们已经这样做了。主要原因在于.NET Core 对于更多的主机和开发选项而言是跨平台的。
David:我会选择.NET Core 而非.NET Framework。对我来说,这个选择非常简单,因为我没有开发任何新的 WinForms、WPF、WCF 或 ASP.NET WebForms 应用。我很高兴使用 Microsoft 提供的最新的、最伟大的技术。到目前为止,我唯一期望的就是能看到即将推出的 SignalR。在我看来,进步是直截了当的,这是朝着正确方向迈出的一步。我唯一关心的问题是关于.NET Core 的可用性。只有一个选项是有点令人沮丧。事实上,我宁愿 Microsoft 只是声明我们现在需要全部使用.NET Core,并且可以具有以.NET Framework 为目标的 TFM(目标框架名字对象,Target Framework Moniker)。
Mark:对于一个新的项目,我绝对会默认使用.NET Core。最显著的原因在于.NET Core 应用性能的提高和占用空间的减少,这意味着无论是对于云还是私有数据中心,可真正做到在基础架构上的成本节省。我主要从事 Web 和后端服务开发,能够使用 Docker 和 Kubernetes 等容器编排工具跨平台开发和部署应用,这是一项真正的优势。对于具有 WPF、UWP 或 Xamarin 移动组件的混合项目,使用.NET Standard 可让开发人员在整个.NET 或 Xamarin 项目与.NET Core Web 或服务项目之间共享软件包。
Spencer:我的组织在.NET Framework 上运作得很好,所以现在可能不会考虑.NET Core。但是我们希望在某个时候重新开发我们的平台。我们届时将会认真地考虑.NET Core。不必被锁定到基于 Windows 的托管,这是一件非常好的事情,但当前对我们并不是一个大问题!
InfoQ: 你们认为.NET Core 的发展是否会超越 Microsoft 之外,还是会继续局限在现有的.NET 开发者社区中?
Jeff:我希望如此。这是 Microsoft 首次有机会必须面对新一代的 Web 开发人员,这些开发人员认定必须使用 Mac 做开发。我在课堂上以 VS Code 入手讲授 Core。尽管我越来越喜欢 Code,但毫无疑问,完整的 Visual Studio 具有更高的生产率。目前为止在深入学习了 ASP 乃至 Core 之后,大多数从 Mac 或 Linux 入手的学员都会转向使用 Windows。我们希望能改进非 Windows、非 Visual Studio 开发人员的体验。
Jeremy:如果在 TechEmpower 趋势图上,基于 ASP.Net Core 的架构能保持攀升势头,情况或许会是如此。.Net Core 必须要克服数十年来存在的一些关于 Microsoft 开发技术和文化的陈旧观念。
David:我认为.NET Core 的发展已经超出 Microsoft 之外。从统计数字上看,.NET Core 代码库事实上每天都会接受来自于非 Microsoft 雇员处的 Pull 请求。此外,.NET 基金会有 1700 多家公司为.NET 生态系统做出贡献,具有 550 多个以.NET 为核心的源代码库!认真想来,这非常不同寻常。如果 Microsoft 不公开源代码,那么这些都是不可能的做到的。.NET 开发人员社区与以往一样的强大。
Mark:我很希望看到.NET Core 的发展壮大,吸引更多来自于其它生态系统的开发人员。它已具有大量的社区支持,似乎主要来于已有的.NET 社区,尽管我们可以看到某些行业对此展示出越来越浓厚的兴趣。三星就是一个很好的例子。该企业已经在其 Tizen 操作系统中采用了.NET Core。我们很高兴看到 Amazon 和 Google 也已加强了对云平台的支持,包括提供很好的 SDK 支持。感觉 Core 项目像是一个开始,即更开放的 Microsoft 开始更积极地参与其它的社区。我希望该项目能继续发展,使得这些社区继续与 Microsoft 合作。
Spencer: 很难说。我认为信任是 Microsoft 在开源领域中存在的最大问题,但是他们已经取得了巨大的进步。Visual Studio Code 就是一个例子,它对开源软件的各个方面都已产生了重大的影响。我认为时间会证明一切。
InfoQ:你们认为.NET Core 在未来两年中将会如何发展?
Jeff: 我期望 Core 的发展轨迹能遵循我们所见的 MVC 发展的同一轨迹。起初,MVC 由于与 Web Forms 存在一些迥异之处,因此并未受到 Microsoft 开发人员的喜爱。之后,在开发人员勉为其难地尝试之后,他们的态度发生了转变,进而开始喜欢使用它。现在,开发人员对 Core 的感受也是一样的。其中的一个巨大的差异之处在于,开发人员的 MVC 和 WebAPI 上技能可以得到更多的转换,大大地超过了可转换为 MVC 的 Web Forms 技能。
Jeremy:如果在以 Netstandard 2.0 为目标的项目中使用旧的.Net 库是切实可行的,我认为更多的开发团队最终会跳到.Net Core。目前出于项目依赖性尚未针对 Netstandard 的顾虑,这些团队可能会犹豫不决。
David: 我并不认为.NET Core 真的有什么特别之处。随着它越来越受欢迎,它将会得到日益广泛地采用。.NET Core 的工具将变得更高效、无缺陷并且更为实用,进而提高开发人员的工作效率。我相信,.NET Core 将成为.NET 生态系统内新开发工作的一个行业标准。在 ASP.NET Core 中引入更好的 SPA(单页面应用,Single Page Application)实例并非我的关注点。尽管据我所知,现在已有一些 JavaScriptServices 代码库,可以帮助开发人员构建 Angular 或 React 之类的项目,但我还是希望 Microsoft 能够涉足客户端框架。Microsoft 已经给出了 TypeScript,因此已在朝着正确的方向推进!
Mark:现在大企业客户开始认真考虑是否可对新项目使用.NET Core,这是我们当前所处的采纳曲线阶段。这种趋势将持续下去,并有望推动更广泛的生态系统向前发展。如果看一下.NET Core、ASP.NET Core、C#等一些项目的路线图,它们已经推出了一些非常令人惊奇的进展。其中的 CoreRT 是我最喜欢的一个项目,它为.NET 提供了 AoT 编译,支持开发人员构建不带运行时依赖项的独立可执行文件。这些项目也增加了对 WebAssembly 的支持,支持开发人员编写并编译 C#代码,在浏览器中执行复杂的处理。我非常期待看到未来的发展!
Spencer:增加一些与.NET Framework 相对应的特性,可能将有助于推动.NET Standard 的发展。
InfoQ:大家最后再谈谈看法?
Jeff:相比于推出新特性而言,长期稳定性将成为考虑采用 Core 时更看重的因素。Core 正在接近于此。我是“长期支持版到当前版”模式(LTS vs Current Model)的坚定支持者,这种模式正被 Node、Ubuntu 等使用。从一个组织的角度考虑,我需要了解是否可以押注一种技术,该技术在必须要做出重大改变之前,至少会保持 3 到 5 年的稳定期。同时,我也需要知道该技术的创新也是在稳步推进的。
Jeremy:至少在 Netstandard 2 之前,.NET Core 的杀手级问题就是,其在从.NET OSS 生态系统分离出来时,如何避免出现像臭名昭著的 Python 3 发行版那样的问题。要实现完整的框架和.NET Core 的多目标并非易事,这可能会成为 OSS 开发时的一个阻碍。
David:我一直惊讶于对.NET Core 或 ASP.NET Core 闻所未闻的.NET 开发人员数量。我相信 Core 是新 Microsoft 的一部分,作为开发人员肯定是要对此亦步亦趋的。在我的全部编程生涯中,这的确将成为一个我会讲述给孙辈们的创新经历,“令人记忆犹新的是,当年 Microsoft 同时推出了开放源代码和跨平台。他们将其称为.NET Core,孩子们,请不要介意这个名字”。的确,这是一个激动人心的时刻!
Mark:正如大家从我的谈话中可以看出,我是.NET Core 的一位忠实粉丝。如果你正启动一个新的 ASP.NET 项目,你应该使用 Core。它与.NET 非常相似,所以你能很快就开始运行。它也是稳定的,并正得到一些开源的生态系统的支持。它只会变得更好。
讨论小组成员简介
Jeff Ammons 是 Code Career Academy 的首席讲师,在亚特兰大周边区域讲授 Microsoft Stack 和 Node.js 网页开发。Jeff 具有 Microsoft MVP 和 Pluralsight author 认证,经常在用户组、一些聚会和会议上发表演讲。他曾就职于多家不同规模的公司,任开发人员达 25 年以上,职位从开发人员到首席软件架构师。
Jeremy Miller 是德克萨斯州奥斯丁市的一位开发人员和软件架构师,也是多个 OSS 工具的作者。他的个人博客是 jeremydmiller.com 。
David Pine 是位于威斯康星州的 Centare 公司的一位技术布道师,也是一名 Microsoft MVP。David 喜欢在技术社区分享知识,并在一些区域性会议、用户组和技术会议上做演讲。David 热衷于通过写作来分享自己的想法,并积极维护着个人博客。
Mark Rendle 是一位具有近 30 年行业经验的软件开发人员。他是一名自由顾问、培训师和开发人员,定期在世界各地的.NET Core、构建现代应用和服务相关的会议上演讲。可在Twitter 上关注Mark 。
Spencer Schneidenbach 是一位居住在密苏里州圣路易斯市的软件架构师、API/ 集成专家,也是一名 Microsoft MVP。Spencer 具有个人博客。
评论