回复问题 | netty请求响应的拟同步处理

Posted Java猫说

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了回复问题 | netty请求响应的拟同步处理相关的知识,希望对你有一定的参考价值。

回复问题 | netty请求响应的同步处理




感谢这位读者对我文章的仔细阅读,而他提到的这个点也确实是项目中尚未解决的,做项目的时候其实并没有这个业务点,因为当时为了快,直接拟定不需要通讯的应答信息。


我在这里再次解释下,第一个问题的核心,就是小程序或者APP等用户端下达开锁指定的时候,Iot中心向单片机等借书柜发送对应的开锁指令,然后单片机做了操作后应答我们,返回说开锁成功,我们再重新通知用户端说“开锁成功,请拿去图书!”,等类似的信息。


提问中说到一点就是,一键开启多个柜子,这里其实在我所了解的业务中和开启一个柜子其实是差不多的,因为项目中的指令都是“gzF5690137563CC8syyyyyyyyyyyyyyyyynnnnnnnf92fxr”,指令中的“yyyyyyyyyyyyyyyyynnnnnnn”就表示这24个锁的开启关闭状态,如果是统一开启就都是y,一个关闭就对应的位置为n,当然这个要看具体项目的协议。


那么接下来我们就拿开启单个锁,调用API下达开锁指令,Iot中心等待单片机应答后,提示用户端:“开锁成功!”的这个例子来实现一遍。

回复问题 | netty请求响应的拟同步处理

从受理问题开始我就边吃饭边思考,明天早上要吃什么呢?···emmm,说错了,应该是这个问题要如何解决呢?


我立马拿起《netty实战》看了看EvenLoop和线程模型,我一开始想到的就是线程,结果看到了这样一句话。

回复问题 | netty请求响应的拟同步处理


好吧,官方叫我不要去等待,一切都是异步,这样才是最好的,那么我就跳出了要去如何等待TCP的单片机返回信息后再次回到线程处理的圈子里面。


那么只能用其他方式了,API而言就是用户端对后台服务的请求,而这里的API针对性就是发送信息给单片机,那么我就不修改它的核心功能,那么我们还需要一个向用户的通知,push???


这让我立马想到了WebSocket,现在的双向通信一般都是万金油,小程序、APP、PC?这些WebSocket都可以!


然后就开始构思流程了,以下是我的草稿图

回复问题 | netty请求响应的拟同步处理

说了是草稿了,不要见笑哈~

回复问题 | netty请求响应的拟同步处理
sdfdsf

好像不太好看,我重新画一个大致的架构图吧。

回复问题 | netty请求响应的拟同步处理

那么我接下来详细介绍下我的思路:


1、WebSocket也是netty,用户的小程序使用WebSocket连接的时候附带Toekn信息,我将以键值对的形式存储Token-Channel(用户标识—链接实例)


2、单片机启动的时候,会自动连接Iot中心,连接的时候也是将唯一标识上传,Iot校验后存储,ID-Channel(标识—链接实例)


3、小程序调用API发起开锁命令,参数(ID、开锁信息、Token),ID用于查找单片机实例,Token是关键,我会有一个中转层用于存储ID-Dto(属性:Token、开锁信息),记录这个用户对某单片机有开锁操作

回复问题 | netty请求响应的拟同步处理


4、Iot向单片机发起开锁信息,这个比较简单,之前实现了,使用ID拿到单片机链接实例,然后发送开锁信息


5、开锁完毕,返回开锁成功,因为信息中存在ID,所有我们可以做校验,中转层是否存在这个ID,如果存在,这个开锁信息是否也有存在,如果存在,那么我们就找到了将要通知的用户Token,然后通过WebSocket向用户发送“开锁成功”

回复问题 | netty请求响应的拟同步处理


6、想用户发送开锁成功,这里一定要注意,发送完后,一定要将中转层的这个信息完全删除,以便下一次对应


注意:最后就是实现过程中的一些业务问题还有对应的协议了,基本上是没有其他太大的问题。


大家来看看效果吧!(PS:PostMan模拟API调用后,立即返回的是发送成功,接着0.4秒后页面才显示“开锁成功”,这里才是真正的用户通知)

最后,当然也是上传到GitHub啦!


还是InChat项目(tcp-wechat分支哦)!



快点来是发现BUG吧!(发现了也要自己试试处理哦!)


回复问题 | netty请求响应的拟同步处理



更多精彩推荐,请关注我们

编程分享



以上是关于回复问题 | netty请求响应的拟同步处理的主要内容,如果未能解决你的问题,请参考以下文章

Netty源码,详解Http协议的数据包解码过程

.NET Core 请求管道

使响应顺序与 Netty 中的请求顺序匹配

redis学习教程五《管道分区》

Camel-netty4:如何在发送下一个请求之前等待响应

使用wininet的异步请求