websocket入门案例: 构建微信扫小程序码登录系统

WebSocket想必各位前后端开发都不陌生 , 这种基于TCP的全双工通信协议,比起HTTP long-polling(长轮询) 来说控制开销少,实时性强。它通过HTTP/1.1协议的101状态码进行握手。所以我们使用nginx这类来处理它的时候,需要配置协议升级,到HTTP/1.1版本。

而为了创建Websocket连接,我们通过客户端发出请求,之后服务器进行回应,这个过程通常称为handshaking。

案例

微信扫码登录,想必各位大家都不陌生,这个被广泛应用到了社会各个场景。

同时还衍生出了,微信扫公众号二维码登录和微信扫小程序码登录, 这些本质上原理也都大差不差。

本文就借着微信扫小程序码登录,这个场景来简单聊聊websocket的应用。

方案概括

简单概括一下,用户访问某个网站, 此时 浏览器(ClientA) 和WS Server之间建立了一个长链接,Server给这个长链接颁发了一个id(记为idA) 。

ClientA向服务端发送idA来请求小程序码,服务端接收后,调用wxacode.getUnlimited, 把小程序码生成出来,此小程序码的page参数 为小程序内的websocket登录页面(例如pages/index/wsLogin), 场景值参数scene为idA。 生成后返回给回ClientA。

接下来,用户获取小程序码后,使用微信扫码,就进入了我们小程序 (ClientB) 中的pages/index/wsLogin页面,同时通过场景值(scene),拿到了idA。

用户点击确认登录,我们小程序这里,就会向服务端发送一个触发事件(可以是ws或者http触发),这个事件用大白话描述一下就是:

小程序这里告诉服务端用户微信信息xxx来验证登录,同时登录成功之后,我要向idA那个socket发送一个登录成功的事件,反之则发送未注册事件。

浏览器(ClientA),检测到这个服务端推送事件后,就能够从服务端获取token,登录并实时进行页面跳转了。

是不是本质上非常简单 ?

当然这些作为一个demo来说已经够了, 要构建一个高可用的远远不止。

数据交互图

客户端单项通信(扫码登录场景)

客户端双向通信(聊天室IM场景)

(eg. 这只是最简易的场景,真实情况要复杂许多)

代码实现

此demo为了方便,ws server为单例,所有的socket实例保存在内存中。

共有三个端,web,mp,server

另一种思路

在上面这个示例中,我们给每个从客户端连接的ws请求 颁发了一个id, 然后把它藏入小程序码的参数里,这样由于发id这个机制默认是无序的,我们比较难做缓存,万一依赖的第三方服务宕机,或者运行缓慢,势必影响我们自身的服务。那么有没有办法,减小这样的不确定性因素呢?

笔者曾经做过一个方案:

更改指定一个socket.to namespace里的发号规则,改为0-999, 然后先预制 参数为0-999的小程序码共1000张, 把他们上传同步到CDN去,并且在数据库中记录下他们的id,CDN url, 这样用户访问web端登录页面时,发现是这个namespace的规则,就按照顺序,给一个没有被占用的id。 假设为10(之前9位还在保持连接)。

那么它对应的小程序码,就可以通过getMpQrcodeById这样的方式,从自己数据库中取出链接,把二维码展示在页面上,同时 用户通过微信扫码后登录,也可以进行client之间点对点的通讯。

不过在用户量大的时候,有可能会遇到 码不够用的情况,这种建议可以先预先估计用户数量生码,或者构建一个job检测发码数量,实时生码,插入数据库,上传CDN,并刷新 ws 发号规则。

扩展后如图所示:

多实例模式

在多进程或者集群下如何处理呢? 比如ClientA连ServerA,ClientB连Server B,他们这2个Client之间要如何进行通信呢?

一种还是以单例网关的形式,构建一个注册中心负责统一的收发调度,然后把逻辑运算交给其他的运算服务去做。

另一种是构建一套发布/订阅机制(比如redis的Pub/Sub mechanism) , 来保证多个 ws 服务,可以进行相互通信。

协议对应:

http->ws https->wss

点赞(0) 打赏

评论列表 共有 0 条评论

暂无评论

热门产品

大中专招生方法二:机器人电话外呼(ai外呼)人工智能外呼系统(含机器人话术模板)|大中专招生方法,机器人外呼,人工智能电话外呼,大专招生方法,中专招生方法,学校招生方法,中职招生方法,机器人话术模板,大中专,招生,方法,机器人,电话,外呼,ai外呼,人工智能,系统,机器,人话,模板
大中专招生方法二:机器人电话外呼(ai外呼)人工智能外呼系统(含机器人话术模板)

历史上的今天:04月28日

高速公路免费时间?收费卡怎么办?跨省呢?

高速公路免费时间?收费卡怎么办?跨省呢?马上就要到国庆假期啦,这几天小编每天都收到很多关于高速免费的问题,除了大家最关心的免费时间、免费车型等等,小编今天也总结了一些干货,快来看吧~免费时间这是老生常谈了,今年国庆免费时间为10月1日0时至7日24时。免费通行的计费时间点,是以汽车驶出高速的时间点为准。 在非免费时段进入高速公路,但出高速的时候是

明确了!免费5天!

明确了!免费5天!近日交通运输部印发通知要求严格落实重大节假日免收小型客车通行费政策强化电子不停车收费(ETC)车道运行监测及时处置异常情况“五一”劳动节期间高速免费通行根据交通运输部发布的文件《重大节假日免收小型客车通行费实施方案》针对春节、清明节劳动节、国庆节四个重要节假日实施7座(包括7座)以下小型客车高速公路免费通行的政策免费时间4月29日00:00至5月3日24:00免费时段这样算普通收

如果30号晚上高速,1号凌晨下高速免费不?跨省的必须看

如果30号晚上高速,1号凌晨下高速免费不?跨省的必须看长假马上就要到了,这是大家问得最多的问题!今天就跟大家好好说道,上高速,这样才算免费!先来看下2017年中秋国庆高速公路免费时间:10月1日零点~10月8日24点。免收通行费时间以车辆驶离高速公路出口收费车道的时间为准。普通公路则以车辆通过收费站收费车道的时间为准。换言之,收费期间上高速公路,免费期间下高速公路,不会被收费。所以,如果30号晚上

高速免费!五一放假调休共5天,能跨省出行吗?

高速免费!五一放假调休共5天,能跨省出行吗?据《国务院办公厅关于2022年部分节假日安排的通知》,2022五一放假为:4月30日至5月4日放假调休,共5天。4月24日(星期日)、5月7日(星期六)上班。同时据国家《重大节假日免收小型客车通行费实施方案》规定,高速公路对小型客车(7座以下含7座载客车辆)免费的节日有春节、清明节、五一劳动节、国庆节。因此,在4月30日0时至5月4日24时,高速公路将免

热门专题

安徽中源管业有限公司|安徽中源管业有限公司,安徽中源管业有限公司介绍,安徽中源管业有限公司电话,安徽中源管业有限公司地址,安徽中源管业有限公司厂家,安徽中源管业有限公司电力管,安徽中源管业有限公司管材
安徽中源管业有限公司
云南巨榕教育投资集团有限公司|云南巨榕教育投资集团有限公司,巨榕教育集团,巨榕教育
云南巨榕教育投资集团有限公司
云南网站建设|云南网站制作,网站建设,云南网站开发,云南网站设计,云南网页设计,云南网站建设公司,云南网站建设
云南网站建设
开放大学|开放大学报名,开放大学报考,开放大学,什么是开放大学,开放大学学历,开放大学学费,开放大学报名条件,开放大学报名时间,开放大学学历,开放大学专业
开放大学
一年制中专|中专学历,中专是什么学历,中专是什么,中专有什么专业,中专升大专,一年制中专
一年制中专
国家开放大学|国家开放大学报名,国家开放大学报考,国家开放大学,什么是国家开放大学,国家开放大学学历,国家开放大学学费,国家开放大学报名条件,国家开放大学报名时间,国家开放大学学历,国家开放大学专业
国家开放大学
金诺幼儿园(春城路金诺幼儿园)|昆明官渡区幼儿园,幼儿园报名,官渡区幼儿园,春城路幼儿园,幼儿园招生,学前班,昆明幼儿园,金诺幼儿园,环城南路幼儿园,石井路幼儿园
金诺幼儿园(春城路金诺幼儿园)
外贸网站建设|外贸网站建设,英文网站制作,英文网站设计,美国主机空间,外贸建站平台,多语言网站制作
外贸网站建设

微信小程序

微信扫一扫体验

立即
投稿

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部