AWS Lambda 借助 Serverless Framework,迅速起飞 (4)

订单服务很简单,接收一个下单请求,下单成功后快速返回给用户,同时将订单下单成功的消息发送到 SQS 中,供下游发票服务开具发票使用

'use strict'; const config = require('../conf/config.json') const AWS = require('aws-sdk'); const sqs = new AWS.SQS(); const { v4: uuidv4 } = require('uuid'); module.exports.checkout = async (event, context, callback) => { console.log(event) let statusCode = 200 let message if (!event.body) { return { statusCode: 400, body: JSON.stringify({ message: 'No order body was found', }), }; } const region = context.invokedFunctionArn.split(':')[3] const accountId = context.invokedFunctionArn.split(':')[4] const queueName = config['queueName'] // 组装 SQS 服务的 URL const queueUrl = `https://sqs.${region}.amazonaws.com/${accountId}/${queueName}` const orderId = uuidv4() try { // 调用 SQS 服务 await sqs.sendMessage({ QueueUrl: queueUrl, MessageBody: event.body, MessageAttributes: { orderId: { StringValue: orderId, DataType: 'String', }, }, }).promise(); message = 'Order message is placed in the Queue!'; } catch (error) { console.log(error); message = error; statusCode = 500; } // 快速返回订单 ID return { statusCode, body: JSON.stringify({ message, orderId, }), }; }; Invoice Lambda Function

发票服务逻辑同样很简单,消费 SQS 指定队列中的消息,并将开具出的发票发送到客户订单信息的 email 中

module.exports.generate = (event, context, callback) => { console.log(event) try { for (const record of event.Records) { const messageAttributes = record.messageAttributes; console.log('OrderId is --> ', messageAttributes.orderId.stringValue); console.log('Message Body --> ', record.body); const reqBody = JSON.parse(record.body) // 睡眠 20 秒,模拟生成发票的耗时过程 setTimeout( () => { console.log("Receipt is generated and sent to :" + reqBody.email) }, 20000) } } catch (error) { console.log(error); } }

到此 demo 的代码就全部实现了,从中你可以看到:

我们没有关注 lambda 的底层服务细节,没有关注 sqs 的服务,只是简单的代码逻辑实现以及服务之间的串联定义

最后我们看一下整体的目录结构吧:

. ├── app │   ├── invoice.js │   └── order.js ├── conf │   └── config.json ├── package.json └── serverless.yml 2 directories, 5 files 发布 Lambda 应用

在发布之前,编译一下应用,安装必须的 package「uuid 和 aws-sdk」

npm install

发布应用非常简单,只需要一条命令:

sls deploy -v

运行上述命令后大概需要等带几十秒钟, 在构建的最后,会打印出我们的构建服务信息:

AWS Lambda 借助 Serverless Framework,迅速起飞

上图的 endpoints 就是我们一会要访问的 API gateway 触发 lambda 的入口,在调用之前,我们先到 AWS console 看一下我们定义的服务

lambda functions

AWS Lambda 借助 Serverless Framework,迅速起飞

SQS-receverQueue

AWS Lambda 借助 Serverless Framework,迅速起飞

API Gateway

AWS Lambda 借助 Serverless Framework,迅速起飞

S3

从上图的构建信息中你应该还看到一个 S3 bucket 的名称,我们并没有创建 S3, 这是 SF 自动帮我们创建,用来存储 lambda zip package 的

AWS Lambda 借助 Serverless Framework,迅速起飞

测试

调用 API gateway 的 endpoint 来测试 lambda

AWS Lambda 借助 Serverless Framework,迅速起飞

打开 SQS 服务,你会发现,接收到一条消息:

AWS Lambda 借助 Serverless Framework,迅速起飞

接下来我们看看 Invoice Lambda function 的消费情况,打开 CloudWatch 查看 log:

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpdxwz.html