0
点赞
收藏
分享

微信扫一扫

使用 WebSocket 连接 RabbitMQ


相关文章
RabbitMQ 安装配置和 Spring 集成
RabbitMQ 启用 HTTP 后台认证

由于使用 WebSocket 连接 RabbitMQ 时需要身份认证,而默认认证方式的账号密码都是固定的,使用这种方式时,任何人都能通过前端 JS 代码中的用户密码连接到 RabbitMQ 服务器,不管用什么样的权限进行限制,都不够安全。

因此,为了安全的使用 WebSocket,需要先配合上一篇 ​​RabbitMQ 启用 HTTP 后台认证​​。使用自定义的后台认证后,可以使用的用户不限于 RabbitMQ 内置方式创建的用户了。

本文假设用户已经登陆系统,然后使用用户的 TOKEN 或者 SESSIONID 作为连接 RabbitMQ 的用户名,密码直接为空进行连接。通过用户的某些信息创建一个临时的消息队列(需要和前台订阅的队列一致)

后台 HTTP 中,会通过接口或者 Redis 的统一认证方式对 TOKEN 或者 SESSIONID 进行认证,所有授权接口也会对用户名进行鉴权,只有保持登陆的用户才有权连接到 RabbitMQ 服务。

启用 Web STOMP 插件

通过下面命令启用 Web STOPM 插件:

rabbitmq-plugins enable

参考地址:​​https://www.rabbitmq.com/web-stomp.html​​

此时已经可以通过 websocket 进行连接了,官方推荐使用 ​​stomp-websocket​​。

下面编写前端 JS 代码

JS WebSocket 连接

引入 ​​stomp-websocket​​ 提供的 stomp.js 文件。

<!-- include the client library -->
<script src="stomp.js"></script>

示例代码如下:

var ws = new WebSocket('ws://127.0.0.1:15674/ws');
var client = Stomp.over(ws);

var on_connect = function() {
console.log('connected');
};
var on_error = function() {
console.log('error');
};
//参数依次为:用户名,密码,连接后,出错,虚拟主机名
client.connect('用户TOKEN', '', on_connect, on_error, '/');

在 ​​on_connect​​ 连接成功中可以定义自己的逻辑进行封装。

后台需要自己实现对 TOKEN 等自定义方式的认证。

比如要发送消息:

//参数依次为:目的地,消息头,消息体
client.send('/exchange/交换机名/路由键', {}, "Hello");

比如要订阅某个交换机:

//参数依次为:目的地,消息体,消息头
client.subscribe('/exchange/交换机名/路由键', function(frame){}, {});

此时会自动创建一个非持久化的队列,名字为随机生成,类似 ​​stomp-subscription-*****​​ 的队列名。

同时还可以以下面的方式创建指定的队列名(本例还增加了持久化):

//参数依次为:目的地,消息头,消息体
client.subscribe('/exchange/wf/wf.warn', function(frame){}, {
'x-queue-name': 'liuzh',
'durable': true
});

还可以继续给该队列绑定其他路由键:

//参数依次为:目的地,消息头,消息体
client.subscribe('/exchange/wf/wf.error', function(frame){}, {
'x-queue-name': 'liuzh',
'durable': true
});

此时队列 liuzh 状态如下:

使用 WebSocket 连接 RabbitMQ_rabbitmq stomp

绑定情况如下:

使用 WebSocket 连接 RabbitMQ_rabbitmq stomp_02

除了这里用到的参数外,还支持下面的队列参数:

  • durable (aliased as persistent):持久化
  • auto-delete:自动删除
  • exclusive:独占

还额外支持 x- 参数控制死信、队列和消息等:

  • x-dead-letter-exchange
  • x-dead-letter-routing-key
  • x-expires
  • x-message-ttl
  • x-max-length
  • x-max-length-bytes
  • x-overflow
  • x-max-priority

这里只是列举了几个比较重要的例子,完整的语法可以查看 ​​STOMP Plugin​​ 页面的详细介绍

参考资料

  • ​​https://www.rabbitmq.com/stomp.html​​
  • ​​https://www.rabbitmq.com/web-stomp.html​​
  • ​​https://github.com/jmesnil/stomp-websocket/​​


举报

相关推荐

0 条评论