初探无服务器云

2025-06-08

初探无服务器云

大纲

该项目的所有代码都可以在我的 GitHub 上的First Look monorepo中找到。

介绍

Serverless Cloud是Serverless, Inc.推出的全新无服务器应用平台。与该公司的初始产品Serverless Framework不同,它不会将您的应用程序直接部署到 AWS。相反,您的应用程序会立即部署到云端的新托管服务上,并运行在带有仪表板和实时日志的全新托管服务上。

设置

安装 Cloud CLI

@serverless/cloud安装npm

npm i -g @serverless/cloud
Enter fullscreen mode Exit fullscreen mode

初始化服务

在本地机器上为您的服务代码创建一个空白文件夹,并使用cloud命令初始化您的无服务器云服务。

mkdir ajcwebdev-serverless-cloud
cd ajcwebdev-serverless-cloud
cloud
Enter fullscreen mode Exit fullscreen mode

您的浏览器将自动打开,并通过 CLI 登录,或在终端中提供登录链接。连接后,您将收到一个激活码,请在出现提示时输入。

部署到暂存环境

为您的服务命名并deploy dev在交互式终端中部署它。

deploy dev
Enter fullscreen mode Exit fullscreen mode

cloud deploy dev如果您想从 repo 克隆其中一个项目并立即部署它,您也可以使用它。

cloud deploy dev
Enter fullscreen mode Exit fullscreen mode

您将获得一个带有示例待办事项应用程序的已部署端点。

01-todo-app-启动模板

添加一些待办事项。

02-待办事项

@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"
  }
}
Enter fullscreen mode Exit fullscreen mode

索引条目文件

@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) => {...}
Enter fullscreen mode Exit fullscreen mode
  • 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
    )
  }
}
Enter fullscreen mode Exit fullscreen mode

获取待办事项

该函数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
  })
})
Enter fullscreen mode Exit fullscreen mode

将更新发布到 Todo

此函数接受body请求的 并将其设置为databody可以包括duedate。它还包括idcreatedAt日期,并且status可以是completeincomplete。设置待办事项后,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
  })
})
Enter fullscreen mode Exit fullscreen mode

如果三元汤没有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
  })
})
Enter fullscreen mode Exit fullscreen mode

自定义错误处理程序中间件

此函数提供错误处理的中间件。错误也会在开发模式下实时传输到您的终端。

// 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)
})
Enter fullscreen mode Exit fullscreen mode

每小时检查逾期待办事项

有时您可能希望按计划运行代码,例如,当项目逾期时发送警报。此函数会查找逾期的项目,循环遍历逾期的项目,并在必要时发送警报。

// 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!!!`
    )
  }
})
Enter fullscreen mode Exit fullscreen mode

示例待办事项

打开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"
},
Enter fullscreen mode Exit fullscreen mode

测试

有测试。总有一天我会写一个测试,我保证。

静态资源

您可以从该文件夹中提供静态资源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>
Enter fullscreen mode Exit fullscreen mode

cloud deploy prod使用或deploy prod在交互式终端会话中部署到生产环境。

cloud deploy prod
Enter fullscreen mode Exit fullscreen mode

链接将自动粘贴到您的剪贴板,因为复制链接是新手的本能。

03-todo-模板-编辑

仪表板

既然是云,就必须有仪表盘,对吧?我还能怎样履行我的 ClickOps 职责?

服务

无服务器云允许您在团队组织内构建服务。

04-服务

您可以根据不同的用例或应用程序创建任意数量的服务。

实例

每个实例都与服务中的所有其他实例完全独立,并存储自己的数据副本。

05-实例

实例内的环境是相同的,因此您可以确保您的应用程序在所有实例中的行为完全相同。

指标

数字可以告诉你有关事物的信息。

06-开发阶段指标

概括

太酷了!什么都没发生,一切按预期运行,而且我在 10 秒内就部署好了应用程序。

资源

鏂囩珷鏉ユ簮锛�https://dev.to/ajcwebdev/a-first-look-at-serverless-cloud-3e18
PREV
科技新人,你好!试试微软这款强大的工具,轻松在 Windows 操作系统上使用 Linux
NEXT
初探 create-t3-app