零、前言

微软发布了其开源和跨平台网络应用框架的第二个主要版本——ASP.NET Core。这是在.NET Core,也是开放的,现在也是版本 2。ASP.NET Core 主要用于 C#编程语言,但也可以使用 F#和 VB.NET。你不再局限于在 ASP.NET 使用 Windows,现在你可以在 Mac 上开发并部署到 Linux。新平台还提供了更高的性能。

版本 2 就是版本 1 应该有的样子,因为第一个稳定版本还没有真正做好生产准备。在发布候选阶段很晚才做出重大更改。谢天谢地,有了新的工具,事情已经稳定下来,你现在可以认真使用 ASP.NET Core 了。

在当今世界,一个 web 应用只在开发人员的工作站上运行良好,而在生产中却无法提供高性能,这是不可接受的。web 应用现在大规模部署的方式已经改变,开发实践必须适应以利用这一点。通过阅读这本书,你将了解制作高性能网络应用的现代方式,以及如何使用 ASP.NET Core 来做到这一点。

这是一本高水平的书,提供了适用于任何编程栈的 web 应用开发的性能提示。但是,它特别关注 C#和 ASP.NET Core。读者应该已经知道如何建立一个网络应用,虽然不一定在.NET Core。

这本书从一般的角度(HTTP、HTTPS、HTTP/2、TCP/IP、数据库访问、压缩、输入/输出、资产优化、缓存、消息队列和其他关注点)以及从 C#、asset 核心和.NET Core 视角。这包括深入研究最新框架的细节和演示提高性能的软件设计模式。

常见的性能缺陷将被突出显示,这些缺陷通常会在开发人员工作站上被忽略,同时还会有策略来早期检测和解决这些问题。通过提前了解和解决挑战,就可以避免实时部署带来的任何令人不快的意外。

将引入许多性能改进,以及它们带来的权衡。我们将采取科学和基于证据的方法,关注大问题,避免影响不大的更改,从而在过早优化和低效代码之间取得平衡。

我们假设您理解性能对于 web 应用的重要性,但是我们将回顾为什么它是至关重要的。然而,你可能没有任何具体的或可操作的建议,或者对野外发生的性能问题没有太多经验。

通过阅读这本书,您将了解当 web 应用大规模部署到分布式基础架构时会出现什么问题,并且您将知道如何避免或减轻这些问题。您将获得如何编写高性能应用的经验,而不必费力地了解问题,可能是在深夜。

你会看到 ASP.NET Core 有什么新东西,为什么要从头开始重建,这对性能意味着什么。你会明白…的未来.NET Core,以及现在如何在 Windows、macOS 和 Linux 上开发和部署。您将欣赏 ASP.NET Core 中新功能的性能,包括对 Razor 视图引擎的更新,并且您将了解跨平台工具,如 Visual Studio Code。

这本书涵盖了什么

第一章ASP.NET Core 2 有什么新变化,总结了 ASP.NET Core 1.0 和 ASP.NET Core 2.0 的重大变化。我们还将探究该项目的历史,以展示为什么它是一个如此移动的目标。我们将看看 C# 6.0 和 C# 7.0 中的一些新功能,看看它们如何让您的生活变得更轻松。我们也会报道.NET 标准 2.0 以及这如何提高库的可移植性。

第二章为什么性能是一个特性,讨论了这本书的基本前提,说明了为什么需要关心软件的性能。响应性应用至关重要,仅仅让功能发挥作用是不够的;他们也需要快。想想你最后一次听到有人抱怨某个应用或网站,很可能他们对性能不满意。性能差不仅让用户不开心,还会影响你的底线。有很好的数据表明,快速的表现可以提高参与度和转化率,这就是为什么它会得到搜索引擎的回报。

第 3 章设置您的环境,展示了如何在您选择的操作系统上开始使用最新的工具。如果你想用. NET 开发,就不再需要在 Windows 上使用 Visual Studio 了。我们将介绍 VS 2017 和的新集成工具。网芯和 ASP.NET 芯。我们还将介绍用于 Mac 的 Visual Studio(以前称为 Xamarin Studio)和多平台 VS 代码编辑器(使用 TypeScript 和 web 技术构建)。我们将展示如何使用 Docker 容器使跨平台开发变得容易和一致。我们还将看一下 dotnet 命令行工具。

第 4 章测量性能瓶颈表明,解决性能问题的唯一方法是仔细测量您的应用。如果不知道问题在哪里,你解决问题的机会就非常渺茫,你甚至不知道你是改善了事情还是让事情变得更糟。我们将重点介绍几种手动监控性能的方法,以及一些可用于测量统计数据的有用工具。您将看到如何深入了解软件的数据库、应用、HTTP 和网络级别,这样您就知道内部发生了什么。我们还将向您展示如何构建您自己的基本计时代码,并介绍对结果采取科学方法的重要性。

第 5 章修复常见性能问题,查看一些最常见的性能错误。我们将展示如何解决一系列不同应用领域的简单问题,例如,如何通过调整图像大小或编码来优化媒体,选择 N+1 个问题,以及异步后台操作。一旦您知道了瓶颈所在,我们还将讨论使用硬件来提高性能。这种方法可以为你赢得一些时间,让你以合理的速度妥善解决问题。

第 6 章解决网络性能,深入到支撑所有网络应用的网络层。我们将展示远程资源如何降低您的应用速度,并演示您可以如何测量和解决这些问题。我们将研究互联网协议,包括 TCP/IP、HTTP、HTTP/2 和网络套接字,以及加密入门知识,以及所有这些如何改变性能。我们将讨论文本和图像资产的压缩,包括一些奇异的图像格式。最后,我们将在浏览器、服务器、代理和内容交付网络(CDN)级别介绍缓存,展示一些基础知识。

第 7 章优化输入/输出性能,重点关注输入/输出以及这会如何对性能产生负面影响。我们将研究磁盘、数据库和远程应用编程接口,其中许多都使用网络,尤其是在虚拟化的情况下。我们将通过聚合和采样来处理您的请求并优化数据库使用,旨在减少所需的数据和时间。由于网络在云环境中无处不在,我们将花费大量时间进行网络诊断,包括 ping、路由跟踪和在域名系统中查找记录。您将了解延迟是如何受物理距离或地理位置影响的,以及这会如何给您的应用带来问题。我们还将演示如何使用. NET 构建您自己的网络信息收集工具

第 8 章理解代码执行和异步操作,跳到错综复杂的 C#代码,看看它的执行如何改变性能。我们将看看组成 ASP.NET Core 和的各种开源项目.NET Core,包括红隼,一个高性能的网络服务器。我们将研究选择正确数据结构的重要性,并查看不同选项的各种示例,例如列表和字典。我们还将研究散列和序列化,并执行一些简单的基准测试。您将学习一些可以通过并行化来加快处理速度的技术,例如单指令多数据(SIMD)或使用任务并行库(TPL)和并行 LINQ (PLINQ)的并行扩展编程。您还将看到一些由于性能损失而最好避免的做法,例如反射和正则表达式。

第 9 章学习缓存和消息队列,最初看缓存,大家普遍认为很难。您将看到在浏览器、网络服务器、代理和 cdn 中,从 HTTP 的角度来看缓存是如何工作的。您将了解强制更改的缓存破坏(或破坏),以及在现代浏览器中使用新的 JavaScript 服务人员来更好地控制缓存。

此外,我们将检查基础架构中应用和数据库级别的缓存。我们将看到内存缓存(如 Redis)的好处,以及这些缓存如何降低数据库负载、降低延迟并提高应用的性能。

我们将研究消息队列作为构建分布式可靠系统的一种方式。我们将用一个类比来解释异步消息传递系统是如何工作的,我们将展示一些常见的消息队列风格,包括单播和发布/订阅。

我们还将展示消息队列如何通过广播缓存失效数据对内部缓存层有用。您将从. NET 中了解消息代理,如 RabbitMQ,以及与它们交互的各种库。

第 10 章性能增强工具的缺点集中在我们已经讨论过的技术的负面影响上,因为没有什么是免费的。我们将讨论降低复杂性、使用框架和设计分布式体系结构的各种方法的优点。我们还将介绍项目文化,并了解高性能不仅与代码有关,还与人有关。

我们将研究解决分布式调试问题的可能解决方案,并查看一些用于集中管理应用日志的可用技术。我们将简要介绍统计数据,以帮助理解您的性能指标,我们还将涉及管理缓存。

第 11 章监控性能回归,再次关注测量性能,但在本例中,是从自动化和持续集成(CI)的角度。我们将重申监控的重要性,并展示如何将其构建到您的开发工作流中,以使其变得常规且几乎透明。您将看到几乎任何类型的测试都可以自动化,从简单的单元测试到集成测试,甚至是复杂的浏览器用户界面(UI)测试。

我们将展示如何通过使用蓝绿色部署和功能切换等技术来使您的测试更加真实和有用。您将发现如何对一个网页的两个版本执行 A/B 测试,其中有一些非常基本的功能切换,以及一些有趣的硬件选项,以让人们参与测试结果。我们还将介绍 DevOps 实践和云托管,这两者都使 CI 更容易实现并很好地补充它。

第 12 章前路,简单总结了本书的教训,然后看一些你可能想多读的进阶话题。我们也将尝试预测未来.NET Core 平台,并给你一些进一步的想法。

这本书你需要什么

您将需要一个开发环境来遵循本书中的代码示例——Visual Studio 2017、Visual Studio Mac 或 VS Code。您也可以使用自己选择的文本编辑器和 dotnet 命令行工具。如果您使用的是 Visual Studio,那么您仍然应该安装最新的.NET Core 软件开发工具包来启用工具。

对于某些章节,您还需要 SQL Server 2016,尽管您可以使用 2017。但是,您也可以使用 Azure 并针对云数据库运行。

我们将介绍其他工具,但我们将在使用时介绍这些工具。详细的软件/硬件列表与代码文件一起提供。

这本书是给谁的

这本书面向那些希望提高软件性能并发现在云中托管时需要考虑的问题的 web 应用开发人员。它对 ASP.NET 和 C#开发人员来说非常有用,但是熟悉其他开源平台的开发人员也会发现其中的许多信息。

您应该有一些使用 web 应用开发框架的经验,并且应该考虑部署在实际生产环境中表现良好的应用。这些可以是虚拟机,也可以由云服务提供商(如 AWS 或 Azure)托管。

约定

在这本书里,你会发现许多区分不同种类信息的文本样式。以下是这些风格的一些例子和对它们的意义的解释。文本中的代码字、数据库表名、文件夹名、文件名、文件扩展名、路径名、伪 URL、用户输入和 Twitter 句柄如下所示:“update命令与upgrade命令不同,但它们经常一起使用。”

代码块设置如下:

#import packages into the project 
from bs4 import BeautifulSoup 
from urllib.request import urlopen 
import pandas as pd

任何命令行输入或输出都编写如下:

sudo apt-get install docker-ce

新名词重要词语以粗体显示。您在屏幕上看到的单词,例如在菜单或对话框中看到的单词,会出现在如下文本中:“在解决方案资源管理器中右键单击您的 web 应用项目,然后选择“管理”“获取包”...打开图形包管理器窗口。

Warnings or important notes appear like this. Tips and tricks appear like this.

读者反馈

我们随时欢迎读者的反馈。让我们知道你对这本书的看法——你喜欢或不喜欢什么。读者反馈对我们来说很重要,因为它有助于我们开发出你真正能从中获益的标题。要给我们发送一般反馈,只需发送电子邮件 feedback@packtpub.com ,并在您的邮件主题中提及书名。如果您对某个主题有专业知识,并且对写作或投稿感兴趣,请参见我们位于www.packtpub.com/authors的作者指南。

客户支持

现在,您已经自豪地拥有了一本书,我们有许多东西可以帮助您从购买中获得最大收益。

下载示例代码

你可以从你在http://www.packtpub.com的账户下载这本书的示例代码文件。如果您在其他地方购买了这本书,您可以访问http://www.packtpub.com/support并注册将文件直接通过电子邮件发送给您。您可以按照以下步骤下载代码文件:

  1. 使用您的电子邮件地址和密码登录或注册我们的网站。
  2. 将鼠标指针悬停在顶部的“支持”选项卡上。
  3. 点击代码下载和勘误表。
  4. 在搜索框中输入图书的名称。
  5. 选择要下载代码文件的书籍。
  6. 从您购买这本书的下拉菜单中选择。
  7. 点击代码下载。

下载文件后,请确保使用最新版本的解压缩文件夹:

  • 视窗系统的 WinRAR / 7-Zip
  • zipeg/izp/un ARX for MAC
  • 适用于 Linux 的 7-Zip / PeaZip

这本书的代码包也托管在 GitHub 上https://GitHub . com/PacktPublishing/ASPdotNET-高性能。我们还有来自丰富的图书和视频目录的其他代码包,可在https://github.com/PacktPublishing/获得。看看他们!

正误表

尽管我们尽了最大努力来确保我们内容的准确性,但错误还是会发生。如果你在我们的某本书里发现一个错误,也许是文本或代码中的错误,如果你能向我们报告,我们将不胜感激。通过这样做,你可以让其他读者免受挫折,并帮助我们改进这本书的后续版本。如果您发现任何勘误表,请访问http://www.packtpub.com/submit-errata,选择您的书籍,点击勘误表提交表格链接,并输入您的勘误表的详细信息。一旦您的勘误表得到验证,您的提交将被接受,勘误表将上传到我们的网站或添加到该标题勘误表部分下的任何现有勘误表列表中。要查看之前提交的勘误表,请前往https://www.packtpub.com/books/content/support并在搜索栏中输入图书名称。所需信息将出现在勘误表部分。

海盗行为

在互联网上盗版受版权保护的材料是一个贯穿所有媒体的持续问题。在 Packt,我们非常重视版权和许可证的保护。如果您在互联网上遇到任何形式的我们作品的非法拷贝,请立即向我们提供位置地址或网站名称,以便我们寻求补救。请通过 copyright@packtpub.com 联系我们,获取疑似盗版资料的链接。我们感谢您在保护我们的作者方面的帮助,以及我们为您带来有价值内容的能力。

问题

如果您对本书的任何方面有问题,可以在 questions@packtpub.com 联系我们,我们将尽最大努力解决问题。