WebSocket 是基于HTML5的协议 , 可以在浏览器和服务器之间建立一个全双工的通信(客户端可以主动请求服务端, 服务端可以主动推送消息给客户端) ;
(1)Ajax 短轮询 Ajax 轮询主要通过页面端的 JS 定时异步刷新任务来实现数据的加载 如果我们使用ajax短轮询方式,需要后端提供方法,通过调用微信支付接口实现根据订单号查询支付状 态的方法(参见查询订单API) 。 前端每间隔三秒查询一次,如果后端返回支付成功则执行页面跳转。
缺点:这种方式实时效果较差,而且对服务端的压力也较大。不建议使用
(2)长轮询 长轮询主要也是通过 Ajax 机制,但区别于传统的 Ajax 应用,长轮询的服务器端会在没有数据时阻塞请 求直到有新的数据产生或者请求超时才返回,之后客户端再重新建立连接获取数据。
如果使用长轮询,也同样需要后端提供方法,通过调用微信支付接口实现根据订单号查询支付状态的方 法,只不过循环是写在后端的。
缺点:长轮询服务端会长时间地占用资源,如果消息频繁发送的话会给服务端带来较大的压力。不建议 使用
(3)WebSocket 双向通信 WebSocket 是 HTML5 中一种新的通信协议,能够实现浏览器与服务器之 间全双工通信。如果浏览器和服务端都支持 WebSocket 协议的话,该方式实现的消息推送无疑是最高 效、简洁的。并且最新版本的 IE、Firefox、Chrome 等浏览器都已经支持 WebSocket 协议,Apache Tomcat 7.0.27 以后的版本也开始支持 WebSocket
- RabbitMQ的stomp插件
RabbitMQ的web stomp插件, 实现了浏览器与服务器之间的全双工通信, 该插件就是利用WebSocket对stomp进行一次桥接 ;
安装插件
1). 验证当前环境中的RabbitMQ的web stomp插件是否已经启动 ;
2). 如果未开启, 需要开启web stomp插件
A. 进入rabbitmq容器
docker exec -it 容器名称 /bin/bash
B. 执行指令开启web stomp插件
rabbitmq-plugins enable rabbitmq_web_stomp rabbitmq_web_stomp_examples
C. 容器提交为镜像
docker commit 容器ID rabbitmq:stomp
D. 停止原容器
docker stop 容器ID
E. 创建新容器
docker run -di --name=changgou_rabbitmq -p 5671:5617 -p 5672:5672 -p 4369:4369 -p 15671:15671 -p 15672:15672 -p 25672:25672 -p 15670:15670 -p 15674:15674 rabbitmq:stomp
3.4 RabbitMQ stomp插件案例
官网文档 : http://jmesnil.net/stomp-websocket/doc/
4.RabbitMQ创建用户
为了系统的安全 , 在这里需要单独创建一个账号 , 给予的权限不要太高 ;
1). 支付微服务发送消息
支付回调的方法中, 如果用户支付成功, 发送消息:
rabbitTemplate.convertAndSend(“paynotify”,"",result.get(“out_trade_no”));
2). 前端JS
let client = Stomp.client(‘ws://192.168.192.152:15674/ws’);
let on_connect = function(x) {
id = client.subscribe("/exchange/paynotify", function(d) {
alert(d.body);
let orderId = [[KaTeX parse error: Expected '}', got 'EOF' at end of input: …s?payMoney="+[[{payMoney}]]
}
});
};
let on_error = function() {
console.log(‘error’);
};
client.connect(‘webguest’, ‘webguest’, on_connect, on_error, ‘/’);