背景
在web开发当中,有两种场景需要前端和后端频繁交互,一种是后端数据变动频繁,需要实时通知前端,一种是多客户端需要实时交互,为了解决这两个问题,许多web开发者通过使用ajax实现长轮询来实现和后端的交互,这种方案的缺点是数据实时性不是很高,不断建立tcp链接性能损耗不可忽视。对于这种实时性要求高,数据变动频繁的需求,其实使用websocket的方案更加合适,websocket是一种实现全双工的一种非常好的方案。serverless虽然是无状态的,但是可以结合api网关的能力,实现websocket。
方案设计
整体架构图如下:
实现步骤:
- 登录云数据库 TencentDB 控制台,创建mysql,并初始化db,创建数据表,用于记录连接上来的客户
//替换为websocket连接地址
let conn = new WebSocket("ws://service-xxx-xxx.sh.apigw.tencentcs.com/release/websocket");
conn.onclose = function (evt) {
var item = document.createElement("div");
item.innerHTML = "<b>Connection closed.</b>";
appendLog(item);
};
conn.onmessage = function (evt) {
var item = document.createElement("div");
item.innerText = "接收↓:";
appendLog(item);
var messages = evt.data.split('n');
for (var i = 0; i < messages.length; i ) {
var item = document.createElement("div");
item.innerText = messages[i];
appendLog(item);
}
conn.send(msg.value);
登录云函数控制台,进入【函数服务】页面。创建Websocket注册函数,当用户连接api网关的时候,该注册函数就会把用户的连接信息记录到db,用于后续有消息推动登录云函数控制台,进入【函数服务】页面。创建Websocket传输函数。云函数收到消息后,会通过传输函数发送消息给其他客户端登录云函数控制台,进入【函数服务】页面。创建Websocket清理函数。当用户断开与api网关长连接的时候,该函数就清理db中的连接信息。配置API网关使用客户端接入,客户端可以是个网页,也可以是程序代码。 例如js客户端接入:
代码语言:txt复制java客户端接入: URI uri = URI.create("ws://xxx.apigw.tencentcs.com/release/websocket");
MyWebSocketClient myClient = new MyWebSocketClient(uri);
// 往websocket服务端发送数据
try {
myClient.connectBlocking(); //阻塞等待访问
} catch (InterruptedException e) {
e.printStackTrace();
}
if (myClient.isOpen()) {
myClient.send("发的ssss".getBytes());
} else {
System.out.println("close");
}