SpringCloud-Gateway轉發(fā)WebSocket失敗問題及解決
SpringCloud-Gateway轉發(fā)WebSocket失敗
正常調用單一服務時未出現異常
如:
當使用Gateway做轉發(fā)時出現如下錯誤
1.websocket 連接報 java.nio.channels.ClosedChannelException: null;
2.前端js連接時出現websocket failed One or more reserved bits are on: reserved1 = 0, reserved2 = 1, reserved3 = 1的錯誤。
使用spring-boot-starter-websocket搭建了websocket服務,直接用服務的IP加端口訪問是正常的,換成網關的訪問地址就報錯。
這樣的情況需要在網關過濾掉websocket的請求
在網關找到:
加上判斷,排除websocket的請求就可以了
String upgrade = exchange.getRequest().getHeaders().getUpgrade(); if("websocket".equals(upgrade)){ return chain.filter(exchange); }
如果還在報 1 中的NULL錯誤信息的話在websocket的注入時加上 subprotocols = {"protocol"}
;
這只是本地測試成功了,當部署到線上測試環(huán)境后,唉,怎么都連接不上!
后面才發(fā)現 通過nginx做了反向代理,在通過域名請求Gateway的時候沒有過濾掉請求。
發(fā)現這里 upgrade
沒有獲取到,所以一直出現:
Error during WebSocket handshake: Unexpected response code: 200
的異常,后面發(fā)現原來是nginx沒有配置,
在這里加了配置后完美解決獲取不到的問題,并包含了:
failed: Error during WebSocket handshake: Unexpected response code: 404
的異常問題~
總結
以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
idea SpringBoot+Gradle環(huán)境配置到項目打包
Gradle是一個基于Java應用的項目自動化構建工具,本文介紹了在IDEA中創(chuàng)建Spring Boot Gradle項目,項目配置包括init.gradle和settings.gradle,感興趣的可以了解一下2024-11-11Java狀態(tài)設計模式實現對象狀態(tài)轉換的優(yōu)雅方式
Java狀態(tài)設計模式通過將對象的行為和狀態(tài)分離,使對象能夠根據不同的狀態(tài)進行不同的行為操作。它通過將狀態(tài)抽象成一個獨立的類來實現對狀態(tài)的封裝,從而簡化了復雜的條件判斷和狀態(tài)轉換2023-04-04利用spring?boot+WebSocket實現后臺主動消息推送功能
目前對于服務端向客戶端推送數據,常用技術方案有輪詢、websocket等,下面這篇文章主要給大家介紹了關于利用spring?boot+WebSocket實現后臺主動消息推送功能的相關資料,需要的朋友可以參考下2022-04-04