WebSocket实现app扫描二维码登录以及ws应用进行负载均衡?
来源:互联网 发布:中信淘宝联名信用卡 编辑:程序博客网 时间:2024/05/16 07:05
最近在做一个扫码登录功能,为此我还在网上搜了一下关于微信的扫描登录的实现方式。当这个功能完成了后,我决定将整个实现思路整理出来,方便自己以后查看也方便其他有类似需求的程序猿些。
要实现扫码登录我们需要解决两个问题:
1. 在没有输入用户名及密码的情况下,如何解决权限安全问题?换句话讲,如何让服务器知道扫码二维码的客户端是一个合法的用户?
2. 服务器根据用户在客户端的选择如何实时在网页上作出相应的响应?
首先我们先理一下微信的实现思路,来方便我们理解解决这一难题的思路方向。微信登录的二维码实际上是将一个URL转换成二维码的形式,而通过微信客户端扫码后,无非就是打开了这个url, 我捕捉到的微信二维码的url为https://login.weixin.qq.com/l/YdmTu30I5A== ,这个url里的YdmTu30I5A==代表的是本次会话的唯一ID, 这个有点儿类似浏览器里的session id,通过这个ID,微信就能定向将确认结果反馈到网页上。使用微信二维码登录功能,需要有两个前提:一是客户端上需要安装微信app。 二是用户需要登录到到微信app。https://wx.qq.com/
WebsocketWeb实时消息后台服务器推送技术
为什么要有这两个条件呢?那是因为微信在确认是否允许登录到网页版的时候,微信需要提取当前app的登录信息并将上面的session ID一并发给服务器,这样服务器收到了登录信息和sessionID后就可以确认两件事:一是用来确认登录的客户端的用户是验证过的;二是通过session ID服务器知道将反馈结果推送到哪个网页。
所以针对第一点,我们的关键在于,在扫描前要确保用户是已经被验证过且合法的用户(验证方式可以是用户名+密码,也可以是一个secure key),在选择是否登录时将这个结果一并推送到服务器端,就好了。如果用户没有验证是否合法,可以像微信的处理方式一样直接告诉用户二维码不可识别或提示请先登录到app。
有了身份验证,那么现在就解决第二个问题,如何将反馈结果实时地显示在网页上呢?有朋友可能会说,客户端这边很简单发一个请求到后台就好了,而网页上用ajax定时发送到服务器端看是否有反馈。我不赞成这种做法,因为ajax轮询方式十分消耗客户端和服务器端资源!这里涉及到另一个技术-web实时推送技术,使用推送技术可以节约服务器端和客户端的资源,可以稳定地推送和接收任何消息。我在实现的过程中我采用了第三方推送服务-GoEasy推送,用它是实现非常简单,我们项目里的其他功能也用到了GoEasy web实时推送服务,所以在此我直接就用的GoEasy推送来将登录反馈结果推送到服务器。我的实现步骤非常简单,将传送的session ID作为客户端与网页端的通信channel,网页端订阅用session ID作为值得channel,客户端将验证结果和session ID发送到服务器端,服务器端可以通过这个channel主动将结果推送给网页版!如果客户端也需要做相应的反馈的话,那么客户端也只需要订阅这个channel,然后服务器端会同时将结果推送给网页版和客户端,收到消息后,就可以根据需求在goeasy的回调函数里做你想做的事情了。关于goeasy推送的使用,大家可以参考这篇博客: http://www.cnblogs.com/jishaochengduo/articles/5552645.html, 另外GoEasy推送官网上也有一个demo:GoEasy二维码扫码登录demo,大家可以去看看效果.
话不多说,直接上代码,上代码,上代码。项目整起!!!!!
后台框架采用SpringMVC,不同的框架可根据逻辑更改即可:
【思路】- PC端生成二维码,二维码包含uuid(全局唯一标识符),且打通websocket通道,等待服务器返回登录成功信息;APP扫描二维码,获取uuid及登录信息,推送给服务端,处理后的登录信息通过websocket返回给PC端,PC端得到登录信息后保存即登录成功。APP扫描确认登录的信息可以采用ActiveMQ进行推送。
生成二维码部分引入依赖文件
二维码登录后台控制层Controller
websocket实现(本案例采用Spring自带的websocket)
JMS实现
核心代码就酱......简短项目就是这些了,好了到了关键发布和部署到服务器环节####
如何对 Websocket 应用进行负载均衡?
#nginx websocket 负载均衡配置(用1.3以后版本的nginx,原生支持websocket反向代理;压力测试可以用jmeter+第三方websocket插件,具体可以到github上搜一下。)
#回传消息 需要 uid+serverip+fd 绑定关系 来实现
#压测 可以用jmeter 或者 swoole作者写的 swoole-src/run.php at master · swoole/swoole-src · GitHub
#add 2017 1126
upstream websocket{
server serverip01;
server serverip02
}
map $http_upgrade $connection_upgrade {
default upgrade;
'' close;
}
server {
listen 8020;
location / {
proxy_pass http://websocket;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "Upgrade";
}
}
客户端链接时负载…就是公布出无数个WS链接点,客户端获取“通过一个计算策略分配的链接点”地址,客户端链接…
nginx负载没用,代理链接数在那儿放着的…之前项目有过类似实践,一百万个并发连接。
第一层:DNS轮训 ,域名可指向多个同等配置的NGINX
第二层:NGINX,后端配置多个无状态应用进程
DNS轮训主要解决单机NGINX并发连接数瓶颈,不高的话直接NGINX亦可。
NGINX WEBSOCKET和负载均衡可参考:
Note: 基本的 WebSocket 的 Nginx 配置
NGINX负载均衡配置
觉得很容易用到.. Nginx 从 1.3 开始支持 WebSocket, 现在已经是 1.4.4 了
相对 HTTP, 看过例子发现配置其实比较简单,
先用 ws
模块写一个简单的 WebSocket 服务器:
Server = require('ws').Serverwss = new Server port: 3000wss.on 'connection', (ws) -> console.log 'a connection' ws.send 'started'console.log 'server started'
然后修改 Hosts, 添加, 比如 ws.repo
, 指向 127.0.0.1
然后是 Nginx 配置:
server { listen 80; server_name ws.repo; location / { proxy_pass http://127.0.0.1:3000/; proxy_redirect off; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; }}
Reload Nginx 然后从浏览器控制台尝试链接, OK
new WebSocket('ws://ws.repo/')
或者通过 Upstream 的写法:
upstream ws_server { server 127.0.0.1:3000;}server { listen 80; server_name ws.repo; location / { proxy_pass http://ws_server/; proxy_redirect off; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; }}
WebSocket 先是通过 HTTP 建立连接,
然后通过 101 状态码, 表示切换协议,, 在配置里是 Upgrade
【博主推荐两个比较常用的WS负载组件】
1、Swoole - 面向生产环境的 PHP 异步网络通信引擎 https://www.swoole.com/
2、Java丨PHP丨C#丨Websocket丨Asp.net Web实时消息服务器推送 - GoEasy http://goeasy.io/cn/
- WebSocket实现app扫描二维码登录以及ws应用进行负载均衡?
- WebSocket实现app扫描二维码登录
- HTML5实现扫描二维码进行登录问题
- 实现手机扫描二维码进行登录
- 实现手机扫描二维码进行登录
- 实现网站二维码扫描登录
- 实现网站二维码扫描登录
- java实现二维码扫描登录
- 实现网站二维码扫描登录
- Android 应用之二维码扫描登录
- websocket的负载均衡
- Android 扫描二维码实现网页登录
- 扫描二维码自动登录实现原理
- 扫描二维码实现一键登录
- Android实现二维码扫描登录网页
- 二维码扫描web端实现登录
- Android 扫描二维码实现网页登录
- 微信扫描二维码,实现自动登录
- cocos2dx作茧自缚修改creator_to_cocos2dx(二)
- java ArrayList
- Tarjan算法理解篇
- Python中的字符串与字符编码:编码和转换问题
- 汇编入门-寄存器
- WebSocket实现app扫描二维码登录以及ws应用进行负载均衡?
- copyright(12.14)
- 译文 | MPI newbie:What is “operating system bypass”?
- 机器学习之-集成算法【人工智能工程师--AI转型必修课】
- Compilation failure
- Android开发实践
- oracle常用SQL语句(汇总版)
- c#之哈希表(Hashtable)
- java统一异常处理总结