探索ABP的EventHub解決方案

在上一章中,我們構建了一個簡單的全棧 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的AccountIdentityServer模塊完成。

探索解決方案

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] 請注意,HttpApiHttpApi.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項目,也間接引用了DomainDomain.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,如以下屏幕截圖所示:

三、方案運行

準備基礎環境

該解決方案需要RedisPostgreSQL服務器。在etc/docker夾中的存儲庫包含docker-compose文件。如果您的計算機上安裝了 Docker,可以直接執行文件夾中的up.ps1文件來運行這些服務器。如果您不能在您的計算機上使用 PowerShell,您可以在文本編輯器中打開並複製腳本,然後打開命令行終端並切換到etc/docker目錄中執行它。第一次運行,下載 Docker 鏡像可能需要幾分鐘。如果您不想使用 Docker,則需要在您的機器上手動安裝RedisPostgreSQL

打開解決方案

請在 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 的文檔以瞭解更多信息。

概括

EventHub 是一個基於 ABP 框架的完整的、真實的實時示例應用。而且已經發布在openeventhub.com上,我們可以在GitHub上隨時發送錯誤報告、推送請求和拉取代碼。

在本章中,我們重點介紹的解決方案的整體架構,以便您瞭解如何探索代碼庫和運行解決方案。下一章將參考該解決方案,同時介紹一些 ABP 特性和概念。

EventHub 是使用多個應用構建的一個很好的例子。這也是理解 ABP 分層模型以及如何在不同應用中重用這些層的一個示例。

截止目前你可能還不瞭解 EventHub 解決方案的所有細節,因爲我們還沒有解釋模塊化系統、數據庫集成、動態 C# 客戶端代理以及所有其他 ABP 功能。

在下一章中,我們將探索 ASP.NET Core 和 ABP 框架的基本模塊,以瞭解如何配置和初始化應用程序。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章