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 的转发。
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 请求。
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
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 订阅消息,会接受到自己发送的消息。
- produce 配置方式:
ws://ip:port/test/testtopic
,/test/testtopic
是发送到 MQTT 的 topic。 - consumer 配置方式:
ws://ip:port/test/testtopic?consumer=true
,/test/testtopic
是到 MQTT 订阅的 topic。
mqtt topic:
可以是 /test/testtopic
亦可 /testtopic
或是 test
,MQTT 没有对 topic 格式进行要求,需要开发者自己确定,可以理解他就是一个 key;
Websocket 的配置如下:
- "/websocket":
type: "ws"
target: "/websocket"
proxy_pass: "mqtt://localhost:1883/websocket"
type:ws, 意味着是个 websocket 的协议 proxy_pass: 的后台链接很重要,ws 是 websocket,mqtt 是 MQTT 协议。
这是一个标准的 URI,支持:
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 两种方式。
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 订阅消息,会接受到自己发送的消息。
- produce 配置方式:
ws://ip:port/test_amqp/testtopic
,test_amqp
作为 exchange,queueName 是testtopic
发送到 AMQP 的 topic。 - 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=true
和 ws://ip:port/testtopic?consumer=true
是相同的配置, 订阅者只取最后的资源路径,中间都会省略。