当前位置: 首页 > news >正文

商丘网站建设模板龙岩网红桥

商丘网站建设模板,龙岩网红桥,网站怎么让谷歌收录,做心理咨询的网站1 前言之所以写本文章#xff0c;是因为在我停止维护多年前写的NetworkSocket组件两年多来#xff0c;还是有一些开发者在关注这个项目#xff0c;我希望有类似需求的开发者明白为什么要停止更新#xff0c;可以使用什么更好的方式来替换(其实很大原因是我把时间花在开发We… 1 前言之所以写本文章是因为在我停止维护多年前写的NetworkSocket组件两年多来还是有一些开发者在关注这个项目我希望有类似需求的开发者明白为什么要停止更新可以使用什么更好的方式来替换(其实很大原因是我把时间花在开发WebApiClient上面了)。那时.netcore还没有生下来asp.net除了蜗居在iis里处理http其它什么也不能干而NetworkSocket是这样定义的NetworkSocket是一个以中间件(middleware)扩展通讯协议以插件(plug)扩展服务器功能的支持SSL安全传输的通讯框架目前支持http、websocket、fast、flex策略与silverlight策略协议。2 Kestrel是什么谈到asp.netcore人们自然就想到它的默认服务器kestrel在很多场景中人们甚至认为kestrel等于Web服务器或者说它只能处理http和http之上的东西。本文先在此下个定义Kestrel是一款基于中间件来处理tcp连接的服务器并内置了http(包含websocket、SignalR)解析中间件。也就是说我们完全可以给kestrel添加其它中间件用来处理非http的连接的业务场景让kestrel使用一个端口支持多种协议或多协议一个端口一种协议的要求。2.1 Kestrel的中间件是什么在asp.netcore的Startup里我们使用app.UseXXX的扩展方法来应用各种中间件比如UseRouting、UseStaticFiles等等它本质上还是调用了IApplicationBuilder.Use(FuncRequestDelegate, RequestDelegate middleware)也就说FuncRequestDelegate, RequestDelegate就是一个中间件。对应的在kestrel世界里也有一个IConnectionBuilder.Use(FuncConnectionDelegate, ConnectionDelegate middleware)FuncConnectionDelegate, ConnectionDelegate就是kestrel的中间件我们可以如下安装kestrel的中间件kestrel.ListenAnyIP(port: 80, listen {listen.Use(next context {if(true){// 中间件1的逻辑}else{return next(context);}}).Use(next context {if(true){// 中间件2的逻辑}else{return next(context);}}); }); 值得注意的是kestrel的最后一个中间处理者是http中间件以上代码实际的kestrel已经包含3种处理者(文章后部分有中间件的篇幅然后就容易理解了)逻辑1、逻辑2和http解析我们可以简单理解为Startup的app对象对应kestrel的内置的那个最后中间件。2.2 Kestrel的ConnectionContext在kestrel中间件里最重要的对象就是ConnectionDelegate它等同于FuncConnectionContext,Task我们可以理解为它就是一个Hanlder传入连接上下文剩下就是我们要干的工作了而中间件是除了这个Handler之外我们还能拿到一个叫next的Handler我们可以选择是否调用它如果不调用流程终止。ConnectionContext是kestrel的一个Tcp连接抽象其核心属性是Transport表示双工传输层的操作对象另外提供Abort()方法用于服务端主动关闭连接。基于ConnectionContext很容易实现一个自定义协议的tcp双工通讯服务器相比从Socket写起我们可能可以减少100倍代码量而得到的是更高性能的服务。3 基于Kestrel的SignalRRedis的推送服务本实战中我们使用asp.netcore内置的SignalR功能外加自己实现的部分Redis协议只简单实现发布订阅功能来做一个消息从云端推送到客户端的服务我们的服务对客户端支持redis协议订阅或Signal协议订阅同时我们提供redissignalRhttp三种协议接口给云端其它微服务来发布消息发布者不用关心客户端是什么协议只需要选择自己喜欢的协议的发布接口来调用发布。3.1 协议与ConnectionContext的关系在我们的这个应用里一个连接不允许同时使用SignalR和Redis并存协议也就是说一个连接在发起第一个请求里就确定了它整个生命周期里的协议。所以我们需要分析连接读取到的第一个数据包确定它是否为Redis协议如果不是redis协议我们要将ConnectionContext传达到下一个中间件(即http中间件)。3.2 使用Redis中间件如下代码Use里面就是Redis中间件里面的个协议分析逻辑kestrel.ListenAnyIP(options.Port, listen {listen.Use(next async context {if (await Protocol.IsRedisAsync(context)){logger.LogDebug(${context.RemoteEndPoint} {nameof(ClientType.Redis)} 连接);await redis.HandleAsync(context);logger.LogDebug(${context.RemoteEndPoint} {nameof(ClientType.Redis)} 断开);}else{logger.LogDebug(${context.RemoteEndPoint} {nameof(ClientType.SignalR)} 连接);await next(context);logger.LogDebug(${context.RemoteEndPoint} {nameof(ClientType.SignalR)} 断开);}}); }); Protocol类/// summary /// 连接的协议判断 /// /summary public static class Protocol {/// summary/// 返回连接是否为redis协议/// /summary/// param nameconnection/param/// returns/returnspublic static async Taskbool IsRedisAsync(ConnectionContext connection){var result await connection.Transport.Input.ReadAsync();var state IsRedis(result);connection.Transport.Input.AdvanceTo(result.Buffer.Start);return state;}/// summary/// 返回数据是否为redis协议/// 这里不必严格检查只要能区分是http还是redis就行/// /summary/// param nameresult/param/// returns/returnsprivate static bool IsRedis(ReadResult result){if (result.Buffer.IsEmpty){return false;}var span result.Buffer.FirstSpan;return span.Length 0 span[0] *;} } 3.3 RedisConnectionHandler在3.2代码里有一个await redis.HandleAsync(context);这个redis就是RedisConnectionHandler实例它的功能是处理一个redis连接从建立成功之后到断开的所有逻辑。我们知道Redis有好几十个命令单单是实现发布和订阅功能我们也要实现必要的8个命令。说到这里我的脑海里又闪现出一个长长的switch(收到的cmd) case xxx的代码了我们甚至还需要在switch之前写公共性的代码比如打印收到的cmd内容还需要在switch里特别强调default分支我们不支持这个命令。。。既然kestrel基于连接处理中间件上层的asp.netcore也是基于请求处理中间件我们完全也可以也依葫芦画瓢造一个Redis命令中间件Builder最后将所有Redis中间件串起来Buid得一个Redis处理委托。var builder new PipelineBuilderRedisContext(appServices, context {// 没有handler来处理return context.Client.ResponseAsync(RedisResponse.Error(unsupported cmd)); }) .Use((context, next) {this.logger.LogDebug(context.ToString());// 验证客户端是否已授权return context.Cmd.Name ! RedisCmdName.Auth context.Client.IsAuthed false? context.Client.ResponseAsync(RedisResponse.Error(need auth password)): next(); });// 添加各个cmd对应的handler条件分支 appServices.GetServicesIRedisCmdHanler().ForEach(item builder.When(item.CanHandle, item.HandleAsync));this.handler builder.Build(); 在RedisConnectionHandler每收一个Redis命令将命令包装为RedisContext然后使用build出来的handler对象来处理这个RedisContext就行。剩下的工作就是我们一个命令实现一个IRedisCmdHanler对象就行逻辑完全分开。IRedisCmdHanler接口/// summary /// 定义redis命令处理者 /// /summary interface IRedisCmdHanler {/// summary/// 返回是否可以处理/// /summary/// param namecontext/param/// returns/returnsbool CanHandle(RedisContext context);/// summary/// 处理/// /summary/// param namecontext/param/// returns/returnsTask HandleAsync(RedisContext context); } 3.4 统一Redis和Signal客户端操作接口在Signal和Redis订阅之后我们将他们的连接包装为统一接口的IClient对象IClient提供PublishAsync()方法用于发布消息。/// summary /// 定义客户端的接口 /// /summary public interface IClient {/// summary/// 获取唯一标识/// /summarystring Id { get; }/// summary/// 获取连接时间/// /summaryDateTime ConnectedTime { get; }/// summary/// 获取客户端类型/// /summary[JsonConverter(typeof(JsonStringEnumConverter))]ClientType ClientType { get; }/// summary/// 发送消息/// /summary/// param namemessage/param/// returns/returnsTaskbool SendMessageAsync(Message message); } 3.5 IClient管理器我们还需要维护一份单例的IClient管理器对象用于维护正在订阅的客户端在发布消息时从这个管理器里查找IClient并调用SendMessageAsync()方法发布消息内容。3.6 SignalR部分由于SignalR的内容非常简单官方文档细节齐全这里将不作任何讲解了。4 总结由于要讲解的内部比较多篇幅和时间都有限本文就只从思路上大概讲解Kestrel在多协议连接的场景的使用方式。一句话中间件的使用使得这些场景变得简单那问题来了什么是中间件你理解了吗
http://www.pierceye.com/news/580691/

相关文章:

  • 优化网站专题北京海淀网站建设公司
  • 广州网站快速排名网站维护正常要多久
  • 建网站 选安全甘肃做网站价格
  • 微信公众管理平台有必要买优化大师会员吗
  • 家居网站建设素材腾讯adq广告平台
  • 响应式网站 图片居中门户网站样式
  • 潍坊网站排名推广北京建设高端网站的
  • 广东省住房和建设网站鹤壁市建设局网站
  • 北京网站建设报价明细手机网站网站开发流程
  • 三合一网站模板如何看网站是html几代做的
  • 如何设置自己的网站网站建设的常用词
  • 甘肃网站开发冷色调网站
  • 用cdr做网站设计尺寸要多少网站如何做实名验证码
  • 比较好的设计网站wordpress主题代码哪里
  • 专门学习网站建设读什么专业南山网站设计公司
  • 专业网站设计模板深圳最专业的高端网站建设
  • cc域名做网站怎么样无锡个人网站建设
  • 网站模板设计报价单小学网站建设设计方案
  • 二级域名网站怎么投广告wordpress自定义输入
  • su域名注册如何做360网站优化
  • 企业网站空间不足怎么办incapsula wordpress
  • 网站建设 镇江万达wordpress简
  • 做p2p理财网站开发公司销售人员竞聘演讲稿
  • 建设网站广州唯品会网站架构
  • 网站开发的国内外研究现状家庭装潢设计
  • 安卓从网站获取视频怎么做有没有做网站的公司
  • 网站设计计划书的内容如何做1个手机网站
  • 义乌网站建设技术托管seo营销服务
  • 一块钱购物网站山东专业网站建设
  • 凡科建站怎么删除网站建设电子商务网站建设分析