Websocket快速开始
本文档演示如何将Websocket
服务接入到Apache ShenYu
网关。
#
环境准备参考运维部署的内容,部署 Shenyu 网关
- 部署
shenyu-admin
服务
- 启动成功后,需要在页面的基础配置
->
插件管理中,把Websocket
插件设置为开启。
- 部署
shenyu-bootstrap
服务
- 启动之后
shenyu-bootstrap
会根据shenyu.sync.websocket.url
配置的地址,通过websocket
协议进行数据同步
注意:在启动前,请确保网关已经引入相关依赖,默认已引入该依赖。
引入网关对Websocket
的代理插件,在网关的 pom.xml
文件中增加如下依赖:
<!--shenyu websocket plugin start--> <dependency> <groupId>org.apache.shenyu</groupId> <artifactId>shenyu-spring-boot-starter-plugin-websocket</artifactId> <version>${project.version}</version> </dependency>
#
运行shenyu-examples-websocket项目下载 shenyu-examples-websocket(
native-websocket
和reactive-websocket
可以参考shenyu-examples-websocket 下的子项目)运行
org.apache.shenyu.examples.websocket.TestAnnotationWebsocketApplication
main方法启动项目。
- examples项目会根据
shenyu.register.serverLists
配置的地址,通过http
协议将 websocket 服务的信息同步给shenyu-admin
, 之后再由shenyu-admin
同步给shenyu-bootstrap
。
成功启动会有如下日志:
2022-08-09 23:37:34.994 INFO 61398 --- [or_consumer_-21] o.a.s.r.client.http.utils.RegisterUtils : metadata client register success: {"appName":"ws-annotation","contextPath":"/ws-annotation","path":"/ws-annotation/myWs","rpcType":"websocket","ruleName":"/ws-annotation/myWs","enabled":true,"pluginNames":[],"registerMetaData":false,"timeMillis":1660059454701} 2022-08-09 23:37:35.019 INFO 61398 --- [or_consumer_-18] o.a.s.r.client.http.utils.RegisterUtils : uri client register success: {"protocol":"ws://","appName":"ws-annotation","contextPath":"/ws-annotation","rpcType":"websocket","host":"192.168.1.3","port":8001}
#
测试websocket请求shenyu-examples-websocket
项目成功启动之后会自动把加@ShenyuSpringWebSocketClient
注解的接口方法注册到网关,并添加选择器和规则,可以通过访问shenyu-admin
页面 -> 插件列表 -> Proxy -> Websocket 看到shenyu-examples-websocket
服务注册的信息,如果没有,可以参考Websocket插件手动添加配置。
- 下面使用测试代码(见附件)模拟
Websocket
协议的请求方式来请求你的Websocket
服务。
#
附件websocket调试代码
- 创建一个名为 websocket.html 的文件,复制下面的代码到文件中
- 使用谷歌浏览器打开 websocket.html
<!DOCTYPE HTML><html><head> <meta http-equiv="content-type" content="text/html" /> <title>Shenyu WebSocket Test</title> <script> var websocket; function connect() { try { websocket = new WebSocket(document.getElementById("url").value); websocket.onopen = onOpen; websocket.onerror = onError; websocket.onmessage = onReceive; websocket.onclose = onClose; } catch (e) { alert('[websocket] establish connection error.'); } } function onOpen() { alert('[websocket] connect success.'); } function onError(e) { alert("[websocket] connect error. code: " + e.code); } function onReceive(msg) { var show = document.getElementById("show"); show.innerHTML += "[Server Response] => " + msg.data + "<br/>"; show.scrollTop = show.scrollHeight; } function onClose(e) { console.log("[websocket] connect closed. code: " + e.code) alert("[websocket] connect closed."); document.getElementById("show").innerHTML = ""; document.getElementById("msg").value = ""; websocket = null; } function buttonClose() { if (websocket == null) { console.log("Please establish a connection first.") } else { websocket.close(1000); document.getElementById("show").innerHTML = ""; document.getElementById("msg").value = ""; } } function send() { if (websocket == null) { alert("Please establish a connection first.") } else { var msg = document.getElementById("msg").value; show.innerHTML += "[Client Request] => " + msg + "<br/>"; websocket.send(msg); } } </script></head><body> <input id="url" type="text" value="ws://localhost:9195/ws-annotation/myWs"><br /> <input id="msg" type="text"><br /> <button id="connect" onclick="connect();">Connect</button> <button id="send" onclick="send();">Send</button> <button id="close" onclick="buttonClose();">Close</button></br> <div id="show" class="show"></div></body></html><style> input { width: 400px; margin-bottom: 10px; } .show { width: 600px; height: 400px; overflow-y: auto; border: 1px solid #333; margin-top: 10px; }</style>