4. 第一个函数:创建Hello World函数、本地调用测试、云上部署与触发

好,咱们终于要动手写第一个函数了。

说实话,我每次带新人入门Serverless,都会让他们从Hello World开始。为什么?因为这一步能让你完整走通「开发→调试→部署→触发」的全流程。说白了,就是先跑通再说。

4.1 创建你的第一个函数

我个人习惯用阿里云函数计算(FC)来演示,但原理是通用的。你换成腾讯云、AWS Lambda都一样。

先创建一个项目目录:

mkdir hello-serverless
cd hello-serverless

然后初始化一个Node.js项目(我用Node.js举例,因为上手最快):

npm init -y

接下来,安装函数计算的本地开发工具。我推荐用 @serverless-devs/s,这玩意儿比官方CLI好用不少:

npm install -g @serverless-devs/s

嗯,这里要注意:如果你在Windows上装,可能会遇到权限问题。加个 sudo 或者用管理员模式跑就行。

然后创建一个 index.js 文件:

// index.js
exports.handler = function(event, context, callback) {
  const name = event.name || 'World';
  callback(null, {
    statusCode: 200,
    body: `Hello, ${name}!`
  });
};

这个函数接收一个 event 对象,从中取出 name 字段。如果没有传,就默认返回 "Hello, World!"。

小提示: 我在项目中遇到过不少新手把 callback 写成 callbak,结果函数一直超时。记住,回调函数的名字一定要拼对。

4.2 本地调用测试

写完了代码,别急着部署。先在本地跑一遍,看看能不能正常工作。

s 工具启动本地调试:

s local invoke

这时候工具会问你:要传什么事件进去?你可以直接输入一个JSON:

{"name": "Serverless"}

然后你会看到输出:

{
  "statusCode": 200,
  "body": "Hello, Serverless!"
}

完美!

如果你不传任何参数,默认会返回:

{
  "statusCode": 200,
  "body": "Hello, World!"
}

为什么会这样?因为代码里写了 const name = event.name || 'World';。这就是JavaScript的短路求值,很实用。

本地测试的好处:
  • 不用每次改代码都部署到云端
  • 调试信息直接打印在终端,方便排查
  • 节省云资源费用(虽然Hello World花不了几个钱)

4.3 云上部署

本地测通了,接下来就是部署到云端。

首先,你需要配置一下 s.yaml 文件。这个文件告诉工具:你的函数叫什么、运行环境是什么、要部署到哪个区域。

一个最简单的配置长这样:

# s.yaml
edition: 1.0.0
name: hello-app
services:
  hello-service:
    component: devsapp/fc
    props:
      region: cn-hangzhou
      service:
        name: hello-service
        description: '我的第一个Serverless服务'
      function:
        name: hello-function
        runtime: nodejs14
        handler: index.handler
        codeUri: ./

配置好之后,执行部署命令:

s deploy

工具会自动打包你的代码,上传到云端,然后创建函数。整个过程大概10-20秒。

部署成功后,你会看到类似这样的输出:

✔ Function [hello-function] deployed successfully.
  URL: https://xxx.cn-hangzhou.fc.aliyuncs.com/2016-08-15/proxy/hello-service/hello-function/
注意: 我曾经遇到过部署失败,原因是代码目录里有 node_modules 文件夹,导致上传包太大。建议在 .gitignore 里加上 node_modules,或者用 s deploy --skip-push 跳过不必要的文件。

4.4 触发函数

函数部署好了,怎么调用它?有三种常见方式:

触发方式 说明 适用场景
HTTP触发 通过URL直接访问 Web API、小程序后端
事件触发 由OSS、日志服务等触发 文件处理、数据同步
定时触发 按cron表达式定时执行 定时任务、数据清理

咱们先用HTTP触发试试。在浏览器里打开刚才部署返回的URL:

https://xxx.cn-hangzhou.fc.aliyuncs.com/2016-08-15/proxy/hello-service/hello-function/

你会看到:

{"statusCode":200,"body":"Hello, World!"}

如果想传参数,可以在URL后面加查询参数:

https://xxx.cn-hangzhou.fc.aliyuncs.com/2016-08-15/proxy/hello-service/hello-function/?name=Serverless

返回:

{"statusCode":200,"body":"Hello, Serverless!"}

你想想看,从写代码到线上可用,前后不到5分钟。这就是Serverless的魅力——你只管写业务逻辑,剩下的交给平台。

避坑指南: 我曾经在HTTP触发时遇到中文乱码问题。原因是函数返回的 body 没有设置 Content-Type。解决办法是在回调里加上 headers
callback(null, { statusCode: 200, headers: { 'Content-Type': 'text/plain; charset=utf-8' }, body: `你好, ${name}!` });

4.5 小结

这一章我们干了三件事:

  • 写了一个Hello World函数
  • 在本地用 s local invoke 测试通过
  • 部署到云端并用HTTP触发成功

嗯,看起来简单,但这是你Serverless之路的第一步。后面的章节里,我们会在这个基础上不断加东西——数据库、文件存储、消息队列……到时候你会发现,原来后端开发可以这么轻松。

下一章,咱们聊聊「事件驱动」这个核心概念。准备好了吗?