当前位置: 首页 > article >正文

apisix转发websocket

1、说明

apisix网关对接websocket,参数以及使用可以看官方文档

WebSocket Authentication | Apache APISIX® -- Cloud-Native API Gateway

注意事项:

(1)官方文档是websocket要加认证,但自测发现可以不加认证插件

(2)官方文档说要把upstream的shema设置为https(这是个坑),实际使用的时候发现websocket服务器是https就用https,否则还是要用http。 被这个卡了很久

2、配置例子

2.1、websocket测试类

(1)maven依赖

<!--websocket-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-websocket</artifactId>
</dependency>
(2)配置类
@Slf4j
@Configuration
public class WebSocketConfig  {

    
    @Bean
    public ServerEndpointExporter serverEndpointExporter() {
        log.info("我被注入了");
        return new ServerEndpointExporter();
    }

}

(3)暴露给客户端的服务

@Slf4j
@Component
@ServerEndpoint("/socket/websocket/recive")
public class WebSocketService {



    // 定义属性
    private Session session;
    //创建一个set用来存储用户
    private static CopyOnWriteArraySet<WebSocketService> websockets = new CopyOnWriteArraySet<>();
    /**
     * 当有用户创建连接时候调用该方法
     */
    @OnOpen
    public void onOpen(Session session) {
        // 给当前的Session赋值
        this.session = session;
        // 将当前对象添加到CopyOnWriteArraySet 中
        websockets.add(this);
        // 可以获取该session,但是其实也是一个内存地址
        log.info("【建立连接】 用户为:" + this.session);
        // 获取总数,这个不难理解,实际上这个集合的总数,就是WebSocket连接的总数
        log.info("【建立连接】 总数为:" + websockets.size());
    }

    /**
     * 有用户连接断开时候触发该方法
     */
    @OnClose
    public void onClose() {
        websockets.remove(this); // 将当前的对象从集合中删除
        log.info("【连接断开】 用户为:" + this.session);
        log.info("【连接断开】 总数为:" + websockets.size());
    }

    /**
     * 这个方法是客户端给服务端发送消息触发该方法
     * @param message : 消息内容
     */
    @OnMessage
    public void onMessage(String message) {
        log.info("来自客户端的消息:{}",message);
        sendMessage(message+"收到回复");
    }

    /**
     * 发送消息的方法,方便后期别的service调用
     *
     * @param message 消息内容
     */
    public void sendMessage(String message) {
        for (WebSocketService websocket : websockets) {   // 遍历该Set集合
            log.info("广播消息 【给用户】 :" + websocket + "发送消息" + "【" + message + "】"); // 获取一个,在控制台打印一句话
            try {
                websocket.session.getBasicRemote().sendText(message); // 发送消息的方法
            } catch (IOException e) {
                e.getMessage();
            }
        }
    }
}

小插曲

用postman访问websocket一直连不通,会报错Error during WebSocket handshake: Unexpected response code: 200。 这个报错困扰了很久。​​​​​​​

websocket被识别成了http接口。因此在登录过滤器,需要蔽这个接口,nacos的配置增加sso.excluded.paths=/**/websocket/**

如果用的别的安全登录插件,也要相应的做接口屏蔽

2.2、配置apisix的websocket路由

下面是自己写的一个websocket例子,发布服务是http, 配置成路由route如下,可以正常转发访问。需要配置上游节点,路由转发

{

  "uri": "/websoket/msg",

  "name": "测试websocket1218",

  "desc": "测试websocket1218",

  "methods": [

    "GET"

  ],

  "plugins": {

    "proxy-rewrite": {

      "pluginName": "proxy-rewrite",

      "uri": "/dgcode/socket/websocket/recive",

      "use_real_request_uri_unsafe": false

    }

  },

  "upstream": {

    "nodes": [

      {

        "host": "10.255.158.74",

        "port": 9599,

        "weight": 1

      }

    ],

    "type": "roundrobin",

    "hash_on": "vars",

    "pass_host": "pass"

  },

  "enable_websocket": true,

  "status": 1

}

3、apifox测试可以正常调用


http://www.kler.cn/a/444000.html

相关文章:

  • 新版国标GB28181设备端Android版EasyGBD支持国标GB28181-2022,支持语音对讲,支持位置上报,开源在Github
  • 网络安全防范
  • 一区牛顿-拉夫逊算法+分解+深度学习!VMD-NRBO-Transformer-GRU多变量时间序列光伏功率预测
  • android studio更改应用图片,和应用名字。
  • 【ETCD】【源码阅读】深入分析 storeTxnWrite.Put方法源码
  • 2.4 网络概念(分层、TCP)
  • 【ArcGIS Pro】做个宽度渐变的河流符号
  • 如何使用arping命令检测IP地址冲突?
  • Windows部署Docker及PostgreSQL数据库相关操作
  • CSS中的深度选择器 deep 详解
  • canal详解及demo
  • 如何防范网络安全攻击,防止敏感数据被恶意窃取?
  • 【信息系统项目管理师-论文真题】2018下半年论文详解(包括解题思路和写作要点)
  • PaddlePaddle推理模型利用Paddle2ONNX转换成onnx模型
  • 使用phaser打僵尸游戏
  • Google Chrome浏览器安装到其它盘的方法
  • 小红书飞书素材库 | AI改写 | 无水印下载 | 多维表格 | 采集同步 | 影刀RPA
  • OpenCV函数及其应用
  • 大模型与呼叫中心结合的呼入机器人系统
  • jquery虚拟键盘插件jqkeyboard
  • 红队规范:减少工具上传,善用系统自带程序
  • CSS学习第二天
  • golang结构体转map
  • dify.ai和fastgpt,各有什么优缺点,有什么区别
  • 【计算机视觉基础CV】03-深度学习图像分类实战:鲜花数据集加载与预处理详解
  • 使用Python脚本进行编写批量根据源IP进行查询的语句用于态势感知攻击行为的搜索