跳转至

serverless框架解析

Serverless架构与Traditional架构

serverless 框架是当前比较活的架构,其以灵活快捷的开发生产著称,业界代码就是AWS Lambda。serverless架构一般是相较traditional架构而言的。两者的架构区别见下图:

serverless traditional

这里列出的是最简单的一个图,serverless架构相较传统架构的优势可以从以下两个方面来看:

  1. 开发速度:serverless开发更快,主要关注于代码本身,无需关注Lambda和后端速度库的性能,无论函数本身还是后端数据库都是自动弹性的;
  2. 成本:serverless因为是弹性的,收费只会根据实际使用的资源情况进行付费。

Serverless Framework

serverless traditional

因为虽然架构上实现了serverless化,不过云平台的服务还是有对应的学习配置成本。Serverless Framework 解决的就是让开发人员更聚焦开发本身,其将云平台上配置性的工作、CI/CD也在框架内能过命令的方式实现了。同时其在dashboard界面中也集成了监控与可观测性。

Serverless Framework ties it all together(官方给出的功能描述)

  • Single configuration file to describe all pieces together
  • Connect managed services and code
  • Share easily with team
  • Reliably redeploy as many times as needed
  • Build large scale applications that can serve millions of users

Serverless 的slogan 是 “Zero-Friction Serverless Apps on AWS Lambda” (AWS Lambda 上的零摩擦无服务器应用程序),所以从该处也不难看出,Serverless Framework 在一开始是围绕 AWS 云进行生态适配的,只不过因为其比较好用,后面其他云厂商也进行了适配和对接,其也就有了类似 Terraform provide 的理念。这部分可以参看:https://www.serverless.com/framework/docs/providers

从官方的文档上也不难看出,中美主流的云厂商都做了适配。不过从 https://www.serverless.com/examples 给出的示例也不难看出,其对AWS的适配仍然是最好的。

快速入门

创建项目

Serverless Framework 基于 Nodejs 进行开发,所以通过npm命令可以快速的安装 Serverless Framework 本身及使用的插件。

1
2
3
4
5
6
npm install -g serverless
# Create a new serverless project
serverless

# Move into the newly created directory
cd your-service-name

在输入 serverless 命令后(serverless命令也可以简写成 sls),其会引导式的让选择相应的内容。

serverless guide

云厂商对接

输入完成后,在部署前还需要云平台上进行授权对接,这部分可以参看 serverless Tutorial ,这时会跳到对应的云平台上,只需要简单的点击两下即可完成对接。

serverless provider

编辑Serverless.yml文件

该文件里会指定使用的云厂商及资源信息,类似如下:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
service: serverless-http-api-dynamodb

frameworkVersion: "3"

provider:
  name: aws
  region: us-east-1
  runtime: nodejs18.x
  lambdaHashingVersion: '20201221'
  environment:
    DYNAMODB_TABLE: ${self:service}-${sls:stage}
  httpApi:
    cors: true
  iam:
    role:
      statements:
        - Effect: Allow
          Action:
            - dynamodb:Query
            - dynamodb:Scan
            - dynamodb:GetItem
            - dynamodb:PutItem
            - dynamodb:UpdateItem
            - dynamodb:DeleteItem
          Resource: "arn:aws:dynamodb:${aws:region}:*:table/${self:provider.environment.DYNAMODB_TABLE}"

functions:
  create:
    handler: todos/create.create
    events:
      - httpApi:
          path: /todos
          method: post

  list:
    handler: todos/list.list
    events:
      - httpApi:
          path: /todos
          method: get

  get:
    handler: todos/get.get
    events:
      - httpApi:
          path: /todos/{id}
          method: get

  update:
    handler: todos/update.update
    events:
      - httpApi:
          path: /todos/{id}
          method: put

  delete:
    handler: todos/delete.delete
    events:
      - httpApi:
          path: /todos/{id}
          method: delete

resources:
  Resources:
    TodosDynamoDbTable:
      Type: 'AWS::DynamoDB::Table'
      DeletionPolicy: Retain
      Properties:
        AttributeDefinitions:
          -
            AttributeName: id
            AttributeType: S
        KeySchema:
          -
            AttributeName: id
            KeyType: HASH
        BillingMode: PAY_PER_REQUEST
        TableName: ${self:provider.environment.DYNAMODB_TABLE}

安装插件

官方和对接的厂商已开发了比较多的插件支持,可以通过一条指定完成安装,安装完成后可以直接和对应的云服务进行对接,比如在官方插件页面上检索 s3, 会发现一些常见的 S3对接的能力已实现,只需要简单的配置就可以和 Lambda 函数对接。

1
2
3
4
5
# 安装Aws的支持
npm install aws-sdk

# 安装Azure Functions插件支持
npm i --save serverless-azure-functions

部署与删除

上面的步骤都完成后,就是编写代码内容并向云上部署了,部署只需要一条指令即可。

1
2
3
4
5
6
7
8
# 全量部署
serverless deploy

# 指定阶段和region(如果Serverless.yml文件里未指定region)
serverless deploy --stage production --region eu-central-1

# 部署指定的函数,一般用在只更新了某个函数的代码,其他未更的情况,相当于增量更新,部署更快
serverless deploy function -f functionName

执行完 deploy指令会返回可以调用的URL地址,该地址实际上APIG对应的访问地址。

serverless-deploy-endpoint.png

部署完成后,还可以使用 invoke/logs 等指令进行调用和查看日志。同时也支持登录dashborad查看日志信息。

如果不想使用该函数应用了,也无需登录云平台,直接使用如下命令就可以完成云上资源删除:

1
serverless remove

收费模式

Serverless 平台针对单人开发者是免费的,不过其在监控、日志等可视化增强功能上是有限制的。收费主要针对团队成功数和增强功能的用量进行收费。

总结

Serverless Framework 确实简化了云平台上的配置操作,不过 AWS 的价格在所有云厂家中也是出名的贵,如果换用其他云,并不是简单的将代码中的 provider 修改下就完了,因为代码逻辑中如果涉及和其他云服务的对接,还需要更新这一部分的代码逻辑,因为比较每个云厂家的接口是有区别的。

捐赠本站(Donate)

weixin_pay
如您感觉文章有用,可扫码捐赠本站!(If the article useful, you can scan the QR code to donate))