初探无服务器云
大纲
该项目的所有代码都可以在我的 GitHub 上的First Look monorepo中找到。
介绍
Serverless Cloud是Serverless, Inc.推出的全新无服务器应用平台。与该公司的初始产品Serverless Framework不同,它不会将您的应用程序直接部署到 AWS。相反,您的应用程序会立即部署到云端的新托管服务上,并运行在带有仪表板和实时日志的全新托管服务上。
设置
安装 Cloud CLI
@serverless/cloud
从安装npm
。
npm i -g @serverless/cloud
初始化服务
在本地机器上为您的服务代码创建一个空白文件夹,并使用cloud
命令初始化您的无服务器云服务。
mkdir ajcwebdev-serverless-cloud
cd ajcwebdev-serverless-cloud
cloud
您的浏览器将自动打开,并通过 CLI 登录,或在终端中提供登录链接。连接后,您将收到一个激活码,请在出现提示时输入。
部署到暂存环境
为您的服务命名并deploy dev
在交互式终端中部署它。
deploy dev
cloud deploy dev
如果您想从 repo 克隆其中一个项目并立即部署它,您也可以使用它。
cloud deploy dev
您将获得一个带有示例待办事项应用程序的已部署端点。
添加一些待办事项。
该@serverless/cloud
包默认包含在云运行时中,因此不需要将其作为依赖项包含在内package.json
。
{
"name": "ajcwebdev-serverless-cloud",
"version": "1.0.0",
"description": "Serverless Cloud todo api",
"main": "index.js",
"type": "module",
"scripts": {
"start": "cloud",
"test": "cloud test"
},
"devDependencies": {
"@jest/globals": "^27.1.0",
"@serverless/cloud": "^0.0.22"
},
"serverless": {
"org": "ajcwebdev",
"service": "ajcwebdev-serverless-cloud"
}
}
索引条目文件
@serverless/cloud
我们从文件顶部导入一些模块index.js
。
// index.js
import {
api, data, schedule, params
} from '@serverless/cloud'
api.get('/todos', async (req, res) => {...})
api.post('/todos/:id', async (req, res) => {...})
api.delete('/todos/:id', async (req, res) => {...})
api.use((err, req, res, next) => {...})
schedule.every("60 minutes", async () => {...})
const getTodos = async (status, meta) => {...}
api
用于构建 REST API。api.get
-GET
方法api.post
-POST
方法api.delete
-DELETE
方法api.use
- 中间件
data
用于访问无服务器数据。data.get
- 读取数据data.getByLabel
- 读取具有指定标签的数据data.set
- 将数据写入存储data.remove
- 删除数据
schedule
用于创建计划任务。schedule.every
- 按指定的时间间隔运行,例如每 60 分钟
getTodos 函数
此函数可以在不同的 API 路径中重复使用,以获取所有待办事项或根据标签获取特定的待办事项。
// index.js
const getTodos = async (status, meta) => {
let result
if (status === 'all') {
result = await data.get('todo:*', meta)
} else if (status === 'complete') {
result = await data.getByLabel('label1','complete:*', meta)
} else {
result = await data.getByLabel('label1','incomplete:*', meta)
}
return {
items: result.items.map(
item => item.value
)
}
}
获取待办事项
该函数getTodos
使用状态调用我们的函数并返回结果。
// index.js
api.get('/todos', async (req, res) => {
let result = await getTodos(
req.query.status,
req.query.meta ? true : {}
)
console.log(params.CLOUD_URL)
res.send({
items: result.items
})
})
将更新发布到 Todo
此函数接受body
请求的 并将其设置为data
。body
可以包括duedate
。它还包括id
、createdAt
日期,并且status
可以是complete
或incomplete
。设置待办事项后,getTodos
将对所有待办事项再次运行查询,并返回更新后的列表。
// index.js
api.post('/todos/:id', async (req, res) => {
console.log(new Date().toISOString())
let body = req.body
if (body.duedate) {
body.duedate = new Date(body.duedate).toISOString()
}
await data.set(
`todo:${req.params.id}`,
{
...body,
createdAt: Date.now()
},
Object.assign({},
req.body.status ?
{
label1: body.status === 'complete'
? `complete:${new Date().toISOString()}`
: `incomplete:${body.duedate ? body.duedate : '9999' }` }
: null
)
)
let result = await getTodos(
req.query.status
)
res.send({
items: result.items
})
})
如果三元汤没有Object.assign
任何意义,就不要理会它。尽量别去管它,别去碰它。
删除待办事项
该函数删除待办事项data.remove
,然后查询并返回列表中剩余的待办事项。
// index.js
api.delete('/todos/:id', async (req, res) => {
await data.remove(`todo:${req.params.id}`)
let result = await getTodos(req.query.status)
res.send({
items: result.items
})
})
自定义错误处理程序中间件
此函数提供错误处理的中间件。错误也会在开发模式下实时传输到您的终端。
// index.js
api.use((err, req, res, next) => {
console.error(err.stack)
if (!err.statusCode) {
err.statusCode = 500
}
const error = {
name: err.name,
statusCode: err.statusCode,
message: err.message,
}
res.status(err.statusCode).json(error)
})
每小时检查逾期待办事项
有时您可能希望按计划运行代码,例如,当项目逾期时发送警报。此函数会查找逾期的项目,循环遍历逾期的项目,并在必要时发送警报。
// index.js
schedule.every("60 minutes", async () => {
console.log(`Checking for overdue TODOs...`)
let overdueItems = await data.getByLabel(
'label1',
`incomplete:<${new Date().toISOString()}`
)
if (overdueItems.items.length === 0) {
console.log(`Nothing overdue!`)
}
for (let item of overdueItems.items) {
console.log(
`ALERT: '${item.value.name}' is overdue!!!`
)
}
})
示例待办事项
打开data.json
即可查看示例待办事项。
{
"key": "todo:1",
"value": {
"id": "1",
"name": "Deploy an amazing Serverless Cloud app",
"status": "complete",
"completed": "2021-07-01T12:00:00.000Z",
"createdAt": 1627316142196
},
"label1": "complete:2021-07-01T012:00:00.000Z"
},
测试
有测试。总有一天我会写一个测试,我保证。
静态资源
您可以从该文件夹中提供静态资源static
。该文件夹当前包含:
assets
图像文件夹index.html
服务主页styles.css
用于造型todos.js
对所有 React 代码进行测试,这样你就可以吓唬团队中的后端开发人员
修改 HTML 索引文件并部署到生产环境
更改<header>
中的index.html
。
<header>
<div>
<h1 class="text-center">
ajcwebdev serverless cloud
</h1>
<h3 class="grey text-center">
Seriously, there are so few servers you wouldn't believe it
</h3>
</div>
</header>
cloud deploy prod
使用或deploy prod
在交互式终端会话中部署到生产环境。
cloud deploy prod
该链接将自动粘贴到您的剪贴板,因为复制链接是新手的本能。
仪表板
既然是云,就必须有仪表盘,对吧?我还能怎样履行我的 ClickOps 职责?
服务
无服务器云允许您在团队组织内构建服务。
您可以根据不同的用例或应用程序创建任意数量的服务。
实例
每个实例都与服务中的所有其他实例完全独立,并存储自己的数据副本。
实例内的环境是相同的,因此您可以确保您的应用程序在所有实例中的行为完全相同。
指标
数字可以告诉你有关事物的信息。
概括
太酷了!什么都没发生,一切按预期运行,而且我在 10 秒内就部署好了应用程序。