Serverless 是近年来前端界的热门技术之一,它让我们可以更加便捷地开发和部署应用。而 WebSocket 则是实时通信的重要协议之一,它有着比传统 HTTP 更低的延迟和更快的速度。将 Serverless 和 WebSocket 这两项技术结合起来,可以让我们很方便地开发实时应用,如聊天室、游戏等。本篇文章将介绍如何使用 Serverless WebSocket。
WebSocket 简介
WebSocket 是一种在单个 TCP 连接上进行全双工通信的协议。它最初是由浏览器发起的,但现在已成为通用的协议,并被广泛应用于各种实时应用中。WebSocket 实时性强、速度快、支持跨域等特点,使得它成为了开发实时应用的一个重要选择。
在传统的 HTTP 请求/响应模型中,每次请求都需要重新建立连接,这样会产生较大的性能开销。而 WebSocket 则通过在客户端和服务器之间保持长连接,可以减少连接建立的时间,从而大幅度提升应用的实时性。
Serverless 简介
Serverless 是一种基于函数计算(Function-as-a-Service)的架构风格,它让开发者可以将精力集中在应用的业务逻辑上,而无需关心底层的服务器或运维。在 Serverless 中,开发者可以部署函数,函数的执行和扩展完全由平台自动管理。
使用 Serverless 可以让我们快速开发和部署应用,减少对基础设施的管理和维护,同时可以大幅度降低成本。
Serverless WebSocket 实战
准备工作
在开始本次实战之前,你需要了解以下内容:
- AWS Lambda:AWS 的一项 Serverless 服务,通过它可以运行代码而不需要管理服务。
- AWS API Gateway:AWS 的一项托管服务,可以帮助你创建、部署和管理 RESTful API 以及 WebSocket API。
- Node.js:这是一门非常流行的 JavaScript 运行时系统,在本次实战中我们将使用它来编写 Lambda 函数。
- WebSocket API:这里使用的是 Amazon API Gateway 中的 WebSocket API。
假设你已经安装了 Node.js 和 AWS CLI,并且已经在 AWS 中创建了 WebSocket API 和 Lambda 函数。下面我们将创建一个简单的聊天室应用。聊天室使用 WebSocket API 进行实时通信,Lambda 函数实现 WebSocket 的消息处理和存储。
编写 Lambda 函数
我们首先需要编写一个 Lambda 函数来处理 WebSocket 的消息。以下是一个简单的示例:
// javascriptcn.com 代码示例 const AWS = require('aws-sdk'); const dynamoDB = new AWS.DynamoDB.DocumentClient(); exports.handler = async (event, context) => { const {domainName, stage, connectionId, routeKey } = event.requestContext; const body = JSON.parse(event.body); const sender = body.sender; const message = body.message; if (routeKey === '$connect') { console.log(`Connected: ${connectionId}`); } else if (routeKey === '$disconnect') { console.log(`Disconnected: ${connectionId}`); } else if (routeKey === 'send') { const roomId = body.roomId; const timestamp = new Date().getTime().toString(); const params = { TableName: 'chat', Item: { roomId: roomId, timestamp: timestamp, sender: sender, message: message, connectionId: connectionId } }; await dynamoDB.put(params).promise(); console.log(`New message in room ${roomId}: ${message}`); } return { statusCode: 200 }; };
在上面的代码中,我们首先解析 WebSocket 消息的参数,然后根据不同的路由进行不同的操作。如果是 $connect
路由,表示有新的 WebSocket 连接,我们可以将此记录下来。如果是 $disconnect
路由,表示有 WebSocket 连接断开。如果是 send
路由,表示有新的消息,我们将消息存储到 DynamoDB 中。最后,将请求状态码设置为 200 并返回。
部署 Lambda 函数
部署 Lambda 函数非常简单。首先,我们需要将上面的代码保存到一个 index.js 文件中。然后,将这个文件以及相关的依赖打包成一个 zip 包。最后,通过 AWS CLI 调用以下命令来上传并构建 Lambda 函数:
$ aws lambda create-function \ --function-name chat \ --zip-file fileb://chat.zip \ --handler index.handler \ --runtime nodejs14.x \ --role [your-lambda-role-arn]
其中,[your-lambda-role-arn]
是你创建的 Lambda 执行角色 ARN。该命令将创建一个名为 chat
的 Lambda 函数,并将其部署到 AWS 中。
配置 API Gateway
接下来,我们需要配置 API Gateway,以便在 WebSocket 连接时调用 Lambda 函数。
首先,在 API Gateway 中创建一个新的 WebSocket API。在 Integrations
标签页中,选择 Lambda 函数的 ARN,并选择 Integration type
为 Lambda
。
在 Routes
标签页中,创建一个新的路由。路由名称为 send
,路由键为 send
,并指定 Lambda 的 ARN。
最后,在 Stages
标签页中,选择一个阶段。将可发布的 API 部署到这个阶段后,你可以获得一个 WebSocket URL。这个 URL 用于 WebSocket 连接,并且在消息被 Lambda 处理后返回给客户端。
编写客户端程序
最后,我们需要编写一个客户端程序来连接到 WebSocket API 并发送消息。以下是一个简单的示例:
// javascriptcn.com 代码示例 const WebSocket = require('ws'); const chatURL = '[your-websocket-url]'; const ws = new WebSocket(chatURL); ws.onopen = (event) => { console.log('WebSocket opened.'); ws.send(JSON.stringify({ type: 'join', roomId: 'testRoom', sender: 'user1' })); ws.send(JSON.stringify({ type: 'message', roomId: 'testRoom', sender: 'user1', message: 'Hello World!' })); }; ws.onmessage = (event) => { const message = JSON.parse(event.data); console.log('Received message:', message); }; ws.onclose = (event) => { console.log('WebSocket closed.'); };
客户端程序使用 WebSocket 模块连接到 API Gateway 的 WebSocket URL,并发送两条消息。第一条消息表示加入一个名为 testRoom
的房间,发送者为 user1
。第二条消息表示向 testRoom
发送一条消息,发送者为 user1
,消息内容为 Hello World!
。
当 Lambda 函数处理完这些消息后,它将在 WebSocket 连接上返回相应的数据,并通过客户端程序中的 onmessage
回调触发。在客户端程序中,我们打印收到的消息以供检查。
总结
Serverless 和 WebSocket 是两个非常热门的技术,它们都能大幅度提升应用的实时性、速度和可扩展性。将它们结合起来可以让我们快速开发实时应用,如聊天室、游戏等。在本文中,我们介绍了如何使用 Serverless WebSocket 来开发一个简单的聊天室应用,并提供了示例代码和指导。希望这篇文章对你有所帮助。
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/652b5af67d4982a6ebd4e566