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