日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

基于事件驱动架构构建微服务第19部分:使用 SignalR 和 Azure Active Directory 构建和保护实时通信...

發(fā)布時(shí)間:2023/12/4 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 基于事件驱动架构构建微服务第19部分:使用 SignalR 和 Azure Active Directory 构建和保护实时通信... 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

原文鏈接: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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。