envoy websockets每条路线的配置,JavaScript测试设置

在我昨天的文章中,我讨论了 配置和测试用于代理websockets的envoy 漫长的时间。

今天,我想补充一些信息。

每个路由的websocket升级的正确语法

你可以在每个路由中启用websocket升级。不需要在全局范围内添加它。

- 名称: envoy.http_connection_manager
    配置。
      #upgrade_configs。
      # - 升级_类型: websocket
      stat_prefix: ingress_https
      use_remote_address: true
      xff_num_trusted_hops。0
      route_config。
        virtual_hosts。
        - 名称:picockpit_withport
          域。["picockpit.local:443"]
          航线。
            - 匹配。{ prefix:"/mqtt/webclient" }
              路线。
                群组:target_dwebsocket
                upgrade_configs。
                  - 升级_类型。"websocket"
                    enabled: true
            - 匹配。{prefix:"/"}
              路线。{cluster: target_picockpit}.

请注意,我决定对包括端口在内的配置进行镜像,而没有镜像--只是为了以防万一。

- 名称:picockpit
   域。["picockpit.local"]
   航线。
     - 匹配。{ prefix:"/mqtt/webclient" }
       路线。
         群组:target_dwebsocket
         upgrade_configs。
           - 升级_类型。"websocket"
             enabled: true
     - 匹配。{prefix:"/"}
       路线。{cluster: target_picockpit}.

请看下面(Update 3),将两者结合在一个单一的句子中,这样更优雅,Update 2是关于我对JavaScript客户端需要端口符号的怀疑。

默认情况下是全球启用的?

请注意,特使的文件 似乎意味着websocket的升级是全局默认启用的。.我没有测试过这个。

也许你只需要指定域名 包括 该港口。 正如我在文章中所讨论的,以使websocket连接发挥作用。

Javascript测试

一个简单的JavaScript测试客户端应该是这样的。

函数connect(){
     console.log("Building up websocket")。
     var socket = new WebSocket("wss://key:[email protected]/mqtt/webclient");
     socket.onerror = function(event){
         console.log("遇到了一个错误")。
         console.log(event)。
     }

    socket.onopen = function(){
         console.log("Socket has been opened.")。
         console.log('Socket Status: '+ socket.readyState)。
         socket.send("Hello server!")。
     }
     socket.onmessage = function(msg){
         console.log("received message")。
         console.log(msg)。
     }
     console.log("Finished with first websocket")。
}

connect()。

结合在一起 与我的另一个帖子,以及简单的websocket回声客户端,你会得到一个 "Hello server!"的消息。

形象

更新2

似乎JavaScript客户端没有使用domain:port authority语法。因此,第一个句子可能是不需要的

形象

那么,这应该足够了。

- 名称:picockpit
  域。["picockpit.local"]
  航线。
    - 匹配。{ prefix:"/mqtt/webclient" }
      路线。
        群组:target_dwebsocket
        upgrade_configs。
          - 升级_类型。"websocket"
            enabled: true
     - 匹配。{prefix:"/"}
       路线。{cluster: target_picockpit}.

更新3

最简单的方法是,可能只是为两个域名的变化进行匹配,并有相同的代码。

- 名称: envoy.http_connection_manager
   配置。
     #upgrade_configs。
     # - 升级_类型: websocket
     stat_prefix: ingress_https
     use_remote_address: true
     xff_num_trusted_hops。0
     route_config。
       virtual_hosts。
       - 名称:picockpit_withport
        域。["picockpit.local:443", "picockpit.local"]
         航线。
           #- 匹配。{ prefix:"/mqtt/webclient" }
           - 匹配。{ prefix:"/mqtt" }
             路线。
               群组:target_dwebsocket
               upgrade_configs。
                 - 升级_类型。"websocket"
                   enabled: true
           - 匹配。{prefix:"/"}
             路线。{cluster: target_picockpit}.