百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

SignalR 简化:使用 SimpleR for .NET Core创建高性能WebSocket服务

ccwgpt 2024-10-27 08:48 42 浏览 0 评论

概述:互联网的发展使即时通信技术比以往任何时候都更加重要,尤其是对于物联网 (IoT)。由于智能家居设备和工业传感器等众多设备需要顺利地相互通信,因此快速可靠的通信至关重要。这就是 WebSockets 的用武之地。它们非常适合在物联网设备和服务器之间进行快速的双向聊天,帮助一切保持实时连接和最新状态。什么是 SignalR?SignalR 现在是 ASP.NET Core Framework 的一部分,是使用 .net 创建实时应用程序的事实标准。SignalR 是 ASP.NET Core 套件中的高级框架,旨在生成实时 Web 应用程序。它使用自定义协议抽象了实时通信的复杂性,使开发人员能够更

互联网的发展使即时通信技术比以往任何时候都更加重要,尤其是对于物联网 (IoT)。由于智能家居设备和工业传感器等众多设备需要顺利地相互通信,因此快速可靠的通信至关重要。这就是 WebSockets 的用武之地。它们非常适合在物联网设备和服务器之间进行快速的双向聊天,帮助一切保持实时连接和最新状态。

什么是 SignalR?

SignalR 现在是 ASP.NET Core Framework 的一部分,是使用 .net 创建实时应用程序的事实标准。

SignalR 是 ASP.NET Core 套件中的高级框架,旨在生成实时 Web 应用程序。它使用自定义协议抽象了实时通信的复杂性,使开发人员能够更多地关注应用程序逻辑而不是底层协议。SignalR 的一个关键优势是它支持客户端和服务器之间通信的多种传输,确保应用程序可以在不同环境中保持实时功能。这些运输包括:

  1. WebSockets,用于全双工通信,非常适合需要高频数据交换的场景。
  2. 服务器发送事件 (SSE),允许服务器在单向通信充分的情况下将更新推送到客户端。
  3. 长轮询,一种回退机制,当客户端或服务器环境不支持更高级的通信方法时,可以使用该机制。

通过自动选择最佳可用传输方法,SignalR 可确保在各种设备和网络条件下为 Web 应用程序提供最佳功能和性能。

SignalR 是用于开发实时 Web 应用程序的绝佳框架。但是,它对特定协议和客户端兼容性的依赖可能会引入限制,尤其是在需要直接 WebSocket 通信的情况下。

简单

进入 SimpleR,这是一个基于 ASP.NET Core 的高性能、低开销、纯 WebSocket 服务器库。SimpleR 旨在弥合 SignalR 可能不是最佳选择的差距,它在简单性和灵活性方面大放异彩。它删除了繁重的协议和抽象,转而提供一种简单、高效的方法来实现纯 WebSocket 服务器。这使得它成为需要直接控制 WebSocket 通信、自定义协议实现或使用非 SignalR 客户端(例如,使用具有自己的自定义协议的 IoT 设备时)的项目的理想候选者。

在对 SimpleR 的介绍中,我们将探讨其主要功能,并演示如何与 ASP.NET Core 无缝集成,以实现轻量级高性能 WebSocket 服务器的开发。

设计理念

SimpleR 主要基于 SignalR 构建,建立在 ASP.NET Core 团队所做的出色工作之上。它旨在提供

  1. 通过网络传输实现高性能、低分配抽象,同时与所有 ASP.NET Core 功能完全集成。
  2. 性能和最少的分配优先于易用性。
  3. 与协议无关的方法。

设置环境

在深入了解使用 SimpleR 的细节之前,您需要从基础知识开始——创建一个空的 ASP.NET Core Web 应用程序。这为设置 WebSocket 服务器提供了一个全新的石板。

  1. **打开命令行界面 (CLI):**导航到要创建项目的文件夹。
  2. 创建新的 Web 项目:运行以下命令以生成空的 ASP.NET Core Web 应用程序
dotnet new web -n SimpleThermostat.Server

3. **导航到项目文件夹:**将目录更改为新创建的项目文件夹

cd SimpleThermostat.Server

4. 安装 SimpleR.Server 包:在项目目录下,运行以下命令,将 SimpleR.Server 包添加到项目中。在撰写本文时,SimpleR 仍处于 alpha 阶段。

dotnet add package SimpleR.Server --version 1.0.0-alpha.1

定义协议

让我们从定义客户端和服务器消息开始。为了允许不同类型的消息,我们将使用 System.Text.Json 多态序列化功能。

客户端(在本例中为恒温器)将向服务器发送指标。

[JsonDerivedType(typeof(ThermostatTemperatureMetric), "temperature")]  
public class ThermostatMetric;  
  
public class ThermostatTemperatureMetric : ThermostatMetric  
{  
    public ThermostatTemperatureMetric(float temperature)  
    {  
        Temperature = temperature;  
    }  
  
    public float Temperature { get; }  
}

另一方面,服务器将向恒温器发送命令。

[JsonDerivedType(typeof(SetThermostatModeCommand), "setMode")]  
public class ThermostatCommand;  
  

public class SetThermostatModeCommand : ThermostatCommand  
{  
    public SetThermostatModeCommand(ThermostatMode mode)  
    {  
        Mode = mode;  
    }  
  
    public ThermostatMode Mode { get; }  
}  
  
public enum ThermostatMode  
{  
    Off,  
    Heat,  
    Cool  
}

现在我们已经拥有了协议支持的所有消息,让我们定义如何将它们转换为字节,反之亦然。

SimpleR 的关键点之一是它与协议无关。这意味着它要求用户提供协议定义,以便能够从字节流中构造消息。

在这个演示中,我们不会深入定义我们自己的自定义协议,而是使用 WebSocket 的 EndOfMessage 作为消息的分隔符。

为此,我们需要定义一对读取器和编写器类。

// Since we are using WebSocket's EndOfMessage as a delimiter,  
// need to implement the IDelimitedMessageReader interface  
public class ThermostatMessageReader : IDelimitedMessageReader<ThermostatMetric>  
{  
    public ThermostatMetric ParseMessage(ref ReadOnlySequence<byte> input)  
    {  
        var jsonReader = new Utf8JsonReader(input);  
  
        return JsonSerializer.Deserialize<ThermostatMetric>(ref jsonReader)!;  
    }  
}public class ThermostatMessageWriter : IMessageWriter<ThermostatCommand>  
{  
    public void WriteMessage(ThermostatCommand message, IBufferWriter<byte> output)  
    {  
        var jsonWriter = new Utf8JsonWriter(output);  
        JsonSerializer.Serialize(jsonWriter, message);  
    }  
}

现在我们已经成功定义了自己的消息协议,我们准备继续讨论应用程序逻辑。

调度消息

SimpleR 中的下一个重要主题是消息调度程序。简而言之,消息调度器是一个高级管道,它封装了调度连接消息的逻辑。这是我们应用程序逻辑的初始入口。

public class ThermostatMessageDispatcher : IWebSocketMessageDispatcher<ThermostatMetric, ThermostatCommand>  
{  
    private float _targetTemp = 22;  
      
    public Task OnConnectedAsync(IWebsocketConnectionContext<ThermostatCommand> connection)  
    {  
        return Task.CompletedTask;  
    }  
  
    public Task OnDisconnectedAsync(IWebsocketConnectionContext<ThermostatCommand> connection, Exception? exception)  
    {  
        return Task.CompletedTask;  
    }  
  
    public async Task DispatchMessageAsync(IWebsocketConnectionContext<ThermostatCommand> connection, ThermostatMetric message)  
    {  
        if(message is ThermostatTemperatureMetric temperatureMetric)  
        {  
            // update temperature  
              
            if (temperatureMetric.Temperature < _targetTemp)  
            {  
                // If the temperature is below the target temperature, set the thermostat to heat mode  
                await connection.WriteAsync(new SetThermostatModeCommand(ThermostatMode.Heat));  
            }  
            else if (temperatureMetric.Temperature > _targetTemp)  
            {  
                // If the temperature is above the target temperature, set the thermostat to cool mode  
                await connection.WriteAsync(new SetThermostatModeCommand(ThermostatMode.Cool));  
            }  
            else  
            {  
                // If the temperature is at the target temperature, turn off the thermostat  
                await connection.WriteAsync(new SetThermostatModeCommand(ThermostatMode.Off));  
            }  
        }  
    }  
}

将一切连接在一起

定义消息协议和消息调度程序后,我们就可以在 Program.cs 文件中将其连接在一起。

var builder = WebApplication.CreateBuilder(args);  
  
builder.Services.AddSimpleR();  
  
var app = builder.Build();  
  
app.MapSimpleR<ThermostatMetric, ThermostatCommand>("thermostat/{deviceId}", b =>  
{  
    b.UseDispatcher<ThermostatMessageDispatcher>()  
        .UseEndOfMessageDelimitedProtocol(  
            MessageProtocol.From(new ThermostatMessageReader(), new ThermostatMessageWriter()));  
});  
  
app.Run();

就这么简单!

您可以在此处找到服务器的源代码以及一个简单的客户端。

要探索 SimpleR 的所有功能,请查看 Github 存储库中的文档。如果您发现它有用,请不要忘记为存储库加星标。

当我们结束对 SimpleR 的研究时,很明显,对于那些需要直接控制 ASP.NET Core 中的 WebSocket 通信的人来说,这个库是一个不错的选择。展望未来,我们有令人兴奋的计划来使 SimpleR 变得更好。我们将添加现成的协议,使构建应用程序更容易,并包括用于广泛使用的标准(如 OCPP)的特殊软件包。

相关推荐

定时任务工具,《此刻我要...》软件体验

之前果核给大家介绍过一款小众但实用的软件——小说规则下载器,可以把网页里的小说章节按照规则下载到本地,非常适合喜欢阅读小说的朋友。有意思的是,软件作者当时看到果核写的体验内容后,给反推荐到他的帖子里去...

前端定时任务的神库:Node-cron,让你的项目更高效!

在前端开发中,定时任务是一个常见的需求。无论是定时刷新数据、轮询接口,还是发送提醒,都需要一个可靠且灵活的定时任务解决方案。今天,我要向大家介绍一个强大的工具——Node-cron,它不仅能解决定时任...

Shutter Pro!一款多功能定时执行任务工具

这是一款可以在电脑上定时执行多种任务的小工具,使用它可以根据时间,电量等来设定一些定时任务,像定时打开程序、打开文件,定时关机重启,以及定时弹窗提醒等都可以轻松做到。这是个即开即用的小工具,无需安装,...

深度解析 Redis 缓存击穿及解决方案

在当今互联网大厂的后端开发体系中,Redis缓存占据着极为关键的地位。其凭借高性能、丰富的数据类型以及原子性操作等显著优势,助力众多高并发系统从容应对海量用户的访问冲击,已然成为后端开发从业者不可或...

从零搭建体育比分网站完整步骤(比较好的体育比分软件)

搭建一个体育比分网站是一个涉及前端、后端、数据源、部署和维护的完整项目。以下是从零开始搭建的详细流程:一、明确项目需求1.功能需求:实时比分展示(如足球、篮球、网球等)支持多个联赛和赛事历史数据查询比...

告别复杂命令行:GoCron 图形界面让定时任务触手可及

如果你是运维人员或者经常接触一些定时任务的配置,那么你一定希望有一款图形界面来帮助你方便的轻松配置定时任务,而GoCron就是这样一款软件,让你的配置可视化。什么是GoCron从名字你就可以大概猜到,...

Java任务管理框架核心技术解析与分布式高并发实战指南

在当今数字化时代,Java任务管理框架在众多应用场景中发挥着关键作用。随着业务规模的不断扩大,面对分布式高并发的复杂环境,掌握其核心技术并进行实战显得尤为重要。Java任务管理框架的核心技术涵盖多个方...

链表和结构体实现:MCU软件定时器(链表在单片机中的应用)

在一般的嵌入式产品设计中,介于成本、功耗等,所选型的MCU基本都是资源受限的,而里面的定时器的数量更是有限。在我们软件设计中往往有多种定时需求,例如脉冲输出、按键检测、LCD切屏延时等等,我们不可能...

SpringBoot定时任务(springboot定时任务每小时执行一次)

前言在我们开发中,经常碰到在某个时间点去执行某些操作,而我们不能人为的干预执行,这个时候就需要我们使用定时任务去完成该任务,下面我们来介绍下载springBoot中定时任务实现的方式。定时任务实现方式...

定时任务新玩法!systemd timer 完整实战详解

原文链接:「链接」Hello,大家好啊!今天给大家带来一篇使用systemdtimer实现定时任务调度的详细实战文章。相比传统的crontab,systemdtimer更加现代化、结构清晰...

Celery与Django:打造高效DevOps的定时任务与异步处理神器

本文详细介绍了Celery这一强大的异步任务队列系统,以及如何在Django框架中应用它来实现定时任务和异步处理,从而提高运维开发(DevOps)的效率和应用性能。下面我们先认识一下Cele...

订单超时自动取消的7种方案,我用这种!

前言在电商、外卖、票务等系统中,订单超时未支付自动取消是一个常见的需求。这个功能乍一看很简单,甚至很多初学者会觉得:"不就是加个定时器么?"但真到了实际工作中,细节的复杂程度往往会超...

裸机下多任务框架设计与实现(gd32裸机配置lwip 网络ping不通)

在嵌入式系统中,特别是在没有操作系统支持的裸机环境下,实现多任务执行是一个常见的挑战。本文将详细介绍一种基于定时器的多任务框架设计,通过全局时钟和状态机机制,实现任务的非阻塞调度,确保任务执行中不会出...

亿级高性能通知系统构建,小白也能拿来即用

作者介绍赵培龙,采货侠JAVA开发工程师分享概要一、服务划分二、系统设计1、首次消息发送2、重试消息发送三、稳定性的保障1、流量突增2、问题服务的资源隔离3、第三方服务的保护4、中间件的容错5、完善...

运维实战:深度拆解Systemd定时任务原理,90%的人不知道的玩法

运维实战:深度拆解Systemd定时任务原理,90%的人不知道的高效玩法一、Systemd定时任务的核心原理Systemd定时任务是Linux系统中替代传统cron的现代化解决方案,通过...

取消回复欢迎 发表评论: