探索ABP的EventHub解决方案
ABP vNext系列文章和视频
第一部分
企业级软件开发和ABP框架
ABP框架入门
ABP应用开发(Step by Step)-上篇
ABP应用开发(Step by Step)-下篇
探索ABP的EventHub解决方案
第二部分
探索ABP基础架构-上
探索ABP基础架构-下
数据访问基础架构-上
数据访问基础架构-下
我的视频
我的Bilibili
我的知乎
我的知识星球
Abp vNextQ群
其他
ABP会臃肿吗?——玩转ABP框架有感
浅谈Abp vNext的模块化设计
使用abp vnext设计一款面向微服务的单体架构
在上一章中,我们构建了一个简单的全栈 Web 应用程序,我们已经看到了使用 ABP 框架开发应用的典型流程,在接下来,我们将使用 ABP 框架创建更高级的应用程序。
给出具有现实世界复杂性的例子并不容易,考虑到这一点,我们准备了一个使用 ABP 框架构建的完整的、真实的参考应用程序:EventHub。它是开源的,可在 GitHub 上免费获得。
EventHub 解决方案可在openeventhub.com上实时浏览。您可以尝试一下来探索它。我们已经建立了持续集成/持续开发(CI/CD) 管道,会实时进行网站更新,因为我们正在开发它并获得社区的贡献。欢迎随意查看其源代码,提交错误报告或功能请求!顾名思义,这是一个开放的平台。
在本文中,我们将在以下部分中研究 EventHub 解决方案:
- 应用介绍
- 架构探索
- 方案运行
一、应用介绍
活动中心是一个平台,用于组织创建活动。您可以亲自在线创建活动。以下截图取自openeventhub.com网站的主页:
您可以浏览主页上即将举行的 活动部分。单击一个事件了解详细信息并注册该事件。在活动开始之前或活动时间更改之时,您会收到电子邮件通知。
这是创建新事件页面的另一个截图:
您可以在此页面上选择您拥有的组织,设置标题、时间和描述,选择封面图片,并确定有关您正在组织活动的其他详细信息。
如果您想了解更多信息,请在openeventhub.com注册并探索该平台。在本书中,我想讨论的是技术细节而不是业务功能。让我们从大局开始,了解整个方案的架构。
二、架构探索
整体架构图
下面是解决方案整体架构图:
如图所示,有六个应用程序和一个数据库,下面提供了更多的信息:
- 身份验证服务器:此服务用于登录、注册和管理用户帐户。它基于 ABP 的标准Account模块,该模块基于该
IdentityServer
库。它是单点登录(SSO) 服务,这意味着如果您登录/退出到其中一个应用程序,那么您将登录/退出到所有应用程序。那是一个ASP.NET Core Razor Pages应用程序,它直接连接到数据库。 - 主站:这是最终用户用来注册和创建活动的平台 (www.openeventhub.com)它是一个使用Main HTTP API作为后端的Razor Pages应用程序。
- 管理员后台:此应用允许管理员管理组织、事件和系统。它使用Admin HTTP API进行所有操作,这是一个Blazor WebAssembly应用。
- 主站 HTTP API:主网使用调用的 HTTP API接口。
- Admin HTTP API:管理员后台调用的 HTTP API。
- 后台服务:运行系统后台进程服务和后台作业的控制台程序。
- 数据库:这是一个关系型 PostgreSQL数据库,用于存储系统中的所有数据。
由于是分布式系统,所以使用Redis作为分布式缓存服务器。
我们先从身份验证流程开始。
认证流程
如前所述,Authentication Server是一个 SSO 服务,用于对用户和客户端进行身份验证。当用户想要登录时,主网站和管理员后台使用OpenID Connect(OIDC) 协议将用户重定向到**身份验证服务器。**下图显示了登录过程:
它的逻辑顺序是这样的:
- 当用户想要访问主站时 (1),主站将用户重定向到身份验证服务 (2)。
- 身份验证服务有一个登录页面,用户可以输入用户名和密码或注册为新用户。登录完成后,用户将重定向回主站,并返回授权码 (3) 和 (4)。
- 然后,主站使用获得的授权码向服务器执行令牌请求 (5)。
- 身份验证服务返回一个标识符(包含一些用户信息,例如用户名、ID、电子邮件等)和一个访问令牌 (6)。
- 主站将访问令牌存储在 cookie 中(管理员后台将令牌存储在浏览器的本地存储中),以便在下一个请求中获取。在接下来的请求中,它从 cookie 中获取访问令牌并将其添加到 HTTP 请求头中,同时对Main HTTP API执行 HTTP 请求 (7)。
- Main HTTP API 验证访问令牌 (8) 并授权请求。
所有这些过程都由 ABP的Account
和IdentityServer
模块完成。
探索解决方案
EventHub.NET 解决方案由多个项目组成,按应用类型分组,如下图所示:
该解决方案有两个应用层和一个领域层,以及相应的 HTTP API 和用户界面(UI) 层。两个应用层共享领域层,但它们具有不同的应用程序逻辑,因此它们是分开的。
common 文件夹
我们先介绍common
文件夹。该文件夹包含通用库和服务,如下所述:
EventHub.Domain
项目是包含实体、领域服务和其他领域对象的领域层。EventHub.Domain.Shared
项目包含常量和一些其他类,它们是所有层和应用的共享层。EventHub.EntityFrameworkCore
项目包含DbContext
、映射、数据库迁移、存储库实现以及与 EF Core 相关的其他代码。EventHub.DbMigrator
项目是一个控制台应用,用于数据库迁移并初始化数据(例如管理员用户/角色及其权限),支持开发和生产环境。EventHub.BackgroundServices
项目是另一个控制台应用,用于运行后台作业。
www 文件夹
www
文件夹包含主站项目:
EventHub.Application
包括应用服务的实现,EventHub.Application.Contracts
包括应用服务接口和DTO。EventHub.HttpApi
包含 UI(Web)层使用的 API 控制器,该控制器是应用服务的简单包装器。EventHub.HttpApi.Host
托管 HTTP API 层。通过这种方式,托管逻辑与包含 API 控制器的项目分离(重用EventHub.HttpApi
)。EventHub.HttpApi.Client
一个调用 API 的客户端。UI (web) 层使用该项目来调用 HTTP API。该项目使用 ABP 的动态 C# 代理功能。EventHub.Web
是应用程序的 UI 层。这是一个典型的 Razor Pages 应用。它没有数据库连接,调用Main HTTP API进行操作。EventHub.Web.Theme
自定义主题。ABP 有一个主题系统,您可以使用它来构建自己的主题并在其他应用中重用它们。EventHub.Web
项目使用此主题。主题系统将在第 4 部分,用户界面和 API 开发中介绍。
admin 文件夹
admin
文件夹包含管理员后台,由维护系统的用户使用,这里有更详细的解释:
EventHub.Admin.Application
项目是管理员后台的应用层,包含应用服务的实现,EventHub.Admin.Application.Contracts
包含与UI层共享的应用服务接口和DTO。EventHub.Admin.HttpApi
包含 UI(Web)层使用的 API 控制器。EventHub.Admin.HttpApi.Host
项目托管 HTTP API 层。通过这种方式,托管逻辑与包含 API 控制器的项目分离。EventHub.Admin.HttpApi.Client
项目是一个调用 API 的客户端。UI (web) 层使用该项目来调用 HTTP API。该项目使用 ABP 的动态 C# 代理功能。EventHub.Admin.Web
项目是应用程序的 UI 层。这是一个在浏览器中运行并对服务器执行 HTTP API 调用的Blazor WebAssembly应用。
account 文件夹
account
文件夹包含单个项目EventHub.IdentityServer
,其他应用程序使用该项目对用户进行身份验证。
我们已经简要地介绍了解决方案中的所有项目,下面介绍项目之间的依赖关系。
项目依赖关系
在接下来的部分中,我将展示每个项目的依赖关系图,以便您了解代码库的组织方式。我们从基本应用程序主站开始。
Main Application(主站)
请记住,主站是互联网终端用户使用应用程序:www.openeventhub.com。下图显示了项目依赖关系,从应用程序的根项目Web
开始:
该Web
项目依赖于Web.Theme
,它实现了 EventHub 的 UI 主题。Web.Theme
是一个单独的项目,因为它同时被Authentication Server复用。
项目Web
也依赖于HttpApi
项目。我们可以在Web项目的客户端 (JavaScript) 中调用这些 API,当您通过HttpApi.Client
调用 HTTP API 时,请求将重定向到 Main HTTP API (后端)。
[success] 请注意,
HttpApi
和HttpApi.Client
都引用了Application.Contacts
项目。
HttpApi
引用.Contracts
接口层,而HttpApi.Client
使用 ABP 的动态 C# 代理实现了这些接口,并通过执行HTTP远程调用Main HTTP API。
Main HTTP API(主站API)
主站使用Main HTTP API作为后端 API。它包含应用领域逻辑。下图显示了根项目HttpApi.Host
及其直接或间接依赖项:
- 通过引用(添加依赖)
HttpApi
项目(包括 API 控制器),客户端可以响应 HTTP API 调用; - HTTP API 控制器使用
Application.Contracts
项目中定义的服务接口,而这些接口由Application
项目实现,这就是为什么我们需要在HttpApi.Host
项目中引用Application
项目,而Application
往下依赖的是Domain
层,通过它来执行业务逻辑。 HttpApi.Host
项目还引用了该EntityFrameworkCore
项目,因为我们在运行时需要一个数据层。该EntityFrameworkCore
项目将实体映射到数据库中的表,并实现了Domain
项目中定义的存储库接口。
请注意,Application.Contracts
项目,以及Domain.Shared
项目由客户端程序Main Website共享(以及Domain.Shared
项目是间接被共享),因此它们可以依赖相同的应用程序接口进行通信。
我们现在已经了解了主站应用程序,下一部分介绍管理员后台:
Admin Application(管理员站)
管理员后台站点的前端采用的是Blazor WebAssembly技术,它有一组不同的 API、UI 页面、授权规则、缓存要求等。它有不同的应用层和 HTTP API 层,共享相同的领域层,使用相同的领域逻辑和相同的数据库。
如下图所示:
此图很简单。Admin.Web
项目(即 Blazor WebAssembly )引用Admin.HttpApi.Client
项目,因为它需要调用远程 HTTP API。而项目Admin.HttpApi.Client
依赖于Admin.Application.Contracts
项目(内部依赖于Domain.Shared
项目),目的是要使用其中定义的应用服务接口。
Admin HTTP API(管理员站 API)
管理员站点调用Admin HTTP API。它运行着管理员后台的应用逻辑。下图显示了根项目Admin.HttpApi.Host
及其直接和间接依赖项:
该图与Main HTTP API非常相似。区别在于他们具有不同的 HTTP API 和应用层。但是使用相同的领域和数据库集成 (EntityFrameworkCore
) 层。
认证服务器
Authentication Server的根项目是IdentityServer
,依赖关系如下:
IdentityServer
项目和主站一样,也引用Web.Theme
,它还引用了EntityFrameworkCore
项目。通过引用EntityFrameworkCore
项目,也间接引用了Domain
和Domain.Shared
项目。
后台服务
BackgroundServices
项目具有下图所示的依赖项:
BackgroundServices
项目引用EntityFrameworkCore
,以便操作数据库,它还可以使用领域对象(实体、域服务)来执行后台任务。
我们已经介绍完了解决方案中的所有项目。现在,我们准备在本地开发环境中运行它们。
如果你想要在您的本地环境中运行解决方案,请按照以下步骤操作。
克隆 GitHub 存储库
首先,你需要在本地计算机上克隆 GitHub 存储库。该存储库位于https://github.com/volosoft/eventhub,可以使用以下命令进行克隆(需要安装 Git 工具):
git clone https://github.com/volosoft/eventhub.git
或者,导航到https://github.com/volosoft/eventhub,单击Code按钮,然后单击Download ZIP,如以下屏幕截图所示:
三、方案运行
准备基础环境
该解决方案需要Redis和PostgreSQL服务器。在etc/docker
夹中的存储库包含docker-compose
文件。如果您的计算机上安装了 Docker,可以直接执行文件夹中的up.ps1
文件来运行这些服务器。如果您不能在您的计算机上使用 PowerShell,您可以在文本编辑器中打开并复制脚本,然后打开命令行终端并切换到etc/docker
目录中执行它。第一次运行,下载 Docker 镜像可能需要几分钟。如果您不想使用 Docker,则需要在您的机器上手动安装Redis和PostgreSQL。
打开解决方案
请在 Visual Studio 或其他与 .NET 兼容的 IDE 中打开前面下载的解决方案EventHub.sln
。
创建数据库
该解决方案有一个EventHub.DbMigrator
项目,运行此应用程序(对于 Visual Studio,右键单击它并选择设为启动项目,然后按 Ctrl+F5)。它将创建一个数据库并初始化一些数据。
运行应用程序
我们现在准备好启动程序。您可以按以下顺序运行项目(对于 Visual Studio,右键单击每个项目,选择设为启动项目,然后按 Ctrl+F5)
EventHub.IdentityServer
EventHub.HttpApi.Host
EventHub.Web
EventHub.Admin.HttpApi.Host
EventHub.Admin.Web
EventHub.BackgroundServices
请使用admin
用户名和1q2w3E*
密码进行登录。当然,您可以在 UI 上创建其他用户。
[success] 请注意,当您运行多个应用程序时,Visual Studio 会出现一些问题。有时,以前运行的应用程序可能会停止。在这种情况下,请再次运行停止的应用程序。
微软的Tye
使得运行多个应用程序变得更加容易。下面介绍这种运行方式:
使用 Tye 项目
如果你不想要开发或调试解决方案但只想运行它,您可以使用 Microsoft的Tye
项目来运行它,而无需打开 IDE。Tye
是一个 .NET 全局工具,用于通过简单的配置简化运行此类分布式应用程序。EventHub 解决方案支持使用Tye
配置,您需要做的就是安装Tye
并运行它。
在使用之前Tye
,您仍然需要准备基础环境(同上),然后使用EventHub.DbMigrator
创建数据库(打开命令行终端并,并切换到目录src/EventHub.DbMigrator
,运行以下命令:
dotnet run
数据库准备好后,您可以在命令行终端中执行以下命令来安装Tye
:
dotnet tool install -g Microsoft.Tye
在撰写本书时,Tye
项目仍处于预览阶段。您可能需要指定最新的预览版本(您可以在 NuGet 上找到此内容,网址为https://www.nuget.org/packages/Microsoft.Tye)。请参阅以下代码片段:
dotnet tool install -g Microsoft.Tye --version "0.10.0-alpha.21420.1"
点击查阅以了解如何安装Tye
。
Tye
需要在您的计算机上预先安装 Docker。全部安装完成后,您可以运行以下命令启动应用程序(如果IDE已打开,建议先关闭IDE):
tye run
第一次运行需要一些时间。完成后,您可以打开浏览器并导航至http://127.0.0.1:8000
打开Tye Dashboard,如下图:
Tye仪表板用于观看实时应用及其日志。您可以单击Bingdings列上的链接以打开任何应用。web
是系统的主站。
当您的解决方案包含多个需要一起运行的应用时,Tye 是一个很方便的工具。您还可以dotnet watch
对项目进行配置,以便在您更改项目时自动重新加载(或使用 .NET 6.0 热加载)。请参阅 Microsoft 的文档以了解更多信息。
随笔分类 - 解读ABP
ABP框架之——数据访问基础架构(下) 摘要:大家好,我是张飞洪,感谢您的阅读,我会不定期和你分享学习心得,希望我的文章能成为你成长路上的一块垫脚石,我们一起精进。 EF Core集成 EF Core是微软的ORM,可以使用它与主流的数据库提供商合作,如SQL Server、Oracle、MySQL、PostgreSQL和Cosmos DB。当 阅读全文 posted @ 2022-06-23 14:38 张飞洪[厦门] 阅读(882) 评论(0) 推荐(4) 编辑 ABP框架之——数据访问基础架构(上) 摘要:大家好,我是张飞洪,感谢您的阅读,我会不定期和你分享学习心得,希望我的文章能成为你成长路上的一块垫脚石,我们一起精进。 几乎所有的业务应用程序都要适用一种数据库基础架构,用来实现数据访问逻辑,以便从数据库读取或写入数据,我们还需要处理数据库事务,以确保数据源中的一致性。 ABP框架可以与任何数据库兼 阅读全文 posted @ 2022-05-25 09:39 张飞洪[厦门] 阅读(640) 评论(1) 推荐(3) 编辑 探索ABP基础架构-下 摘要:配置应用程序 ASP.NET Core 的配置系统提供了一个基于键值对的配置方法。它是一个可扩展的系统,可以从各种资源中读取键值对,例如 JSON 设置文件、环境变量、命令行参数等等。 设置配置值 默认使用appsettings.json文件是配置的最简单方法。假设我们正在构建一个使用 Azure 阅读全文 posted @ 2022-05-17 09:59 张飞洪[厦门] 阅读(540) 评论(0) 推荐(2) 编辑 探索ABP基础架构-上 摘要:为了了解应用程序是如何配置和初始化,本文将探讨ASP.NET Core和ABP框架最基本的构建模块。我们将从 ASP.NET Core 的 Startup类开始了解为什么我们需要模块化系统,以及 ABP 如何提供模块化方式来配置和初始化应用程序。然后我们将探索 ASP.NET Core 的依赖注入, 阅读全文 posted @ 2022-05-15 09:41 张飞洪[厦门] 阅读(3174) 评论(7) 推荐(17) 编辑 ABP vNext系列文章和视频 摘要:《Mastering ABP Framework》图书目录 第一部分 企业级软件开发和ABP框架 ABP框架入门 ABP应用开发(Step by Step)-上篇 ABP应用开发(Step by Step)-下篇 探索ABP的EventHub解决方案 第二部分 探索ABP基础架构-上 探索ABP基础 阅读全文 posted @ 2022-05-10 11:22 张飞洪[厦门] 阅读(782) 评论(1) 推荐(3) 编辑 探索ABP的EventHub解决方案 摘要:在上一章中,我们构建了一个简单的全栈 Web 应用程序,我们已经看到了使用 ABP 框架开发应用的典型流程,在接下来,我们将使用 ABP 框架创建更高级的应用程序。 给出具有现实世界复杂性的例子并不容易,考虑到这一点,我们准备了一个使用 ABP 框架构建的完整的、真实的参考应用程序:EventHub 阅读全文 posted @ 2022-05-10 10:50 张飞洪[厦门] 阅读(491) 评论(0) 推荐(2) 编辑 Abp集成HangFire 摘要:简要说明 后台作业在系统开发的过程当中,是比较常用的功能。因为总是有一些长耗时的任务,而这些任务我们不是立即响应的,例如 Excel 文档导入、批量发送短信通知等。 ABP vNext 提供了后台作业的支持,并且还提供了对 HangFire 和 RabbitMQ 的后台作业集成。开发人员在使用这些第 阅读全文 posted @ 2022-04-29 09:59 张飞洪[厦门] 阅读(202) 评论(0) 推荐(0) 编辑 《Mastering ABP Framework》图书目录 摘要:以下是《Mastering ABP Framework》的中文目录,目前个人正在进行翻译中,如果您对本书感兴趣,也想使用或者学习框架设计,可以访问该地址进行登记,本文只是一个目的的展示和购买调研,因为版权和印刷的需要一定的成本,所以导致出版该书存在一定的风险,谢谢您的支持和理解。也许我的这个系列翻译 阅读全文 posted @ 2022-04-28 15:03 张飞洪[厦门] 阅读(992) 评论(3) 推荐(1) 编辑 ABP应用开发(Step by Step)-下篇 摘要:测试 ProductAppService 类 启动模板附带测试基础架构,包括xUnit、Shouldly和NSubstitute库。它使用SQLite 内存数据库来模拟数据库,并为每个测试创建一个单独的数据库。它会自动初始化数据并在测试结束时销毁测试数据。通过这种方式,测试不会相互影响,并且您的真实 阅读全文 posted @ 2022-04-27 09:40 张飞洪[厦门] 阅读(685) 评论(0) 推荐(2) 编辑 ABP应用开发(Step by Step)-上篇 摘要:本文主要通过逐步构建一个CRUD示例程序来介绍 ABP 框架的基础知识。它涉及到应用开发的多个方面。在本章结束时,您将了解ABP 框架的基本开发方式。建议入门人员学习,老手不要浪费您宝贵时间。 创建解决方案 第1步是为产品管理解决方案(如果您在前面已经创建过了ProductManagement解决方 阅读全文 posted @ 2022-04-26 09:32 张飞洪[厦门] 阅读(983) 评论(3) 推荐(1) 编辑 ABP框架入门 摘要:本文适合初级开发人员,不适合老手在上面浪费时间,希望能帮新人起到一个引导的作用。 技术准备 在开始使用 ABP 框架之前,您需要在计算机上安装一些工具。 IDE/编辑器 本书假设您使用的是Visual Studio 2022(支持 .NET 6.0 的 v10.0)或更高版本。如果你还没安装,社区版 阅读全文 posted @ 2022-04-24 10:30 张飞洪[厦门] 阅读(1346) 评论(1) 推荐(4) 编辑 如何设计一个良好的API接口? 摘要:沟通创造价值,分享带来快乐。这里是程序员阅读时间,每天和你分享读书心得,欢迎您每天和我一起精进。今天和大家一起讨论的话题是如何设计一个良好的API接口? 作者:梁桂钊 解读:张飞洪 挑战 API是软件系统的核心,而我们在设计API接口的时候会面临着非常多的挑战: 场景上来看,它是多样的,如何设计一个 阅读全文 posted @ 2022-04-23 14:51 张飞洪[厦门] 阅读(997) 评论(0) 推荐(7) 编辑 企业级软件开发和ABP 框架 摘要:导语 在开始文章之前,我给大家举一个发生在我身边的例子。我们交付的软件是面向企业的一锤子买卖,后期可能会存在个别定制化。前期我们直接按项目来走,因为我们也不知道未来的业务长什么样子,只是知道大概的范围。随着项目的增长,我们团队成员直接复制一份代码,然后修修改改就适配了一个新项目,因为认为这么做最快, 阅读全文 posted @ 2022-04-22 09:37 张飞洪[厦门] 阅读(1119) 评论(2) 推荐(1) 编辑 ABP会臃肿吗?——玩转ABP框架有感 摘要:大家好,我是张飞洪,谢谢你阅读我的文章,自从土牛Halil ibrahim Kalkan的《Mastering ABP Framework》出版之后,我就开始马不停蹄进行阅读和翻译,目前基本保持一周一章的进度。 为什么要翻译? ABP的官方文档应该是比较全面了,但是有几个问题: 本人目前维护一个AB 阅读全文 posted @ 2022-04-21 14:00 张飞洪[厦门] 阅读(1418) 评论(4) 推荐(6) 编辑 浅谈Abp vNext的模块化设计 摘要:abp的模块化给我留下深刻的印象,模块化不是什么新概念,大家都习以为常,但是为什么要模块化,模块化的意义或者说目的是什么?也许我们思考得并不深入。难得的是abp不仅完美的阐述了模块化概念,而且把模块化落地得十分优雅,并且进行了开源。 模块化内涵? 模块分类 根据粒度大小的不同,模块具有各自的概念,我 阅读全文
概括
EventHub 是一个基于 ABP 框架的完整的、真实的实时示例应用。而且已经发布在openeventhub.com上,我们可以在GitHub上随时发送错误报告、推送请求和拉取代码。
在本章中,我们重点介绍的解决方案的整体架构,以便您了解如何探索代码库和运行解决方案。下一章将参考该解决方案,同时介绍一些 ABP 特性和概念。
EventHub 是使用多个应用构建的一个很好的例子。这也是理解 ABP 分层模型以及如何在不同应用中重用这些层的一个示例。
截止目前你可能还不了解 EventHub 解决方案的所有细节,因为我们还没有解释模块化系统、数据库集成、动态 C# 客户端代理以及所有其他 ABP 功能。
在下一章中,我们将探索 ASP.NET Core 和 ABP 框架的基本模块,以了解如何配置和初始化应用程序。
标签:HTTP,项目,解决方案,应用程序,ABP,API,EventHub From: https://www.cnblogs.com/Leo_wl/p/16614944.html