什么是微服务?
当今的应用程序开发和 IT 系统管理都由云驱动。 新式云应用程序需要是快速、敏捷、可大规模缩放且可靠的。
使用容器有助于部署满足所有这些要求的应用程序。 但在不遵循策略设计模式的情况下将应用程序放入容器中,就像坐上一辆车,希望在不使用地图或 GPS 的情况下找到前往新城市的道路一样。 你可能最终会到达目的地,但这条路线不是直接或最高效的。
在此方案中,微服务体系结构将会非常有用。 微服务可提供一种软件开发和部署方法,可以很好地满足新式云应用程序对灵活性、可伸缩性和可靠性的要求。
什么是微服务体系结构?
在微服务体系结构中,大型应用程序会拆分为一组较小的服务。 每个服务在其自己的进程中运行,并通过使用 HTTP/HTTPS、WebSocket 或高级消息队列协议 (AMQP) 等协议与其他进程通信。 每个微服务在特定的上下文边界内实现特定的端到端域或业务功能。 每个微服务必须自主开发,并且必须独立部署。 最后,每个微服务应拥有其相关的域数据模型和域逻辑。 微服务可以基于不同的数据存储技术(SQL、NoSQL)和不同的编程语言。
以下是微服务的一些主要特征:
- 他们是小型的,独立的和松散耦合的。
- 每个微服务都具有可由小型开发团队管理的单独代码库。
- 它们是独立部署的。 团队可以更新现有微服务,而无需重新生成和重新部署整个应用程序。
- 它们将数据或外部状态持久保存在各自的数据库中。 与整体体系结构不同,微服务不共享数据库。
- 它们使用良好定义的 API 相互通信。 每个服务的内部实现细节均对其他服务隐藏。
- 它们支持多语言编程。 例如,构成 Web 应用程序的微服务不需要共享相同的技术堆栈、库或框架。
为什么使用微服务体系结构进行开发?
微服务通常会封装更简单的客户要求功能,你可以对其进行横向扩展或横向扩展。 可以独立测试、部署和管理它们。 微服务方法的一个重要优点是团队更倾向于以客户方案为导向,而非以使用特定技术为导向。 每个小型开发团队将根据客户方案开发微服务。 团队可选择所使用的技术。
微服务提供了长期的灵活性。 通过允许基于许多独立的可部署服务(每项服务都具有精细的自主生命周期)创建应用程序,微服务可在复杂、大型且高度可缩放的系统中支持可维护性。
微服务的另外一大优势是,可以独立横向扩展。 可以改为横向扩展特定的微服务,而不是拥有必须将其作为一个单元横向扩展的单个整体式应用程序。 你可以仅缩放需要更多处理能力或网络带宽的功能区域以支持需求,而不是横向扩展不需要缩放的应用程序其他区域。 这意味着节省成本,因为所需硬件更少。
使用微服务方法,可以对每个微服务实现敏捷更改和快速迭代,因为你可以更改复杂、大型和可缩放应用程序的特定小型区域。
构建基于微服务的细粒度应用程序使持续集成和持续交付实践可行。 它还加快了应用程序中新功能的交付。 可以独立运行和测试微服务,并在维护服务之间的明确协定的同时自主改进微服务。 只要不更改接口或协定,就可以更改任何微服务的内部实现或添加新功能,而不会中断其他微服务。
容器扮演什么角色?
容器化是软件开发的一种方法,通过该方法可将应用程序或服务、其依赖项及其配置(抽象化为部署清单文件)一起打包为容器映像。 可以将容器化应用程序作为一个单元进行测试,并将其作为容器映像实例部署到主机操作系统。
软件容器作为软件部署的标准单元,可以包含不同的代码和依赖项。 这与轮船、火车或卡车使用集装箱运输各种货物类似。 开发人员和 IT 专业人员可以使用容器化软件跨环境部署代码和依赖项,而只需进行少量或无需进行任何修改。
从中可以看出,将应用程序容器化确实是实现微服务体系结构模式的一种有效方法。 使用容器的优势与使用微服务体系结构的优势几乎完全一致。
注意
容器化应用程序不是部署微服务的唯一方法。 可以在 Azure 应用服务中、虚拟机上或以任何方式将微服务部署为单独的服务。 容器是我们将在本模块剩余部分用于部署微服务的部署工具。
容器化的另一个优势在于可伸缩性。 可以通过创建用于短期任务的新容器来快速横向扩展。 从应用程序的角度来看,实例化映像(创建容器)类似于实例化 服务或 Web 应用等进程。
总而言之,容器在整个应用程序生命周期工作流中提供了隔离性、可移植性、灵活性、可伸缩性和可控性等诸多优点。
在本模块中生成的微服务将在使用 .NET CLI 发布的 Docker 容器中运行。
.NET SDK 容器发布
在 .NET 7 中,.NET SDK 获得了通过 dotnet publish
命令创建容器映像的能力。 这些工具基于项目的属性及其输出执行一系列推理。 然后,.NET 将会创建与 Dockerfile 创建的映像相同的映像。 创建新应用程序并将其发布为映像只需要两个命令:
dotnet new webapi
dotnet publish --os linux --arch x64 /t:PublishContainer -c Release
前面的 .NET CLI 命令将创建一个新的 Web API 并将应用发布为容器:
- 将 Linux 作为目标操作系统 (--os linux)。
- 指定 x64 体系结构 (--arch x64)。
- 使用发布配置(-c 版本)。
可通过 MSBuild 属性控制生成的容器的许多方面。 通常,如果可以使用 Dockerfile 中的命令来设置某些配置,则可以通过 MSBuild 执行相同的操作。
为什么要在 .NET 中生成微服务?
从 .NET Core 开始一直到当前的迭代,.NET 在本质上就是云原生的。 它可以跨平台运行,因此 Docker 映像可以基于 Linux 的风格,而 .NET 代码仍会运行。 Microsoft 已经为 Docker 创建了 .NET 映像。 此外,.NET 速度极快。 ASP.NET Kestrel Web 服务器通常优于其他 Web 服务器。
Docker
Docker 是一个开放源代码平台,可以利用它将应用程序自动部署为可在云或本地运行的可移植独立容器。 Docker 也是推动和改进这项技术的公司。 作为组织,Docker 与云、Linux 和 Windows 供应商(包括 Microsoft)开展协作。
Docker 容器可以在任意位置运行:在客户的数据中心本地、在外部服务提供商或在云中。 Docker 映像容器可以在 Linux 和 Windows 上本机运行。
什么是映像?
开发人员会在使用 Docker 时创建应用或服务。 然后将该应用或服务及其依赖项打包到一个容器映像中。 映像是应用或服务及其配置和依赖项的静态表示形式。
该映像在运行时将会成为容器。 容器是映像的内存中实例。
容器映像是不可变的。 生成映像后,无法更改映像。 由于无法更改映像,因此如果需要更改应用或服务及其依赖项,请创建新映像。 此功能可保证在生产中使用的映像与开发和测试中使用的映像相同。
什么是 Dockerfile?
Dockerfile 是一个文本文件,其中包含有关如何生成 Docker 映像的说明。 Dockerfile 是使用旨在生成和配置映像的最小脚本语言编写的。 Dockerfiles 还会记录自基本映像起生成映像所需执行的操作。
要创建包含应用程序的 Docker 映像,通常从标识基本映像开始。 然后将更多文件和配置添加到基本映像。 确定合适的基础映像的过程通常从在 Docker Hub 上进行搜索开始。 可搜索一个已包含应用程序框架以及 Linux 发行版(如 Ubuntu 或 Alpine)的所有实用程序和工具的现成映像。 例如,如果有想要打包到容器中的 ASP.NET 应用程序,则 Microsoft 会发布已包含 ASP.NET 运行时且名称为 mcr.microsoft.com/dotnet/aspnet 的映像。
你可以自定义映像,方法是首先使用包含基本映像的容器,然后再对其进行更改。 更改通常会涉及各种活动,例如将文件从本地文件系统复制到容器,以及运行各种工具和实用程序来编译代码。
Dockerfile 是一组指令,用于创建一个 Docker 映像,其中包含运行应用程序所需的确切软件,包括应用程序本身。