SpringCloudGateway笔记(10)-websocket

本文介绍了SpringCloudGateway如何支持WebSocket的转发,由于zuul不支持WebSocket,SpringCloudGateway成为了一个更好的选择。文中详细讲解了服务端和客户端的配置,包括WebSocketConfig、WebsocketController的设置,以及如何在客户端页面建立连接并收发消息。此外,还通过POSTMAN测试了后台发送消息的功能,并在Chrome控制台观察到相应输出。完整代码可在GITHUB找到。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

使用SpringCloudGateway的重要功能 – websocket的转发

spring-boot的第一代网关zuul不支持websocket的转发,而在实际应用场景中,websocket作为一个常用功能,这大大限制了zuul的使用

SpringCloudGateway支持websocket的转发

配置websocket的客户端和服务端

客户端页面代码

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8"/>
    <title>Spring Boot Websocket</title>
    <script src="jquery-3.4.1.min.js"></script>
    <script src="sockjs.min.js" type="text/javascript"></script>
    <script src="stomp.min.js" type="text/javascript"></script>
    <script type="text/javascript">
        var stompCient = null;
        var host = "http://127.0.0.1:8801";

        function setConnected(connected) {
            document.getElementById("connectBt").disabled = connected;
            document.getElementById("disconnectBt").disabled = !connected;
            document.getElementById("conversationDiv").style.visibility = connected ? 'visible' : 'hidden';

            $('#response').html();
        }

        function testGet() {

        }

        function connect() {
            console.log("====");
            var socket = new SockJS(host + "/websocket");
            stompCient = Stomp.over(socket);
            stompCient.connect({}, function (frame) {
                setConnected(true);
                console.log("connected: " + frame);
                stompCient.subscribe('/subscribe', function (response) {
                    showResponse(response.body);
                })
            })
        }

        function disconnect() {
            if (stompCient != null) {
                stompCient.disconnect();
            }
            setConnected(false);
            console.log("disconnected");
        }

        function send() {
            var name = $('#name').val();
            var message = $('#message').val();
            stompCient.send("/chat", {}, name + ":" + message);
        }

        function showResponse(message) {
            console.log("===respnse: "+message)
            var respons = $('#response');
            respons.html(message);
        }
    </script>
</head>

<body onload="disconnect();">
<noscript>
    <h2 style="color: #ff0000">not support websocket</h2>
</noscript>
<div>
    <div>
        <button id="test" onabort="testGet()">test</button>
        <p id="resText"></p>
    </div>
    <div>
        <button id="connectBt" onclick="connect()"> connect</button>
        <button id="disconnectBt" onclick="disconnect()">disconnect</button>
    </div>
    <div id="conversationDiv">
        <label>enter your name</label> <input type="text" id="name"/>
        <br>
        <label>enter message</label> <input type="text" id="message"/>
        <button id="send" onclick="send()">send</button>
        <p id="response"></p>
    </div>
</div>

</body>
</html>

服务端配置

WebSocketConfig

@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig implements WebSocketMessageBrokerConfigurer {

    @Override
    public void registerStompEndpoints(StompEndpointRegistry registry){
        //客户端连接端点
        registry.addEndpoint("/websocket")
                .setAllowedOrigins("*")
                .withSockJS();
    }
}

WebsocketController

@Slf4j
@RestController
public class WebsocketController {
    @Autowired
    private SimpMessagingTemplate template;


    @MessageMapping("/chat")
    @SendTo("/subscribe")
    public String say(String msg) {
        log.info("websocket msg: {}", msg);
        return msg;
    }

    @GetMapping("/websocket/reply")
    public String msgReply(@RequestParam String msg) {
        log.info("websocket reply: {}", msg);
        template.convertAndSend("/subscribe", msg);
        return msg;
    }
}

配置Gateway,普通的websocket用下面的配置,这里用上面这个配置就可以了

        - id: spring-cloud-client-demo3
          uri: lb://spring-cloud-client-demo
          predicates:
            - Path=/websocket/**
          filters:
            - StripPrefix=1
        - id: spring-cloud-client-demo4
          uri: lb:ws://spring-cloud-client-demo
          predicates:
            - Path=/websocket/**

运行程序

打开页面

在这里插入图片描述

点击connect连接websocket

在这里插入图片描述

连接成功 输入消息发送

在这里插入图片描述

后台同样收到消息

2019-06-29 22:20:35.881  INFO 13880 --- [boundChannel-38] c.m.d.c.websocket.WebsocketController    : websocket msg: a:hello

POSTMAN调用后台发送消息的接口

在这里插入图片描述

查看页面同样可以收到消息

在这里插入图片描述

查看chrome的控制台也可以看到相关打印

在这里插入图片描述
GITHUB代码地址

欢迎关注微信交流
在这里插入图片描述

### 前后端分离项目的开发文档、接口文档及安全文档 #### 开发文档模板及示例 开发文档通常分为以下几个部分: 1. **项目概述** - 描述整个系统的功能目标以及架构设计思路。 ```markdown ### 项目概述 本项目采用前后端分离模式,前端基于 Vue.js 构建单页应用 (SPA),后端使用 Spring Boot 提供 RESTful API 接口服务[^1]。系统通过 Nginx 实现负载均衡和静态资源托管,利用 Redis 缓存高频访问的数据,MySQL 存储核心业务数据,消息队列 Kafka 和 RocketMQ 负责异步处理任务流。 ``` 2. **技术选型** - 列举并解释所使用的框架和技术及其作用。 ```markdown ### 技术选型 | 组件 | 功能描述 | |--------------|------------------------------------------------------------------------| | Frontend | 使用 Vue.js 框架构建动态交互界面,配合 HTML/CSS/JS 完成页面渲染[^2] | | Backend | 后端选用 Spring Boot 微服务框架简化配置流程,集成 MyBatis 数据持久化层[^1] | | Cache | Redis 作为缓存中间件提升查询效率 | | Database | MySQL 主要负责存储结构化数据 | | Message Queue| Kafka/RocketMQ 承担高并发场景下的解耦与削峰 | ``` 3. **模块划分** - 明确各个子模块的功能范围及其相互关系。 4. **部署方案** - 阐述如何将应用程序发布到生产环境。 ```markdown ### 部署方案 应用程序运行于 Docker 容器之上,借助 Kubernetes 或者 Swarm 管理集群实例规模变化。网关由 Spring Cloud Gateway/Nginx 提供统一入口管理,并支持跨域请求控制策略设置[^1]。 ``` --- #### 接口文档模板及示例 API 文档应清晰定义每一个 HTTP 请求的具体参数要求、返回值格式等内容。 ```json { "title": "用户登录", "description": "验证用户名密码正确性。", "method": "POST", "url": "/api/auth/login", "headers": { "Content-Type": "application/json" }, "requestBody": { "username": "string", "password": "string" }, "responses": [ { "status": 200, "body": "{ \"token\": \"JWT_TOKEN\" }" } ] } ``` 或者更简洁的形式如下所示: ```markdown ### 用户注册接口 - URL: `/api/user/register` - Method: POST - Request Body: ```json { "email":"test@example.com", "password":"securePassw0rd!" } ``` - Response Example(成功响应): Status Code: 201 Created ```json {"message":"User registered successfully."} ``` ``` --- #### 安全文档模板及示例 安全性是现代 Web 应用不可忽视的一环,在此提供一些常见措施说明。 1. **身份认证机制** - JWT Token 认证方式被广泛应用于无状态会话保持中[^2]。 2. **输入校验** - 对所有外部提交的数据执行严格的正则匹配或其他形式的合法性检验以防 SQL 注入攻击等问题发生。 3. **敏感信息保护** - 敏感字段加密传输并通过 HTTPS 协议保障链路层面的安全性。 4. **日志审计** - 关键操作记录至文件或数据库以便后续追踪分析异常行为轨迹。 5. **权限管控** - RBAC(Role-Based Access Control)模型实现细粒度授权管理确保不同角色拥有恰当的操作权限集合[^2]。 ---
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值