SpringCloudGateway转发WebSocket请求、以及静态路由

SpringCloudGateway转发WebSocket请求

1、WebSocket

  1. 依赖

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-websocket</artifactId>
    </dependency>
    
  2. 配置类 WebSocketConfig

    @Configuration
    public class WebSocketConfig {
        @Bean
        public ServerEndpointExporter serverEndpointExporter() {
            return new ServerEndpointExporter();
        }
    }
    
  3. 业务类 WebSocketServer

    @ServerEndpoint("/websocket/{username}")
    @Component
    public class WebSocketServer {
        /** 记录当前在线连接数,保证线程安全 */
        private static AtomicInteger onlineNum = new AtomicInteger();
        /** 存放 WebSocketServer 对象 */
        private static ConcurrentHashMap<String, Session> sessionPools = new ConcurrentHashMap<>();
    
        public void sendMessage(Session session, String message) throws IOException {
            session.getBasicRemote().sendText(message);
        }
        
        public void sendInfo(String userName, String message) throws IOException {
            Session session = sessionPools.get(userName);
            sendMessage(session, message);
        }
    
        @OnOpen
        public void onOpen(Session session, @PathParam(value = "username") String userName) throws IOException {
            sessionPools.put(userName, session);
            addOnlineCount();
            System.out.println("用户: " + userName + " 已连接" );
            System.out.println("目前连接人数:" + onlineNum);
            sendMessage(session, "用户: " + userName + " 已连接");
        }
    
        @OnClose
        public void onClose(@PathParam(value = "username") String userName){
            sessionPools.remove(userName);
            subOnlineCount();
            System.out.println(userName + " 已断开" );
            System.out.println("目前连接人数:" + onlineNum);
        }
    
        @OnMessage
        public void onMessage(String message) throws IOException{
            message = "收到了:" + message;
            System.out.println(message);
            for (Session session: sessionPools.values()) {
                sendMessage(session, message);
            }
        }
    
        @OnError
        public void onError(Session session, Throwable throwable){
            throwable.printStackTrace();
        }
    
        public static void addOnlineCount(){
            onlineNum.incrementAndGet();
        }
    
        public static void subOnlineCount() {
            onlineNum.decrementAndGet();
        }
    
    }
    
  4. 网关配置

    spring:
      cloud:
        gateway:
          routes:
            - id: web-socket
              uri: lb:ws://web-socket
              predicates:
                - Path=/api/**
              filters:
                - StripPrefix=1
    
  5. 前端-测试

    修改链接的网关端口:ws://localhost:9000/api/websocket/gangbeng

    /gangbeng 是传入用户名,可以随意更改

    <!DOCTYPE HTML>
    <html>
    <head>
        <title>Web Socket</title>
        <style>
            body {
                background-image: url("https://gimg2.baidu.com/image_search/src=http%3A%2F%2Fi0.hdslb.com%2Fbfs%2Farticle%2Fe7d4851b77c22ac7e1b0e3833b7c46237cef6471.jpg&refer=http%3A%2F%2Fi0.hdslb.com&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=jpeg?sec=1636695676&t=15294613e72e6e2564a9d30e012a7701");
                background-size: cover;
            }
            .root {
                width: 500px;
                margin: 100px auto;
                background-color: #fcfcfc;
                padding: 20px;
                border-radius: 8px;
                color: #3a87ad;
            }
            .btn {
                background-color: #3a87ad;
                margin-left: 10px;
                border: none;
                width: 60px;
                padding: 5px;
                color: #fcfcfc;
                font-size: 16px;
            }
            #message {
                width: 400px;
                margin: 20px auto;
                color: #dd0000;
                line-height: 30px;
            }
    
            input {
                width: 200px;
                height: 27px;
            }
        </style>
    </head>
    
    <body>
        <div class="root"> 输入发送的信息:
            <input id="text" type="text"/>
            <button class="btn" onclick="send()">发送</button>
            <button class="btn" onclick="closeWebSocket()">断开</button>
            <div id="message"></div>
        </div>
    </body>
    
    <script type="text/javascript">
      var websocket = null;
        websocket = new WebSocket('ws://localhost:9000/api/websocket/gangbeng');
      } else {
        alert('浏览器不支持WebSocket!')
      }
      websocket.onerror = function () {
        setMessageInnerHTML('连接错误')
      }
      websocket.onmessage = function (event) {
        setMessageInnerHTML(event.data)
      }
      websocket.onclose = function (event) {
        setMessageInnerHTML('已断开')
      }
      function setMessageInnerHTML (innerHTML) {
        document.getElementById('message').innerHTML += innerHTML + '<br/>'
      }
      function closeWebSocket () {
        websocket.close()
      }
      function send () {
        var message = document.getElementById('text').value
        websocket.send(message)
      }
    </script>
    </html>
    
    
  6. 效果图

    ![(img-BS9Fr1hs-1634116737159)(https://bj29.cn-beijing.data.alicloudccp.com/kLaRY7Ha%2F36939811%2F6166a106a4e9ea7293994853a8e1c5df8b909ef7%2F6166a106adf61062f2ff49ff940827971ce0e982?x-oss-access-key-id=LTAIsE5mAn2F493Q&x-oss-expires=1634116933&x-oss-process=image%2Fresize%2Cw_1920%2Fformat%2Cjpeg&x-oss-signature=H1REMWvU1e%2B0%2BFmXOCfjJXK6LkCx%2BB%2BIwUs%2B8z0BuWY%3D&x-oss-signature-version=OSS2)]

2、静态路由

spring:
  cloud:
    gateway:
      routes:
        - id: test
          uri: http://localhost:8848/nacos

版权声明:本文为weixin_42242074原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。