项目

ABP 快速入门:创建微服务解决方案

您必须拥有 ABP Business 或更高级别的许可证才能使用此启动模板。

在这个快速入门指南中,您将学习如何使用 ABP Studio 创建和运行一个微服务解决方案。

设置您的开发环境

首先是准备工作!在创建第一个项目之前,让我们先设置您的开发环境。您的开发机器上应安装以下工具:

有关这些工具的更多详细信息,请查看 预要求文档

创建新解决方案

ABP 启动解决方案模板针对您的特定需求提供了许多选项。如果您不理解某个选项,可能意味着您不需要它。我们为您选择了通用的默认值,因此您可以保留这些选项的设置。

假设您已经 安装并登录 到应用程序,当您打开 ABP Studio 时,应该会看到以下屏幕:

abp-studio-welcome-screen

在主菜单中选择 文件 -> 新建解决方案,或者在 欢迎 屏幕上点击 新建解决方案 按钮,打开 创建新解决方案 向导:

abp-studio-new-solution-dialog-microservice

本教程将使用 微服务 解决方案模板,因此请选择它并点击 下一步 按钮:

abp-studio-new-microservice-solution-dialog-properties

在该屏幕上,您可以为解决方案选择一个名称。您可以使用不同级别的命名空间;例如 CloudCrmAcme.CloudCrmAcme.Solutions.CloudCrm

然后选择一个 输出文件夹 来创建您的解决方案。创建解决方案文件夹 选项将在给定的输出文件夹中创建一个与解决方案同名的文件夹。

配置完成后,点击 下一步 按钮进入 数据库提供程序 选择:

abp-studio-new-solution-dialog-database-provider

在该屏幕上,您可以通过选择提供的选项之一来决定您的数据库提供程序,然后点击 下一步 按钮进入 数据库配置 部分(仅适用于 Entity Framework Core):

abp-studio-new-solution-dialog-database-configurations

在这里,选择适合您的数据库管理系统(DBMS),然后点击 下一步 按钮进入 多租户 选择:

abp-studio-new-solution-dialog-multi-tenancy

在该屏幕上,您可以为您的解决方案启用多租户功能。选择此选项后,点击下一步按钮进入 UI 框架 选择屏幕。

abp-studio-new-solution-dialog-ui-framework

在这里,您可以看到该启动解决方案模板支持的所有可能的 UI 选项。选择您喜欢的 UI 框架,然后点击 下一步 按钮进入 移动框架 选择屏幕:

abp-studio-new-solution-dialog-mobile-framework

在这里,您可以看到该启动解决方案模板中可用的所有移动应用程序。这些移动应用程序已与您的解决方案良好集成,可以与您的 Web 应用程序使用相同的后端。它们比较简单(没有 Web 应用程序那么多的预构建功能),但却是构建移动应用程序的一个非常好的起点。

如果您选择移动应用程序,则会创建一个仅由移动应用程序使用的额外 API 网关。

选择最适合您的选项,或者如果您的解决方案中不需要移动应用程序,则选择 ,然后点击 下一步 进入 公共网站 部分:

abp-studio-new-solution-dialog-public-web-site

您可以选择在解决方案中创建一个公共网站。公共网站是一个简单的落地页,可用于介绍您的产品、提供文档等。

abp-studio-new-solution-dialog-dynamic-localization

在该屏幕上,您可以启用动态本地化。选择此选项后,点击下一步按钮进入 可选模块 选择屏幕。

abp-studio-new-microservice-solution-dialog-optional-modules

列表中的每一项都是一个预构建的应用程序模块。您可以点击模块名称附近的蓝色图标以获取有关该模块的更多信息。您可以保持列表原样(这样会为您安装最常用和常见的模块),也可以根据您的偏好进行自定义。

ABP Studio 会为其中一些模块(例如 SaaS 和 GDPR)创建专用的微服务。对于其他模块(例如语言管理和 OpenIddict UI),它会将模块安装到现有的微服务中。因此,您可能不会为每个选定的模块看到单独的服务。

创建解决方案后安装模块可能需要手动步骤。因此,最好在开始时决定所需的模块。您可以在创建实际解决方案之前,先创建一个示例解决方案来探索解决方案和模块。

选择所需的模块后,点击 下一步 按钮进入 UI 主题 选择:

abp-studio-new-solution-dialog-ui-theme

LeptonX 是推荐的生产环境使用的 UI 主题。选择一个主题,如果需要,可以配置其他选项。

点击下一步按钮查看 附加选项 选择:

abp-studio-new-solution-dialog-additional-options

如果您取消选中 Kubernetes 配置 选项,解决方案将不包含包含 Helm 图表和其他 Kubernetes 相关文件的 Kubernetes 配置文件。您还可以指定 社交登录;如果取消选中此选项,解决方案将不会为社交登录进行配置。最后,您可以指定 包含测试 选项,以便在解决方案中包含测试项目。

点击下一步按钮查看 附加服务 屏幕:

abp-studio-new-solution-dialog-additional-services

该屏幕允许您在创建过程中向 ABP 解决方案中添加额外的微服务。此功能让您可以从一开始就用特定于业务的服务扩展您的解决方案。

现在,我们已经准备好让 ABP Studio 创建我们的解决方案了。只需点击 创建 按钮,剩下的就交给 ABP Studio 了。点击 创建 按钮后,对话框关闭,您的解决方案将加载到 ABP Studio 中:

abp-studio-created-new-microservice-solution

您可以探索解决方案,但在运行解决方案中的任何应用程序之前,您需要 等待后台任务完成(这可能需要几分钟时间来设置所有内容)。

根据您选择的选项,解决方案结构可能会有所不同。

探索解决方案

解决方案解决方案资源管理器 部分中显示的多个模块组成:

您可以参考 概念 文档以了解解决方案模块术语的含义。

abp-studio-created-microservice-solution-explorer

上述树结构中的每个叶子项(例如 Acme.CloudCrm.IdentityServiceAcme.CloudCrm.Web)都是一个 ABP Studio 模块。它们被分组到解决方案文件夹(appsgatewaysservices)中。

每个模块都有一个独立的 .NET 解决方案。您可以通过右键单击 解决方案资源管理器 树中的某个模块,选择 打开方式 -> 文件资源管理器 选项来打开模块(或 .NET 解决方案)的文件夹,如下图所示:

abp-studio-open-module-folder

如果我们在文件资源管理器中打开 Acme.CloudCrm.IdentityService 模块的路径,我们可以看到它的 .NET 解决方案和其他文件:

abp-studio-microservice-example-identity-service-files

此微服务解决方案设计为每个服务都有单独的 .NET 解决方案,以便能够独立于其他服务和应用程序进行开发。

您可以在您喜欢的 IDE 中打开任何模块的 .NET 解决方案并进行开发。下图是在 Visual Studio 中打开的 Identity 微服务的截图:

abp-studio-microservice-example-identity-service-in-visual-studio

如果您探索该 .NET 解决方案,通常会看到一些配置代码,但看不到任何业务代码。这是因为该解决方案使用 预构建的应用程序模块 作为 NuGet 包,并且不包含它们的源代码。通过这种方式,您可以在新版本可用时轻松升级这些应用程序模块。

您通常会将新的微服务添加到解决方案中,并在这些新服务中执行业务逻辑(但是,您始终可以下载任何预构建应用程序模块的源代码并将其包含到您的解决方案中,以便自由自定义)。

运行解决方案

运行微服务解决方案不像运行单体应用程序,后者通常只有一个可执行文件。所有应用程序、服务、网关和基础设施组件(例如 Redis、RabbitMQ)都应启动并运行。幸运的是,ABP Studio 提供了 解决方案运行器Kubernetes 集成 功能,使运行变得简单而愉快。

如下图所示,在 ABP Studio 左侧打开 解决方案运行器 部分:

abp-studio-microservice-solution-runner

点击左侧的 播放 图标后,该部分将在与 解决方案资源管理器 部分相同的位置打开。ABP Studio 还会在主内容区域打开 应用程序监视器 视图。应用程序监视器 实时显示您的应用程序/服务的有用洞察(例如 HTTP 请求事件异常)。您可以使用它来查看系统中发生的情况,从而轻松跟踪错误和许多有用的细节。

解决方案运行器 部分(左侧),您可以看到当前解决方案中所有可运行的应用程序:

abp-studio-microservice-solution-runner-applications

解决方案运行器 中,叶子项被称为 应用程序,因为它是一个可执行的应用程序,不包括 Containers 下的项。

如上图所示,可执行应用程序被分组到 appsgatewaysservices 等文件夹中。您可以启动/停止全部、一组(文件夹)或逐个启动/停止它们。Containers 分支包含应用程序所需的 Docker 容器。

在运行应用程序之前,您可以右键单击 解决方案运行器 中的根项目并选择 生成 -> 全部生成 操作来生成所有应用程序。但是,您不需要这样做,因为 ABP Studio 默认在运行应用程序之前会生成它们。

如果您想改变此行为,并且不希望 ABP Studio 在运行应用程序之前进行生成,可以点击 解决方案运行器 中的 管理启动操作 按钮,该按钮可以从根项目或每个文件夹中看到。

您可以点击 解决方案运行器 中根项目上的 播放 按钮来启动所有应用程序。

关于 Docker 容器

Docker 在首次运行时会获取 Docker 镜像(如果之前没有获取过),此过程可能需要几分钟,具体取决于您的互联网连接速度。因此,请等待它完全启动。如果该过程花费的时间超出预期,您可以右键单击 Docker-Dependencies 并选择 日志 命令以查看正在发生的情况。

关于启动时失败的服务

某些应用程序/服务可能在首次运行时失败。这可能是因为服务和数据库依赖项未满足,导致应用程序启动时出错。ABP Studio 会自动重新启动失败的服务,直到成功启动。让这样的分布式解决方案完全就绪可能需要一段时间,但最终会启动。

一旦所有应用程序准备就绪,您可以右键单击 Web 应用程序并选择 浏览 命令:

abp-studio-microservice-solution-runner-browse

浏览 命令将在 ABP Studio 的内置浏览器中打开 Web 应用程序的 UI:

abp-studio-microservice-solution-runner-browse-microservice

您可以在 ABP Studio 的功能齐全的 Web 浏览器中浏览您的应用程序。点击应用程序 UI 中的 登录 按钮,输入 admin 作为用户名,1q2w3E* 作为密码以登录到应用程序。

您还可以在 ABP Studio 中浏览其他提供 UI 的应用程序/服务。这样,您就不需要使用外部浏览器或手动输入应用程序的 URL。

使用解决方案运行器开发服务

解决方案运行器不仅使运行多应用程序系统更容易,而且在开发您的服务和应用程序时也非常有用。在微服务解决方案中,您通常专注于一个或少数几个服务和应用程序。假设您想在 IdentityService 中进行开发。您可以使用以下开发流程:

  • 启动解决方案中的所有应用程序/服务,并测试一切是否按预期工作。
  • 在解决方案运行器中停止 IdentityService
  • 在您喜欢的 IDE(例如 Visual Studio)中打开 IdentityService 的 .NET 解决方案。打开它的一种简单方法是使用 解决方案资源管理器,找到 Acme.CloudCrm.IdentityService 模块,右键单击并选择 打开方式 -> Visual Studio 命令。
  • IdentityService 中进行开发。
  • 在 Visual Studio(或其他 IDE)中运行(带或不带调试)您的服务。

一旦您在 Visual Studio 中运行 IdentityService,它将完全集成到系统的其余部分,因为它们都在您的本地机器上运行。此外,IdentityService 应用程序将自动连接到 ABP Studio 并向其发送运行时数据,就像在 ABP Studio 中工作一样。当您在 ABP Studio 之外运行应用程序时,它会在解决方案运行器中显示为 外部,并且您无法在 ABP Studio 中停止它(您应该在启动它的地方停止):

abp-studio-microservice-solution-runner-external-service

作为另一种方法,特别是如果您不需要调试您的服务,您可以启用 ABP Studio 的监视功能,以便在您的应用程序/服务发生更改时自动重新生成并重新启动。

要启用监视,请右键单击您要监视的应用程序/服务,选择 属性 -> 运行时监视更改 选项,如下图所示:

abp-studio-microservice-solution-runner-enable-watch-1

abp-studio-microservice-solution-runner-enable-watch-2

现在,您可以在 IdentityService 上进行开发。每当您保存代码文件时,ABP Studio 都会自动重新生成并重新启动它,因此任何更改都会在几秒钟内对正在运行的解决方案生效。

当您为应用程序启用监视时,应用程序附近会添加一个 眼睛 图标:

abp-studio-microservice-solution-runner-watch-enabled-icon

Kubernetes 集成:使用 Helm 图表

解决方案运行器是在本地运行解决方案中所有应用程序和服务的好方法。但是,也存在一些缺点:

  • 如果您的解决方案规模扩大,拥有数十或数百个服务,在本地环境中运行整个系统将消耗大量系统资源(CPU、RAM 等)。
  • 最终,您的解决方案将在生产环境中运行,而 Kubernetes 目前是部署此类分布式解决方案的事实标准工具。在本地或远程 Kubernetes 环境中运行您的解决方案将更接近生产环境。

ABP Studio 的 Kubernetes 集成 功能是将微服务解决方案部署到 Kubernetes 以及通过将本地环境集成到 Kubernetes 集群来本地开发服务的好方法。

如下图所示,在 ABP Studio 左侧打开 Kubernetes 部分:

abp-studio-new-microservice-helm-charts

Helm 选项卡(如上图所示)中,我们可以看到解决方案中的所有 Helm 图表(图表文件位于解决方案文件夹中的 etc/helm 文件夹中)。所有图表都已准备好使用,并为 Docker Desktop 进行了预配置。

解决方案在 etc/helm 文件夹下包含一个 README.MD 文件。请仔细阅读并应用相关步骤以准备您的开发环境。

Helm 选项卡中,您可以右键单击根图表(本例中为 cloudcrm),然后选择 构建 Docker 镜像 命令:

abp-studio-microservice-kubernetes-build-docker-images

此命令将为解决方案中的所有 .NET 应用程序创建本地 Docker 镜像。镜像创建操作将在后台任务中完成。您可以在 ABP Studio 底部的 后台任务 面板中跟踪进程:

abp-studio-background-tasks

构建 Docker 镜像后,就可以将 Helm 图表安装到 Kubernetes 了。为此,右键单击根图表(本例中为 cloudcrm),然后选择 安装图表 命令:

abp-studio-microservice-kubernetes-install-helm-chart

安装图表应该很快。但是,在 Kubernetes 中完全就绪可能需要时间。例如,如果某个服务(例如 Redis、Rabbit)的镜像之前没有被拉取过,它将需要先拉取镜像。

一旦解决方案在 Kubernetes 中就绪,您可以打开浏览器并访问以下 URL:https://cloudcrm-local-web 它将打开一个网页,如下所示:

abp-studio-microservice-web-application-home-page

我们可以使用 cloudcrm-local-web 作为主机名,因为 ABP Studio 已为我们在主机文件中添加了一个条目。

点击应用程序 UI 中的 登录 链接,它将重定向您到 认证服务器 应用程序,输入 admin 作为用户名,1q2w3E* 作为密码以登录到应用程序。

服务彼此独立运行,并在启动时执行一些初始数据种子逻辑。因此,它们可能在首次运行时失败。在这种情况下,Kubernetes 将重新启动它们。因此,可能需要一些时间才能使解决方案完全就绪并工作。

如果您看不到所有菜单项(在主菜单上),请转到 管理 -> 身份管理 -> 角色 页面,找到 admin 角色,选择 操作 -> 权限 操作:

abp-studio-microservice-role-management-permissions

在打开的对话框中,确保选择了所有权限,然后 保存 对话框:

abp-studio-microservice-web-role-permissions

这将授予对所有页面的访问权限。您应该刷新页面以查看效果。

Kubernetes 集成:连接到集群

ABP Studio 的 Kubernetes 集成不仅可以将您的解决方案部署到 Kubernetes,还可以提供一个与 Kubernetes 集成的便捷开发环境。

当您打开 Kubernetes 面板中的 Kubernetes 选项卡时,您将看到一个 连接 按钮:

abp-studio-microservice-kubernetes-tab

点击 连接 按钮将启动一个建立 VPN 连接的过程(准备连接可能需要一些时间 - 您可以在 后台任务 面板中查看进度),并加载该解决方案命名空间中 Kubernetes 集群内的所有服务:

abp-studio-microservice-kubernetes-services

现在,您可以访问 Kubernetes 集群内的所有服务,包括那些未暴露到集群外部的服务。您可以使用服务名称作为 DNS。例如,您可以直接在浏览器中访问 http://cloudcrm-local-identity。您还可以右键单击服务或应用程序并选择 浏览 命令,在 ABP Studio 的内置浏览器中打开其 UI:

abp-studio-microservice-kubernetes-services-browse

您甚至可以从本地计算机使用其他服务(例如 SQL Server 或 RabbitMQ),即使它们未暴露到集群外部,也可以使用它们的服务名称。SQL Server 的 sa 密码默认为 myPassw@rd,您可以使用您的 SQL Server 管理工作室连接它并查看数据库(服务器名称cloudcrm-local-sqlserver):

abp-studio-microservice-sql-server-connection

这是 Kubernetes 集群中 SQL Server 实例内的数据库:

abp-studio-microservice-sql-server-databases

当您连接到 Kubernetes 时,ABP Studio 会自动连接到 Kubernetes 集群中运行的应用程序/服务,并开始收集使用数据:

abp-studio-microservice-kubernetes-application-monitor

通过这种方式,您可以轻松跟踪应用程序的 HTTP 请求、分布式事件、异常、日志和其他详细信息。

如果您想在 ABP Studio 的集成浏览器中浏览 Web 应用程序,请右键单击 Kubernetes 面板的 Kubernetes 选项卡中的某个服务,然后选择 浏览 命令。

Kubernetes 集成:拦截服务

下一步是拦截一个服务,以将流量(发往该服务)转发到您的本地计算机,这样您就可以在本地计算机上运行相同的服务进行测试、调试和开发。这是将两个环境(您的本地机器和 Kubernetes 集群)连接起来,以开发与 Kubernetes 集成的服务的方法。

要拦截一个服务,请在 Kubernetes 选项卡中右键单击它,然后选择 启用拦截 命令:

abp-studio-microservice-kubernetes-enable-interception

它将启动拦截过程,最后您将在被拦截的服务附近看到 拦截图标

abp-studio-microservice-kubernetes-interception-enabled

从现在开始,所有发送到审计日志记录微服务的流量都将被重定向到您的本地计算机。如果您现在打开审计日志记录页面(https://cloudcrm-local-web/AuditLogs),您会收到一个错误,因为请求被重定向到您的本地机器,但审计日志记录服务尚未在您的本地机器上运行。

在您的 IDE(例如 Visual Studio)中打开 Acme.CloudCrm.AuditLoggingService .NET 解决方案,将 Acme.CloudCrm.AuditLoggingService 设置为启动项目并运行它(使用 F5 进入调试模式或使用 CTRL+F5 运行而不调试)。

警告:不要使用 IIS Express 运行应用程序。拦截系统无法与 IIS Express 协同工作。只需在运行选项中切换到 Acme.CloudCrm.AuditLoggingService 项:

abp-studio-microservice-kubernetes-interception-iis-express-warning

一旦服务在您的本地计算机上启动,重新访问应用程序中的审计日志记录页面,您会看到在这种情况下它可以工作。ABP Studio 配置您的计算机和应用程序,使其像在 Kubernetes 集群内部一样工作。

借助 ABP Studio 的拦截功能,您可以在 Kubernetes 集群中运行整个解决方案,并且只在您的本地机器上用 IDE 运行单个(或少数几个)服务。通过这种方式,您可以轻松专注于运行、测试和调试您的服务,而无需关心系统的其余部分是如何配置和启动的。

要禁用对服务的拦截,请在 Kubernetes 选项卡中右键单击它,然后选择 禁用拦截 命令:

abp-studio-microservice-kubernetes-disable-interception

典型的开发流程可以如下:

  • 连接 到一个已经部署了解决方案的 Kubernetes 集群(如 Kubernetes 集成:连接到集群 部分所述)。您可以按照 Kubernetes 集成:使用 Helm 图表 部分所述自行操作。
  • 拦截 您想在本地机器上开发的服务。
  • 在您的本地环境中轻松地开发、运行、停止、修复、调试、重新运行...您的服务。您可以测试您的服务如何与其他服务集成,并访问 Kubernetes 中的应用程序 UI(您可以类似地为 Web 应用程序操作)。
  • 一旦您的开发完成,您可以 禁用 拦截并将服务重新部署到 Kubernetes 集群。

要将服务重新部署到 Kubernetes,请右键单击该服务并选择 命令 -> 重新部署 命令:

abp-studio-microservice-kubernetes-redeploy

ABP Studio 将重新构建 Docker 镜像并使用相关的 Helm 图表重新安装它。

另请参阅

在本文档中