SpringCloudGateway转发WebSocket请求
1、WebSocket
依赖
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-websocket</artifactId> </dependency>配置类 WebSocketConfig
@Configuration public class WebSocketConfig { @Bean public ServerEndpointExporter serverEndpointExporter() { return new ServerEndpointExporter(); } }业务类 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(); } }网关配置
spring: cloud: gateway: routes: - id: web-socket uri: lb:ws://web-socket predicates: - Path=/api/** filters: - StripPrefix=1前端-测试
修改链接的网关端口:
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>效果图
![(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版权协议,转载请附上原文出处链接和本声明。