基于事件驱动架构构建微服务第19部分:使用 SignalR 和 Azure Active Directory 构建和保护实时通信...
原文鏈接:https://logcorner.com/building-micro-services-through-event-driven-architecture-part19-building-and-securing-real-time-communications-using-signalr-and-azure-active-directory/
命令 HTTP API 將事件存儲(chǔ)到事件存儲(chǔ),但不直接將它們發(fā)布到 Kafka 服務(wù)總線。可以考慮這種情況,但我不希望命令 API 也充當(dāng)生產(chǎn)者。
另一個(gè)原因是前端SPA應(yīng)該收到推送通知。應(yīng)該通知它發(fā)布的命令已成功。
所以我需要一個(gè)像SignalR這樣的通知系統(tǒng)。
使用場(chǎng)景如下:
前端 SPA 啟動(dòng)并訂閱 SignalR 組(主題)
前端 SPA 將數(shù)據(jù)發(fā)布到命令 HTTP API
命令 HTTP API 將從post/put/delete請(qǐng)求中接收的數(shù)據(jù)轉(zhuǎn)換為事件,并將這些事件存儲(chǔ)到事件存儲(chǔ)中
命令 HTTP API 將通知推送到 SignalR 組(主題)
訂閱 SignalR 組的生產(chǎn)者服務(wù)接收通知,然后將事件發(fā)布到 Kafka 服務(wù)總線
訂閱 Kafka 服務(wù)總線的使用者從 Kafka 服務(wù)總線接收事件,然后構(gòu)建一個(gè)讀取模型并將其存儲(chǔ)到非 SQL 數(shù)據(jù)庫(kù)(Elasticsearch)并向 SignalR 組發(fā)送通知
前端 SPA 會(huì)收到 Elasticsearch 索引已更新的通知,然后刷新視圖。
因此,推送通知系統(tǒng)在此體系結(jié)構(gòu)中起著至關(guān)重要的作用。
如果架構(gòu)的某個(gè)部分出現(xiàn)故障(SignalR Hub、Kafka、database、API)會(huì)發(fā)生什么?我們將在以后的教程中看到它。
在本教程中,我將演示如何構(gòu)建 SignalR Hub 通知系統(tǒng),并使用標(biāo)識(shí)提供者通過使用 Azure AD B2C 啟用 Oauth2 和 OpenID Connect 來保護(hù) SignalR Hub 通知系統(tǒng)。
Azure Active Directory B2C 提供企業(yè)到客戶的標(biāo)識(shí)即服務(wù)。客戶使用其首選的社交、企業(yè)或本地帳戶標(biāo)識(shí)來獲取對(duì)應(yīng)用程序和 API 的單一登錄訪問權(quán)限。
有關(guān) Azure AD B2C 的更多信息,請(qǐng)參閱什么是 Azure Active Directory B2C?
Azure Active Directory B2C
若要將 Azure AD B2C 設(shè)置為標(biāo)識(shí)提供者,我需要?jiǎng)?chuàng)建一個(gè)與 Azure AD 租戶不同的 B2C 租戶。
Azure AD B2C 是獨(dú)立于 Azure Active Directory (Azure AD) 的服務(wù)。它基于與 Azure AD 相同的技術(shù)構(gòu)建,但用途不同 - 允許企業(yè)構(gòu)建面向客戶的應(yīng)用程序,然后允許任何人注冊(cè)這些應(yīng)用程序,而對(duì)用戶帳戶沒有限制。
有關(guān) Azure AD 的更多信息,請(qǐng)參閱什么是 Azure Active Directory?
構(gòu)建 SignalR Hub 通知
ASP.NET Core SignalR 是一個(gè)開源庫(kù),可簡(jiǎn)化向應(yīng)用程序添加實(shí)時(shí)Web功能的過程。實(shí)時(shí) Web 功能使服務(wù)器端代碼能夠立即將內(nèi)容推送到客戶端。
https://docs.microsoft.com/en-us/aspnet/core/signalr/introduction?WT.mc_id=DOP-MVP-5003013
要構(gòu)建 SignalR Hub ,您應(yīng)該定義一個(gè)從 Hub 繼承的類,如下所示:
using?Microsoft.AspNetCore.SignalR;namespace?SignalRChat.Hubs {public?class?ChatHub?:?Hub{public?async?Task?SendMessage(string?user,?string?message){await?Clients.All.SendAsync(“ReceiveMessage”,?user,?message);}} }要向所有連接的客戶端發(fā)送消息,您應(yīng)該使用SendMessage功能并接收消息,連接的客戶端應(yīng)偵聽接收消息
您可以使用以下鏈接開始使用 SignalR:https://docs.microsoft.com/en-us/aspnet/core/tutorials/signalr?view=aspnetcore-6.0&tabs=visual-studio
SendMessage和ReisterMessage作為字符串使用和調(diào)用,所以我不會(huì)以相同的方式繼續(xù),而是使用強(qiáng)類型的方式
所以我創(chuàng)建了一個(gè)IHubInvoker接口來調(diào)用Hub:
發(fā)布 :將 T 類型的消息發(fā)布到中心
發(fā)布到主題 :將特定主題的 T 類型消息發(fā)布到中心
訂閱 :訂閱主題
取消訂閱 :取消訂閱主題
我創(chuàng)建了一個(gè) IHubNotifier 接口來偵聽來自集線器的消息。
SignalR Hub 應(yīng)該繼承自 Hub<IHubNotifier>、IHubInvoker
在 startup.cs ( configure 方法) 類將 endpoints 與連接相關(guān)聯(lián)。
我創(chuàng)建了一個(gè) ISignalRPublisher 接口來訂閱主題或?qū)⑾l(fā)布到中心。
所以要訂閱一個(gè)主題,我應(yīng)該調(diào)用 nameof(IHubInvoker.Subscribe) ,要發(fā)布一個(gè)主題,我應(yīng)該調(diào)用nameof(IHubInvoker.PublishToTopic)
我創(chuàng)建了一個(gè) ISignalRNotifier 接口來開始客戶端連接,停止連接并收聽消息
因此,為了偵聽和處理發(fā)送到中心的消息,我注冊(cè)了一個(gè)處理程序,當(dāng)調(diào)用具有指定方法名稱的中心方法時(shí),將調(diào)用該處理程序:nameof(IHubNotifier.OnPublish)
ISignalRNotifier 應(yīng)按如下方式使用
public?interface?ISignalRNotifier {event?Action<string,?object>?ReceivedOnPublishToTopic;Task?StartAsync();Task?OnPublish();Task?OnPublish(string?topic);Task?StopAsync(); }要將消息發(fā)布到 hub,我應(yīng)該使用 ISignalRPublisher 接口。如果斷開連接的客戶端嘗試向中心發(fā)送消息,在發(fā)送消息之前會(huì)自動(dòng)連接它
保護(hù) SignalR HUB
若要保護(hù)SignalR HUB,需要在 Azure AD B2C 租戶中注冊(cè)應(yīng)用程序,公開終結(jié)點(diǎn)
Azure AD B2C 應(yīng)用程序注冊(cè)
轉(zhuǎn)到租戶并單擊"應(yīng)用注冊(cè)"并相應(yīng)地填寫表單:提供應(yīng)用程序名稱、支持的帳戶類型。在這里,我不需要重定向URI,因?yàn)樗且粋€(gè)Web api。
單擊"公開 API"并設(shè)置應(yīng)用程序 ID URI(在本例中為,https://workshopb2clogcorner.onmicrosoft.com/signalr/hub)
配置 SignalR HUB
打開 startup.cs 類并添加以下內(nèi)容以注冊(cè)身份驗(yàn)證服務(wù)所需的服務(wù),并使用 Microsoft 標(biāo)識(shí)平臺(tái)保護(hù)hub
打開appsettings.Development.json 并添加如下內(nèi)容
將 [ClientID] 替換為您注冊(cè)的應(yīng)用程序的標(biāo)識(shí)符,將 [TenantName] 替換為您的租戶名稱(在我的案例 workshopb2clogcorner 中)。
用戶流B2C_1_SignUpIn、B2C_1_PasswordReset和B2C_1_ProfileEdit已在第16部分中配置:https://logcorner.com/building-micro-services-through-event-driven-architecture-part16-azure-active-directory-b2c/
要啟用身份驗(yàn)證,請(qǐng)使用標(biāo)志"isAuthenticationEnabled":在 appSettings.json 文件中為 true。
要禁用身份驗(yàn)證,請(qǐng)使用標(biāo)志"isAuthenticationEnabled":在 appSettings.json 文件中為 false。
在 startup.cs 類中,它的管理方式如下:
bool.TryParse(Configuration[“isAuthenticationEnabled”],?out?var?isAuthenticationEnabled); if?(!isAuthenticationEnabled) {endpoints.MapHub<LogCornerHub<object>>(“/logcornerhub”); } else {endpoints.MapHub<LogCornerHub<object>>(“/logcornerhub”).RequireAuthorization(); }測(cè)試
運(yùn)行應(yīng)用程序并導(dǎo)航到 http://localhost:5000/logcornerhub 或者 https://localhost:5001/logcornerhub
http://localhost:5000/logcornerhub
https://localhost:5001/logcornerhub
可以看到,hub 已準(zhǔn)備好進(jìn)行客戶端連接
代碼源可在此處獲得:
https://github.com/logcorner/LogCorner.EduSync.Notification.Server/tree/develop
總結(jié)
以上是生活随笔為你收集整理的基于事件驱动架构构建微服务第19部分:使用 SignalR 和 Azure Active Directory 构建和保护实时通信...的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: .NET7的七项重大改进!
- 下一篇: WTMPlus 1.4 Uniapp来了