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的魅力——你只管写业务逻辑,剩下的交给平台。
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之路的第一步。后面的章节里,我们会在这个基础上不断加东西——数据库、文件存储、消息队列……到时候你会发现,原来后端开发可以这么轻松。
下一章,咱们聊聊「事件驱动」这个核心概念。准备好了吗?