基于事件驱动架构构建微服务第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 将事件存储到事件存储,但不直接将它们发布到 Kafka 服务总线。可以考虑这种情况,但我不希望命令 API 也充当生产者。

另一个原因是前端SPA应该收到推送通知。应该通知它发布的命令已成功。

所以我需要一个像SignalR这样的通知系统。

使用场景如下:

  • 前端 SPA 启动并订阅 SignalR 组(主题)

  • 前端 SPA 将数据发布到命令 HTTP API

  • 命令 HTTP API 将从post/put/delete请求中接收的数据转换为事件,并将这些事件存储到事件存储中

  • 命令 HTTP API 将通知推送到 SignalR 组(主题)

  • 订阅 SignalR 组的生产者服务接收通知,然后将事件发布到 Kafka 服务总线

  • 订阅 Kafka 服务总线的使用者从 Kafka 服务总线接收事件,然后构建一个读取模型并将其存储到非 SQL 数据库(Elasticsearch)并向 SignalR 组发送通知

  • 前端 SPA 会收到 Elasticsearch 索引已更新的通知,然后刷新视图。

因此,推送通知系统在此体系结构中起着至关重要的作用。

如果架构的某个部分出现故障(SignalR Hub、Kafka、database、API)会发生什么?我们将在以后的教程中看到它。

在本教程中,我将演示如何构建 SignalR Hub 通知系统,并使用标识提供者通过使用 Azure AD B2C 启用 Oauth2 和 OpenID Connect 来保护 SignalR Hub 通知系统。

Azure Active Directory B2C 提供企业到客户的标识即服务。客户使用其首选的社交、企业或本地帐户标识来获取对应用程序和 API 的单一登录访问权限。

有关 Azure AD B2C 的更多信息,请参阅什么是 Azure Active Directory B2C?

Azure Active Directory B2C

若要将 Azure AD B2C 设置为标识提供者,我需要创建一个与 Azure AD 租户不同的 B2C 租户。

Azure AD B2C 是独立于 Azure Active Directory (Azure AD) 的服务。它基于与 Azure AD 相同的技术构建,但用途不同 - 允许企业构建面向客户的应用程序,然后允许任何人注册这些应用程序,而对用户帐户没有限制。

有关 Azure AD 的更多信息,请参阅什么是 Azure Active Directory?

构建 SignalR Hub 通知

ASP.NET Core SignalR 是一个开源库,可简化向应用程序添加实时Web功能的过程。实时 Web 功能使服务器端代码能够立即将内容推送到客户端。

https://docs.microsoft.com/en-us/aspnet/core/signalr/introduction?WT.mc_id=DOP-MVP-5003013

要构建 SignalR Hub ,您应该定义一个从 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);}}
}

要向所有连接的客户端发送消息,您应该使用SendMessage功能并接收消息,连接的客户端应侦听接收消息

您可以使用以下链接开始使用 SignalR:https://docs.microsoft.com/en-us/aspnet/core/tutorials/signalr?view=aspnetcore-6.0&tabs=visual-studio

SendMessage和ReisterMessage作为字符串使用和调用,所以我不会以相同的方式继续,而是使用强类型的方式

所以我创建了一个IHubInvoker接口来调用Hub:

  • 发布 :将 T 类型的消息发布到中心

  • 发布到主题 :将特定主题的 T 类型消息发布到中心

  • 订阅 :订阅主题

  • 取消订阅 :取消订阅主题

d1761e47dc347b07a871e85b37740984.png

我创建了一个 IHubNotifier 接口来侦听来自集线器的消息。

52f568fe7d0e6d669cf004c73425a553.png

SignalR Hub 应该继承自 Hub<IHubNotifier>、IHubInvoker

f1da1df36335d148d2c2e4460398e465.png

在 startup.cs ( configure 方法) 类将 endpoints 与连接相关联。

852b476770313c9d73196edb941d1563.png

我创建了一个 ISignalRPublisher 接口来订阅主题或将消息发布到中心。

5c166c5e275c42fdcdafc56c490cba39.png

所以要订阅一个主题,我应该调用 nameof(IHubInvoker.Subscribe) ,要发布一个主题,我应该调用nameof(IHubInvoker.PublishToTopic)

cce9dc2d6a3877487c5fe45dc62d8305.png

我创建了一个 ISignalRNotifier 接口来开始客户端连接,停止连接并收听消息

7055d4fdc12e110b6438344df1c9b90e.png

因此,为了侦听和处理发送到中心的消息,我注册了一个处理程序,当调用具有指定方法名称的中心方法时,将调用该处理程序:nameof(IHubNotifier.OnPublish)

2007cf1d816f200cb902c6716805d1fd.png

ISignalRNotifier 应按如下方式使用

public interface ISignalRNotifier
{event Action<string, object> ReceivedOnPublishToTopic;Task StartAsync();Task OnPublish();Task OnPublish(string topic);Task StopAsync();
}

0c9f802ee54bcaf9edd4372e6437f287.png

要将消息发布到 hub,我应该使用 ISignalRPublisher 接口。如果断开连接的客户端尝试向中心发送消息,在发送消息之前会自动连接它

a3973eb6daf1f0b04061e1aeb33bf2c8.png

保护 SignalR HUB

若要保护SignalR HUB,需要在 Azure AD B2C 租户中注册应用程序,公开终结点

Azure AD B2C 应用程序注册

转到租户并单击"应用注册"并相应地填写表单:提供应用程序名称、支持的帐户类型。在这里,我不需要重定向URI,因为它是一个Web api。

a3467a9dbd55dbd1cdd93348fd94d22b.png

单击"公开 API"并设置应用程序 ID URI(在本例中为,https://workshopb2clogcorner.onmicrosoft.com/signalr/hub)

a779f00a908dd6207a225fb99734d52d.png

配置 SignalR HUB

打开 startup.cs 类并添加以下内容以注册身份验证服务所需的服务,并使用 Microsoft 标识平台保护hub

3ab19066819c879a79a65d36cfcaf077.png

打开appsettings.Development.json 并添加如下内容

将 [ClientID] 替换为您注册的应用程序的标识符,将 [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/

3d32728b70c5dca9333b081acf1587ca.png

要启用身份验证,请使用标志"isAuthenticationEnabled":在 appSettings.json 文件中为 true。

要禁用身份验证,请使用标志"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();
}

测试

运行应用程序并导航到 http://localhost:5000/logcornerhub 或者 https://localhost:5001/logcornerhub

6f9d94e899d5f2b5934534c66d026422.png

http://localhost:5000/logcornerhub

e6937c48463a129d9bcd5143b0cea036.png

https://localhost:5001/logcornerhub

fe5992193a7142969db6e617f3394da0.png

可以看到,hub 已准备好进行客户端连接

代码源可在此处获得:

https://github.com/logcorner/LogCorner.EduSync.Notification.Server/tree/develop

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/291260.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Orchard之生成新模板

一&#xff1a;启用 Code Generation 进入后台&#xff0c; Modules –> Developer Enable 之。 二&#xff1a;生成模版 首先&#xff0c;进入 Orchard 命令行 在 CMD 下到达解决方案的 Web 的 Bin 目录下&#xff0c;打开 Orchard 命令&#xff0c;输入&#xff1a; code…

Java设计模式-状态模式(State)

核心思想就是&#xff1a;当对象的状态改变时&#xff0c;同时改变其行为&#xff0c;很好理解&#xff01;就拿QQ来说&#xff0c;有几种状态&#xff0c;在线、隐身、忙碌等&#xff0c;每个状态对应不同的操作&#xff0c;而且你的好友也能看到你的状态&#xff0c;所以&…

基于Prometheus的.NET 4.x应用服务监控

【.NET监控】| 总结/Edison Zhou0Why 监控&#xff1f;Edison所在团队95%以上的应用都是基于.NET 4.5开发的&#xff0c;只能跑在Windows Server服务器上的IIS中&#xff0c;公司运维也没有意愿对Windows Server进行有效的管理和提供监控支持&#xff0c;整得我们无法及时查看有…

高效沟通的7C原则

2019独角兽企业重金招聘Python工程师标准>>> 怎样确保沟通的顺畅和高效性呢&#xff1f;成功人士已经总结了很多方法&#xff0c;七项基本原则是一种基本的方法&#xff0c;起到了检查列表的作用&#xff0c;在你发送信息之前&#xff0c;对照检查可以帮助你确认信息…

WTMPlus 1.4 Uniapp来了

点击上方蓝字关注我们1.4版本长期以来&#xff0c;WTM都是后台管理系统的开发利器&#xff0c;对于移动端支持的不够。这次WTMPlus 1.4我们加入了对UniApp的支持&#xff0c;你可以轻松的使用WTMPlus同时制作后台管理系统和各种移动端小程序了。前后台模式切换用户现在可以自由…

php真随机数,php 的伪随机数与真随机数实例详解

这篇文章主要介绍了PHP的伪随机数与真随机数详解,本文首先讲解了真随机数和伪随机数的相关概念,并给出了比用mt_rand()函数产生更好的伪随机数的一段例子代码,需要的朋友可以参考下首先需要声明的是&#xff0c;计算机不会产生绝对随机的随机数&#xff0c;计算机只能产生“伪随…

C#中的表达式和运算符

欢迎您成为我的读者&#xff0c;希望这篇文章能给你一些帮助。前言今天和大家一起学习下C#中的表达式和运算符&#xff0c;都是很基础的知识点。在日常的编码过程中&#xff0c;对于表达式和运算符我们每天都在使用。比如像下面的代码int age27;就是一种表达式。运算符是一个符…

C#利用Socket实现客户端之间直接通信

2019独角兽企业重金招聘Python工程师标准>>> 实验功能&#xff1a; 设计程序&#xff0c;分别构建通信的两端:服务器端和客户端应用程序,套接字类型为面向连接的Socket,自己构建双方的应答模式&#xff0c;实现双方的数据的发送和接收&#xff08;S发给C&#xff0c…

如何在画面中摆放大量图片

2019独角兽企业重金招聘Python工程师标准>>> 有设计经验的一般都知道&#xff0c;版式设计需要对画面元素之间的关系有充分的认识&#xff0c;并能够在足够有限空间内合理布局&#xff0c;将图形与文字合理结合&#xff0c;下面就来给大家介绍下版式设计的方法。 如…

ASP.NET Core 替换 Action 实际执行方法

RequestDelegate上次&#xff0c;我们在《如何判断当前请求的API类型》中查看endpoints.MapControllers()实现时&#xff0c;最终定位到ActionEndpointFactory.cs&#xff0c;其中有这样一段代码&#xff1a;private static RequestDelegate CreateRequestDelegate() {// We do…

最新版富文本编辑器UEditor操作教程

最近项目中使用到了富文本编辑器&#xff0c;选择的是百度的UEditor。所以对其进行了研究&#xff0c;发现最近发布了新版本&#xff0c;与以往的用法有的改变。一下对UEditotr 的是用做一下详细的介绍。 首先是UEditotr的下载&#xff0c;下载地址&#xff1a;http://ueditor.…

Servlet请求转发中文乱码解决

2019独角兽企业重金招聘Python工程师标准>>> 在Servlet的使用过程中&#xff0c;如果在请求转发的同时需要获得输出流并且写出数据的时候&#xff0c;需要设定resp 的编码格式&#xff0c;否则的话&#xff0c;跳转之后的页面很可能会出现中文乱码的问题。 转载于:h…

NodeJs .net core connect Azure service bus

最近有个项目需要使用nodejs 使用语言是Typescript 发送消息给Azure service bus消息格式是XML.但是发送到queue中并不是xml格式,而是string.string格式的消息直到看到azure/service-bus sdk 接口的定义才发现.如果接收消息应用不是javascript sdk框架(因为使用是.net sdk框架接…

c++代码寻找USB00端口并添加打印机

USB00*端口的背景 插入USB端口的打印机&#xff0c;安装打印机驱动&#xff0c;在控制面板设备与打印机处的打印机对象上右击&#xff0c;可以看到打印机端口。对于不少型号&#xff0c;这个端口是USB001或USB002之类的。 经观察&#xff0c;这些USB00*端口并不是打印机驱动所…

IOS调用WCF提供的服务方法,但是方法的参数是WCF那边自定义的对象,这样有办法调用么,如果可以IOS应该怎么传参呢?请问有了解的么,...

最近做一个项目后端使用WCF接收Android手机拍照并带其它参数保存到服务器里&#xff1b;刚好把最近学习的WCF利用上&#xff0c;本以为是个比较简单的功能应该很好实现&#xff0c;没想到其中碰到不少问题&#xff0c;在网上搜索很久一直没有想到的解决方案&#xff0c;最后实现…

ABP vNext微服务架构详细教程——项目部署

1基础配置在之前的文章中&#xff0c;我们已经配置了Kubernetes集群并安装了管理工具Kubesphere&#xff0c;文章地址为&#xff1a;https://mp.weixin.qq.com/s/MgpdMv5A-fYxN7XY8N9Djw登录Kubesphere页面&#xff0c;打开工作台&#xff0c;在平台资源选项卡中点击“企业空间…

offsetTop和scrollTop的差别

近期想写个组件&#xff0c;结果被这两个属性搞的有点晕&#xff0c;查了下文档和资料&#xff0c;对这两个属性总结例如以下&#xff1a; 一直以来对offsetLeft&#xff0c;offsetTop&#xff0c;scrollLeft&#xff0c;scrollTop这几个方法非常迷糊&#xff0c;花了一天的时间…

quartz (一) 基于 Quartz 开发企业级任务调度应用

本文转自&#xff1a;http://www.ibm.com/developerworks/cn/opensource/os-cn-quartz/ Quartz 基本概念及原理 Quartz Scheduler 开源框架 Quartz 是 OpenSymphony 开源组织在任务调度领域的一个开源项目&#xff0c;完全基于 Java 实现。该项目于 2009 年被 Terracotta 收购&…

C# 11 中的参数 null 检查

C# 11 中的参数 null 检查IntroC# 11 将引入一个新的操作符 !! 来简化我们代码中的对于参数的 null 检查&#xff0c;昨天发布的 .NET 7 Preview 1 已经支持了这一语法&#xff0c;感兴趣的不妨来试一下吧&#xff0c;下面我们就来看一下如何使用吧Prepare如果你想在本地代码中…

cms的 php代码,KingCMS/PHP可执行代码

实例:Example :{king:title/}{king:content/}作者:{king:_author/}上面的代码没有什么特别的地方&#xff0c;但客户的要求有了变化&#xff0c;他想在详细页的内容开始前调用缩略图&#xff0c;没有则忽略。所以问题也来了&#xff0c;因为有的文章有缩略图&#xff0c;有的没…