十四、答案

第一章

什么是微服务?

微服务架构是一堆服务,其中每个服务都是独立部署的,并且应该实现单个业务功能。

可以定义 Azure 服务架构吗?

Azure Service Fabric 是一个帮助我们轻松打包、部署和管理可扩展且可靠的微服务的平台(容器也类似于 Docker 等等)。有时,由于复杂的基础设施问题等,很难专注于您作为开发人员的主要职责。在 Azure 服务结构的帮助下,开发人员无需担心基础设施问题。它提供了各种技术,并作为一个捆绑包提供,具有 Azure SQL 数据库、Cosmos DB、微软 Power BI、Azure 事件中心、Azure 物联网中心和许多其他核心服务的功能。

什么是数据库分片?

通常,数据库分片被简单地定义为大型数据库的无共享分区方案。这样,我们可以实现更高水平的高性能和可扩展性。分片这个词来自术语分片和传播,这意味着将数据库划分成块(分片),并将其传播到不同的服务器。

什么是 TDD,开发者为什么要采用这个?

使用 TDD,开发人员在编码之前编写测试,以便他们可以测试自己的代码。测试是另一段代码,可以验证功能是否按预期工作。如果发现任何功能不满足测试代码,则相应的单元测试失败。这个功能很容易修复;正如你已经知道的,这就是问题所在。为了实现这一点,我们可以利用框架,如微软测试或单元测试。

能详细说说依赖注入(DI)吗?

依赖注入 ( DI )是一种设计模式,它提供了一种技术,让你可以让一个类独立于它的依赖。这可以通过将对象从其创建中分离出来来实现。

第二章

重构单块应用时,我们应该考虑哪些因素?

就微服务而言,重构单个应用起着重要的作用。这不仅仅是像重构代码这样的事情,而是把它看作一个整体系统。这种重构进一步帮助将单块应用转变为微服务。在为 microservces 架构重构或准备我们的整体应用时,可能需要考虑许多因素。以下是重构单块时我们应该牢记的重要因素(这些因素基于我们想象中的应用和本章中的讨论):

  • 技术考虑:应该考虑分离特性、技术堆栈、团队和团队技能等因素。这些帮助我们做出关于重构组件的决定。
  • 商业考虑:如果我们决定重构整体,上市计划的考虑是最重要的因素。

c# 8.0 的默认接口方法有哪些?

默认接口方法是实现接口成员的接口中的方法。为了更好地理解这个特性,请看下面的代码:

public interface IProduct
{
  public int Id { get; set; }
  public string Name { get; set; }
  public decimal Price { get; set; }
  public string ProductDesc() => $"Book:{Name} has Price:{Price}";
}

让我们将IProduct接口实现到我们的Product类。考虑以下代码:

public class Product : IProduct
{
  public Product(int id, string name, decimal price)
  {
    Id = id;
    Name = name;
    Price = price;
  }
  public int Id { get; set; }
  public string Name { get; set; }
  public decimal Price { get; set; }
}

ProductDesc是我们界面的默认方法,总是会产生一个结果。在我们的例子中,它将返回一个字符串作为这个方法的结果。此外,该方法可用于所有实现IProduct接口的类。以类似的方式,我们在我们的Product类中实现了IProduct接口。

我们为什么要用斯瓦格?

斯瓦格基于开放应用编程接口规范(以前的斯瓦格规范)提供关于应用编程接口的文档。swag 还提供了测试 API 的工具。我们使用斯瓦格,以便向最终用户提供适当的文档。

第三章

什么是同步和异步通信?

同步通信是指客户端向远程服务(称为服务)请求特定功能,并等待直到得到响应。异步通信是客户端向远程服务(称为服务)请求特定的功能,而不等待,尽管它确实关心响应。

什么是整合模式?

集成模式是两个或多个服务从一个数据存储中读写数据。

什么是事件驱动模式,为什么它对微服务如此重要?

在事件驱动的模式中,我们以这样一种方式实现服务:每当一个服务更新其数据并且另一个服务(依赖服务)订阅该事件时,它就发布一个事件。每当从属服务接收到事件时,它都会更新其数据。这样,如果需要,我们的依赖服务可以获取和更新它们的数据。上图显示了服务如何订阅和发布事件的概述。这里,事件管理器可以是运行在服务上的程序,也可以是帮助您管理订阅者和发布者的所有事件的中介。它注册发布服务器的事件,并在特定事件发生/触发时通知订阅服务器。它还可以帮助您形成队列并等待事件。

什么是 CAP 定理?

CAP 定理又称布鲁尔定理,代表一致性可用性、(网络 ) 分区容差。根据这个定理,在分布式系统中,我们只能从这三个中选择两个:

  • 一致性(丙)
  • 可用性(一)
  • 分区容差

考虑我们有一个假想的系统,它是高度可用的(A)和高度一致的(C),但没有分区(CA)。当我们需要并执行分区(P)时,我们将系统分区到 n 个分区,或者说我们正在持续地对系统进行分区。在这种情况下,这是一个非常复杂的场景,数据可能无法到达/覆盖所有分区。这就是为什么我们要么使系统高度可用(AP),要么使系统高度一致(CP)。

第四章

写一篇关于单元测试的短文。

单元测试通常测试单个函数调用,以确保测试程序的最小部分。这些测试旨在验证特定功能,而不考虑其他组件。单元测试可以是任何规模的;单元测试没有明确的规模。一般来说,这些测试是在类级别编写的。

开发人员为什么要坚持测试驱动开发?

使用 TDD,开发人员在实际代码之前编写测试,这样他们就可以测试自己的代码。这个测试是另一段代码,可以验证功能是否按预期工作。如果发现任何功能不满足测试代码,则相应的单元测试失败。这个功能很容易修复,因为你知道这就是问题所在。为了实现这一点,我们可以利用框架,如微软测试或单元测试。

什么是存根和模拟对象?

存根对象不依赖于输入,这意味着响应或结果不会由于正确或不正确的输入而受到妨碍。最初,我们创建存根作为对象。模拟对象不是真实的,可能永远是假的。通过使用模拟对象,您可以测试可以调用的方法,并告诉我们单元测试是失败了还是通过了。换句话说,我们可以说模拟对象只是我们实际对象的复制品。

什么是测试金字塔?

测试金字塔是一种策略或方法,用来定义应该在微服务中测试什么。换句话说,我们可以说它帮助我们定义了微服务的测试范围。测试金字塔的概念是由 Mike Cohn 在 2009 年创建的。测试金字塔有多种口味;不同的作者描述了这一点,指出了他们是如何放置测试范围或确定测试范围的优先级的。

什么是消费者测试?

合同测试是一种方法,其中每个服务调用都独立地验证响应。如果有任何服务是依赖的,那么依赖关系就会被存根化。这样,服务在不与任何其他服务交互的情况下运行。消费者驱动的契约指的是一种模式,它指定并验证客户端/消费者和 API 所有者(应用)之间的所有交互。这里,消费者驱动意味着客户端/消费者以定义的格式指定它所要求的交互类型。另一方面,应用接口所有者(应用服务)必须同意这些合同,并确保它们不会违反这些合同。

如何在基于微服务的应用中使用消费者测试?

在微服务的情况下,实现消费者驱动的测试比. NET 单片应用更具挑战性。这是因为,在单片应用中,我们可以直接使用任何单元测试框架,比如 MS tests 或者 NUnit,但是我们不能在微服务架构中直接这样做。在微服务中,我们不仅需要模拟方法调用,还需要模拟服务本身,它们通过 HTTP 或 HTTPs 被调用。为了实现消费者驱动的测试,我们需要使用各种工具。一个著名的开源工具.NET 框架是 PactNet 另一个。网芯被称为 Pact.Net 芯。这些都是基于 Pact(https://docs.pact.io/)标准。

第五章

什么是 Docker 形象,为什么这么重要?

Docker 映像是一种模板,包含创建 Docker 容器的指令。只能看说明书;您不能向该模板添加自己的说明,因为这是一个只读模板。它由一个单独的文件系统、相关的库等组成。在这里,图像始终是只读的,并且可以运行完全相同的抽象、底层、主机差异。Docker 图像可以由一层叠加在另一层上组成。Docker 图像的这种可组合性可以比作分层蛋糕的类比。跨不同容器使用的 Docker 映像可以重用。这也有助于减少使用相同基础映像的应用的部署占用空间。

什么是 Docker 存储库?

Windows 注册表是一个数据库,用于存储 Microsoft Windows 操作系统内部或低级设置的信息。

什么是 Docker 容器?

当前正在运行的 Docker 映像的实例称为 Docker 容器。

什么是坞站枢纽?

这是一个公共注册表,用于存储图像。位于http://hub.docker.com

在 Docker 文件中可以用 JSON 代替 YAML 吗?如果是,如何做到?

是的,我们可以使用 JSON 文件来代替 YAML 文件。请注意,YAML 是 JSON 的超集。这样,当我们使用一个 JSON 文件时,它隐式地是一个有效的 YAML 文件。我们需要指定文件名来使用 JSON 文件;例如docker-compose -f jsoncomposefile.json up。 这里,我们使用up告诉系统,我们可以启动或重启jsoncomposefile.json文件中定义的所有服务。

就集装箱解释这些词:FROMCOPYWORKDIREXPOSEENTRYPOINT

为了理解这些术语,让我们考虑下面的代码片段:

FROM mcr.microsoft.com/dotnet/core/aspnet:3.0-nanoserver-1903
 AS base WORKDIR /app
 EXPOSE 80 EXPOSE 443
 FROM mcr.microsoft.com/dotnet/core/aspnet:3.0 AS runtime
 WORKDIR /app
 COPY ${source:-obj/Docker/publish} .
 ENTRYPOINT ["dotnet", "FlixOne.BookStore.ProductService.dll"]

FROM是某种消息,告诉 Docker 在现有图像上拉基础图像并调用microsoft/aspnetcore:3.0COPYWORKDIR将内容复制到被调用/app 容器内的新目录中,并将其设置到工作目录中以获得后续说明。要在容器的端口 80 上公开我们的产品服务,我们可以使用EXPOSEENTRYPOINT,它们指定了容器启动时要执行的命令。举个例子,我们有ProductService,我们的切入点是["dotnet", "FlixOne.BookStore.ProductService.dll"]

借助我们的Product Services,编写一个简单的 ASP.NET Core 网络应用,以表格形式显示AddDeleteUpdate产品。

参考我们想象中的 FlixOne 书店应用的代码示例。

第六章

什么是软件安全?

安全性是 web 应用最重要的交叉问题之一。不幸的是,如今知名网站的数据泄露似乎司空见惯。考虑到这一点,信息和应用安全对于 web 应用来说变得至关重要。出于同样的原因,安全应用不应再是事后的想法。安全是组织中每个人的责任。如果我们要定义安全性,那么我们可以说这是一种实现代码的方法,这样我们就可以保护我们的软件免受恶意攻击和黑客风险,从而我们可以提供一个具有不间断功能的安全应用。

单片应用的安全挑战是什么?

有关更多信息,请参考单片应用中的安全性部分。

创建一个演示应用,并详细说明 OAuth。

请参考我们在本章的使用 OAuth 2.0 一节中讨论的示例应用。

什么是授权服务器,它是如何工作的?

授权服务器验证凭证,并使用授权代码将用户重定向回客户端。

什么是 Azure API 管理,为什么微服务需要 API 网关?

Azure API 管理(【APIM】)服务具有易于使用的用户界面和良好的文档。Azure 应用编程接口管理还附带了一个 REST 应用编程接口,因此 Azure APIM 门户的所有功能都可以使用 Azure APIM 可用的 Azure REST 应用编程接口端点以编程方式实现。

第七章

什么是监控?

监控提供有关整个系统或系统不同部分在其运行环境中的行为的信息。这些信息可用于诊断和深入了解系统的不同特征。

监测的必要性是什么?

微服务是复杂的分布式系统。微服务实施是任何现代信息技术业务的支柱。了解服务的内部及其交互和行为将有助于您使整体业务更加灵活和敏捷。微服务的性能、可用性、规模和安全性会直接影响企业及其收入。因此,监控微服务至关重要。它帮助我们观察和管理服务属性的质量。

什么是健康监测?

通过健康监测,我们以一定的频率(通常为几秒钟)监测系统及其各种组件的健康状况。这确保了系统及其组件按预期运行。借助详尽的运行状况监控系统,我们可以监视整个系统的运行状况,包括中央处理器、内存利用率等。它可能以 pings 或广泛的健康监控端点的形式出现,这些端点会发出服务的健康状态以及一些有用的元数据。

监控面临哪些挑战?

微服务监控提出了不同的挑战。会有这样的场景:一个服务可能依赖于另一个服务,或者客户端向一个服务发送请求,而响应来自另一个服务,这会使操作变得复杂;因此,扩展微服务在这里将是一项具有挑战性的任务。同样,流程实现——比如说 DevOps——在实现一个巨大的企业微服务应用时将是一项具有挑战性的工作。

微软 Azure 主要的日志和监控解决方案有哪些?

谈到微服务带来的监控挑战,Azure 或任何云提供商都没有现成的解决方案或产品。微软 Azure 诊断、应用洞察和日志分析是 Azure 提供的日志记录和监控解决方案。

第八章

什么是缓存,缓存在微服务应用中的重要性是什么?

缓存是增加应用吞吐量的最简单方法。原理很简单。一旦从数据存储器中读取了数据,它就尽可能地靠近处理服务器。在未来的请求中,数据直接从数据存储或缓存中提供。缓存的本质是最小化服务器必须做的工作量。HTTP 在协议本身中嵌入了内置的缓存机制。这就是它伸缩性如此之好的原因。

什么是服务发现,它如何在微服务应用中发挥重要作用?

更多信息请参考服务发现部分。

通过实现一个小程序来定义 Azure Redis 缓存。

Azure Redis 让您可以访问安全、专用的 Redis 缓存,该缓存由微软管理,可从 Azure 中的任何应用访问。所需的实现步骤请参考 Azure Redis Cache 部分。

什么是断路器?

断路器是电子设备中的一种安全功能,在发生短路时,它可以切断电流并保护设备,或者防止对周围环境造成任何进一步的损害。这个确切的想法可以应用于软件设计。当从属服务不可用或不处于健康状态时,断路器会阻止呼叫转到该从属服务,并在配置的时间段内将流量重定向到备用路径。

第九章

什么是反应式微服务?

一个软件必须具备某些基本属性才能被认为是反应性的。这些属性是响应性、弹性、自主性,最重要的是,是消息驱动的。

什么是消息级安全?

如果您希望保护单个请求消息的安全,消息级安全是最基本的方法。执行初始身份验证后,根据实现方式,请求消息本身可能包含 OAuth 承载令牌或 JWTs。这样,每一个请求都得到验证,并且与用户相关的信息可以嵌入到这些令牌中。该信息可以像用户名以及指示令牌有效性的到期时间戳一样简单。毕竟,我们不希望令牌的使用超过特定的时间范围。

什么是自动测试?

AutoRest 是一个帮助我们生成客户端库的工具,这样我们就可以访问 RESTful web 服务。自动测试从开放应用编程接口规范中获取应用编程接口定义。