- 一、什么是 Serverless
- 二、编写你的第一个 Serverless 应用
- 三、Serverless 应用是怎么运行的
- 四、如何提高应用开发调试和部署效率
- 五、serverless 应用
- 阿里云函数计算
- 腾讯云函数
- 使用 vercel 部署你的应用-推荐
- 六、场景案例
2.2 内容管理系统的实现
为了方便你学习,为你提供了完整代码(代码地址),你可以参考着学习。
$ git clone https://github.com/poetries/serverless-class $ cd 15/cms
整个代码目录结构如下:
. ├── package.json ├── src │ ├── config │ │ └── index.js │ ├── db │ │ └── client.js │ ├── function │ │ ├── article │ │ │ ├── create.js │ │ │ ├── delete.js │ │ │ ├── detail.js │ │ │ └── update.js │ │ └── user │ │ ├── login.js │ │ └── register.js │ └── middleware │ └── auth.js └── template.yml
其中,所有业务代码都放在 src 目录中:
config/index.js
是配置文件,里面包含身份凭证等配置信息;db/client.js
对表格存储的增删改查操作进行了封装,方便在函数中使用(将数据库的操作封装还有一个好处是,如果你之后想要迁移到其他数据库,只要修改 db/client.js 中的逻辑,不用修改业务代码);middleware
目录中是一些中间件,比如auth.js
,用于身份认证;functions
目录中就是所有函数,登录、注册、创建文章等,每个功能分别对应一个函数;template.yaml
是应用配置文件,包括函数和 API 网关的配置。
根据前面梳理的系统功能,我们需要实现以下几个 API:
用户注册 | POST /user/register |
---|---|
用户登录 | POST /user/login |
发布文章 | POST /article/create |
查询文章 | GET /article/detail/[article_id] |
更新文章 | POST /article/update |
删除文章 | PUT /article/delete/[article_id] |
每个 API 对应一个具体的函数,每个函数也都有一个与之对应的 API 网关触发器。由于这些函数属于同一个应用,所以我们可以通过一个 template.yaml 来定义所有函数。同时也可以在 template.yaml 中定义函数的 API 网关触发器,这样部署函数时,就会自动创建 API 网关。
内容管理系统的 template.yaml
格式如下:
ROSTemplateFormatVersion: '2015-09-01' Transform: 'Aliyun::Serverless-2018-04-03' Resources: # 函数服务,该服务中的函数都是内容管理系统的函数 serverless-cms: Type: 'Aliyun::Serverless::Service' Properties: Description: 'Serverless 内容管理系统' # 函数名称 [functionName]: Type: 'Aliyun::Serverless::Function' Properties: # 函数路径 Handler: <functionPath>.handler Runtime: nodejs12 CodeUri: './' # API 网关分组,分钟中的所有 API 都是内容管理系统的 API ServerlessCMSGroup: Type: 'Aliyun::Serverless::Api' Properties: StageName: RELEASE DefinitionBody: <Path>: # 请求的 path post: # 请求的 method x-aliyun-apigateway-api-name: user_register # API 名称 x-aliyun-apigateway-fc: # 当请求该 API 时,要触发的函数, arn: acs:fc:::services/${serverless-cms.Arn}/functions/${<functionName>.Arn}/ timeout: 3000
template.yaml 主要分为两部分: 函数定义和 API 网关定义,每个函数都有一个与之对应的 API 网关。我们用 serverless-cms 服务来表示内容管理系统这个应用,服务内的所有函数都是内容管理系统的函数。同理,ServerlessCMSGroup 这个 API 网关分组中的所有 API 都是内容管理系统的 API。
完整的 template.yaml
配置如下:
ROSTemplateFormatVersion: '2015-09-01' Transform: 'Aliyun::Serverless-2018-04-03' Resources: # 函数服务 serverless-cms: Type: 'Aliyun::Serverless::Service' Properties: Description: 'Serverless 内容管理系统' user-register: Type: 'Aliyun::Serverless::Function' Properties: Handler: src/function/user/register.handler Runtime: nodejs12 CodeUri: './' user-login: Type: 'Aliyun::Serverless::Function' Properties: Handler: src/function/user/login.handler Runtime: nodejs12 CodeUri: './' article-create: Type: 'Aliyun::Serverless::Function' Properties: Handler: src/function/article/create.handler Runtime: nodejs12 CodeUri: './' article-detail: Type: 'Aliyun::Serverless::Function' Properties: Handler: src/function/article/detail.handler Runtime: nodejs12 CodeUri: './' article-update: Type: 'Aliyun::Serverless::Function' Properties: Handler: src/function/article/update.handler Runtime: nodejs12 CodeUri: './' article-delete: Type: 'Aliyun::Serverless::Function' Properties: Handler: src/function/article/delete.handler Runtime: nodejs12 CodeUri: './' # API 网关分组 ServerlessCMSGroup: Type: 'Aliyun::Serverless::Api' Properties: StageName: RELEASE DefinitionBody: '/user/register': # 请求的 path post: # 请求的 method x-aliyun-apigateway-api-name: user_register # API 名称 x-aliyun-apigateway-fc: # 当请求该 API 时,要触发的函数, arn: acs:fc:::services/${serverless-cms.Arn}/functions/${user-register.Arn}/ timeout: 3000 '/user/login': post: x-aliyun-apigateway-api-name: user_login x-aliyun-apigateway-fc: arn: acs:fc:::services/${serverless-cms.Arn}/functions/${user-login.Arn}/ timeout: 3000 '/article/create': post: x-aliyun-apigateway-api-name: article_create x-aliyun-apigateway-fc: arn: acs:fc:::services/${serverless-cms.Arn}/functions/${article-create.Arn}/ timeout: 3000 '/article/detail/[article_id]': GET: x-aliyun-apigateway-api-name: article_detail x-aliyun-apigateway-request-parameters: - apiParameterName: 'article_id' location: 'Path' parameterType: 'String' required: 'REQUIRED' x-aliyun-apigateway-fc: arn: acs:fc:::services/${serverless-cms.Arn}/functions/${article-detail.Arn}/ timeout: 3000 '/article/update/[article_id]': PUT: x-aliyun-apigateway-api-name: article_update x-aliyun-apigateway-request-parameters: - apiParameterName: 'article_id' location: 'Path' parameterType: 'String' required: 'REQUIRED' x-aliyun-apigateway-fc: arn: acs:fc:::services/${serverless-cms.Arn}/functions/${article-update.Arn}/ timeout: 3000 '/article/delete/[article_id]': DELETE: x-aliyun-apigateway-api-name: article_update x-aliyun-apigateway-request-parameters: - apiParameterName: 'article_id' location: 'Path' parameterType: 'String' required: 'REQUIRED' x-aliyun-apigateway-fc: arn: acs:fc:::services/${serverless-cms.Arn}/functions/${article-delete.Arn}/ timeout: 3000
在这份配置中,需要注意两个地方:
函数的 Handler 配置,Handler 可以写函数路径,比如 src/function/user/register.handler
表示 src/function/user/目录中的 register.js 文件中的 handler 方法
;
API 网关配置中的 /article/detail/[article_id]Path
,这种带参数的 PATH,必须使用 x-aliyun-apigateway-request-parameters
指定 Path 参数。
接下来,我们就来实现内容管理系统的各个 API,也就是 template.yaml 中定义的各个函数。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论