Skip to content

WebSocket协议转换、转发。用于将 WebSocket 协议转换为其他协议,如 HTTP、TCP、MQTT、AMQP等。对于 TCP 和 MQ 类,将 WebSocket的消息也转发到后端。对于 HTTP 类,将 WebSocket 的消息内容转发到 HTTP 接口上,参数是 websocket的消息内容,采用 POST 请求。

websocket 转发协议支持

WebSocket 协议是指前端采用 websocket 协议,后端采用【其他】协议。支持的协议如下:

  • ws://、wss:// : websocket 标准协议, WebSocket 协议转发【代理】
  • tcp://、tcp+text:// : websocket 转 tcp 协议,text 文本协议,telnet 协议
  • tcp+bin://、tcp+binary:// : websocket 转 tcp bin 二进制协议
  • mqtt:// :websocket 转 mqtt 协议
  • amqp:// :websocket 转 amqp 协议, RabbitMQ
  • http://、https:// :websocket 转 http 协议
  • copy:// :copy message,一般用于测试

WebSocket-WebSocket

Websocket 代理,支持从 websocket 到 websocket 的转发。

yaml
proxy_setting:
  - "/websockify":
      type: "ws"
      target: "/websockify"
      proxy_pass: "ws://localhost:5901"
      order: 2

转发规则: 如果 target: "/websockify":

ws://ip:port/websockify/res 转发到 ws://localhost:5901/websockify/res

如果 target: "/" : ws://ip:port/websockify/res 转发到 ws://localhost:5901/res

WebSocket-HTTP

Websocket 到 HTTP 的转发,将 Websocket的消息转发到 HTTP 接口上, 参数是 websocket的消息内容,采用 POST 请求。

yaml
proxy_setting:
  - "/websockify":
      type: "ws"
      target: "/websockify"
      proxy_pass: "http://localhost:5901"
      order: 2

转发规则: 如果 target: "/websockify":

ws://ip:port/websockify/res 转发到 http://localhost:5901/websockify/res

如果 target: "/" : ws://ip:port/websockify/res 转发到 http://localhost:5901/res

WebSocket-TCP

yaml
proxy_setting:
  - "/websockify":
      type: "ws"
      target: "/websockify"
      proxy_pass: "tcp+bin://localhost:5901"
      order: 2

注意:

  • 建议采用 ** 模糊匹配websocket 前缀;
  • 建议采用 order 优先匹配 websocket 前缀;

转发规则: 如果 target: "/websockify":

ws://ip:port/websockify/res 转发到 localhost:5901

如果 target: "/" : ws://ip:port/websockify/res 转发到 localhost:5901

对于 tcp target 的路径是无效的,因为 tcp 是没有路径的,所以采用 target: "/" 即可。

WebSocket-MQTT

ProxyServer-Websocket 转 MQTT 的配置方法

用于转发 WebSocket 到 MQTT 服务器,支持 produce【默认】 和 consumer 两种方式。

produce WS client 连接后向 mqtt 发送消息。consumer 不会发送消息,只订阅消息。 发送和订阅只能一种模式,否则会有循环接收的情况,即:向指定 topic 发送消息,又向 topic 订阅消息,会接受到自己发送的消息。

  1. produce 配置方式:ws://ip:port/test/testtopic ,/test/testtopic 是发送到 MQTT 的 topic。
  2. consumer 配置方式:ws://ip:port/test/testtopic?consumer=true ,/test/testtopic 是到 MQTT 订阅的 topic。

mqtt topic:

可以是 /test/testtopic 亦可 /testtopic 或是 test,MQTT 没有对 topic 格式进行要求,需要开发者自己确定,可以理解他就是一个 key;

Websocket 的配置如下:

yml
- "/websocket":
  type: "ws"
  target: "/websocket"
  proxy_pass: "mqtt://localhost:1883/websocket"

type:ws, 意味着是个 websocket 的协议 proxy_pass: 的后台链接很重要,ws 是 websocket,mqtt 是 MQTT 协议。

这是一个标准的 URI,支持:

shell
mqtt://user1:000000@localhost:1888/abvdd/ess

user1: 为用户名 000000: 为密码

如果不需要用户名密码,则 mqtt://localhost:1888;如果只要用户名没有密码:mqtt://user1@localhost:1888

/abvdd/ess: 为 mqtt topic,请不要带其他不必要的参数,mqtt 这个 topic 是必须得

参考:

WebSocket-AMQP

用于转发 WebSocket 到 AMQP RabbitMQ 服务器,支持 produce【默认】 和 consumer 两种方式。

yml
proxy_setting:
  - "/test_amqp/**":
      type: "ws"
      target: "/test_amqp"
      proxy_pass: "amqp://192.168.1.10:5672"

produce WS client 连接后向 amqp 发送消息。consumer 不会发送消息,只订阅消息,和 mqtt 原理相同。

produce WS client 连接后向 mqtt 发送消息。consumer 不会发送消息,只订阅消息。 发送和订阅只能一种模式,否则会有循环接收的情况,即:向指定 topic 发送消息,又向 topic 订阅消息,会接受到自己发送的消息。

  1. produce 配置方式:ws://ip:port/test_amqp/testtopic ,test_amqp 作为 exchange,queueName 是 testtopic 发送到 AMQP 的 topic。
  2. consumer 配置方式:ws://ip:port/test_amqp/testtopic?consumer=true, testtopic 是到 AMQP 订阅的 topic。test_amqp 是可选的,总是采用 url 的最后资源路径。

produce: queueName 这时候不是必须的,如果存在则会消息发送到 test_amqp, 并且会带上 queueName 的 routerKey;

consumer: 配置 ws://ip:port/test_amqp/testtopic?consumer=truews://ip:port/testtopic?consumer=true 是相同的配置, 订阅者只取最后的资源路径,中间都会省略。