APISIX源码解析-插件-mqtt协议代理【mqtt-proxy】

本文深入探讨了APISIX的mqtt-proxy插件,该插件支持MQTT v3.1.1和v5.0协议,提供流模式下的动态负载均衡功能。通过配置stream_proxy,可以在监听9100端口时启用此插件。
摘要由CSDN通过智能技术生成

mqtt-proxy 协议代理

关键属性

在这里插入图片描述

mqtt协议

mqtt-proxy 只工作在流模式,它可以帮助你根据 MQTT 的 client_id 实现动态负载均衡。

这个插件支持 MQTT 3.1.* 及5.0两个协议。

MQTT v3.1.1

详细参考 https://www.cnblogs.com/hayasi/p/7743356.html

MQTT v5.0

详细参考 https://www.zybuluo.com/khan-lau/note/1325300

如何启用

启用该插件,需要先在 conf/config.yaml 中首先开启 stream_proxy 配置,比如下面配置代表监听 9100 TCP 端口:

    ...
    router:
        http: 'radixtree_uri'
        ssl: 'radixtree_sni'
    stream_proxy:                 # TCP/UDP proxy
      tcp:                        # TCP proxy port list
        - 9100
    dns_resolver:
    ...

源码实现与解析

local function parse_mqtt(data)
    local res = {
   }
    -- 返回第一个字节,一个字符一个字节,第一个字节包含连接标志(Connect Flags)
    res.packet_type_flags_byte = str_byte(data, 1, 1)
    if res.packet_type_flags_byte < 16 or res.packet_type_flags_byte > 32 then
        return nil, "Received unexpected MQTT packet type+flags: "
                    .. res.packet_type_flags_byte
    end

    local parsed_pos = 1
    res.remaining_len = 0
    local multiplier = 1
    -- 固定报文头 = 1 + (1 <= 剩余长度 <=4)
    -- 接下来4个字节代表剩余的总长度: 可变报文头+消息负载的总长度
    -- 剩余长度字段单个字节最大值为二进制0111 1111,16进制0x7F。也就是说,单个字节可以描述的最大长度是127字节。
    -- MQTT协议规定,单个字节第八位(最高位)若为1,则表示后续还有字节存在,第八位起“延续位”的作用。
    for i = 2, 5 do
        parsed_pos = i
        local byte = str_byte(data, i, i)
        res.remaining_len = res.remaining_len + bit.band(byte, 127) * multiplier
        multiplier = multiplier * 128
        -- 如起始最高位为0,代表后续没有字节在
        if
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值