Author:心谭

From:【Serverless】设计实现SAM--无服务器应用模型

Des: 专注算法与 web 开发的技术博客

什么是SAM?

sam全称是:Serverless Application Model,也就是无服务器应用模型。

它使用yaml语法来描述一个应用程序,服务商会对.yml后缀的sam文件进行解析,并按照文件描述部署相关服务。

应用场景

SAM的概念最初由AWS提出,用来描述程序所需要的Lambda function、Cloud DB等云端资源。

腾讯云云开发的扩展能力中,也使用SAM来描述扩展能力所需要的云开发资源,包括云函数、存储、数据库,甚至其他的云能力,例如短信发送。短信验证码登录 本身就是扩展,用到了腾讯云的短信能力。

再发挥一下,sam可以用来描述简单的UI视图,尤其适合表单的应用场景,如下所示:

实现简易的SAM

定义SAM

因为sam是yaml语法文件,所以需要解析yaml语法,使用yaml.js

举个例子,某个程序需要使用到云函数,并且需要创建两个数据表,SAM文件如下:

ApplicationName: 测试程序

# 云函数资源
Function:
# 运行环境
Container: nodejs 8.9
# 超时时间(秒)
Timeout: 60
Corn: # 云数据库资源
Database:
# 需要创建的数据集合
Collections:
-
CollectionName: 'ext-collection-a'
-
CollectionName: 'ext-collection-b'

数据校验

由于前端输入的数据不可信,后端需要对传入的SAM进行校验。

随着依赖的资源字段增加,单纯使用 if-else 的逻辑判断,会让代码变得难以维护,可读性非常差。

通常有2种数据校验的思路:

  • 借助 joi.js,在代码中增加校验逻辑
  • 使用 ajv.js,分离Schema和代码逻辑

第2种思路耦合度更低,并且规则的改动和维护,不涉及代码改动,产品和运营同学也可以来维护规则

按照schema的ajv语法,以前面的SAM文件为例,schema 的内容如下:

{
"type": "object",
"properties": {
"ApplicationName": {
"type": "string"
},
"Function": {
"type": "object",
"required": ["Container", "Timeout"],
"properties": {
"Container": {
"type": "string"
},
"Timeout": {
"type": "number"
},
"Corn": {
"type": ["string", "null"]
}
}
},
"Database": {
"type": "object",
"Collections": {
"type": "array",
"items": {
"properties": {
"CollectionName": {
"type": "string"
}
}
}
}
}
}
}

封装ajv的验证逻辑:

const Ajv = require('ajv')
/**
* 验证obj是否符合 Schema 定义
* @param {object} obj
* @param {string} schemaJson
* @return {boolean}
*/
function validateSchema(obj, schemaFilePath) {
const schemaJson = require(schemaFilePath) const ajv = new Ajv()
const validate = ajv.compile(schemaJson)
const valid = validate(obj)
if (!valid) {
console.log('>>> 错误字段信息:', validate.errors)
}
return valid
}

变量注入

有些时候,某些变量是动态的。例如,用户信息可能在运行过程中被注入到上下文,数据集合名称需要前端用户表单传入。

举个例子,前面创建的两个数据集合的名称由前端表单传入,对应字段是:collectionNameAcollectionNameB

# 云数据库资源
Database:
# 需要创建的数据集合
Collections:
-
CollectionName: '${env.collectionNameA}'
-
CollectionName: '${env.collectionNameB}'

整个流程总结:

  • 服务端解析预设的SAM配置
  • 识别${}特殊字符串,替换变量
  • 验证是否符合Schema定义的规则

参考链接

设计实现SAM--无服务器应用模型的更多相关文章

  1. 由浅入深SCF无服务器云函数实践

    欢迎大家前往云+社区,获取更多腾讯海量技术实践干货哦~ 作者:陈杰,腾讯云架构平台部技术专家 近年来,互联网服务从一开始的物理服务器托管,虚拟机,容器,发展到现在的云函数,逐步无服务器化,如下表所示. ...

  2. 无服务器架构(Faas/Serverless)

    摘要无服务器架构(Faas/Serverless),是软件架构领域的热门话题. AWS,Google Cloud和Azure - 在无服务器上投入了大量资金,已经在看到了大量专门针对Faas/Serv ...

  3. 使用腾讯云无服务器云函数(SCF)分析天气数据

    欢迎大家前往云+社区,获取更多腾讯海量技术实践干货哦~ 作者:李想 无服务器云函数(SCF)是腾讯云提供的Serverless执行环境,也是国内首款FaaS(Function as a Service ...

  4. 什么是Docker—无服务器计算服务

    什么是Docker https://mp.weixin.qq.com/s?__biz=MzU0Mzk1OTU2Mg==&mid=2247483881&idx=1&sn=aa27 ...

  5. 下一代无服务器的发展形态: Serverless2.0

    6 月 25 日,在上海召开的 KubeCon 2019 大会上,腾讯云重磅发布了下一代无服务器的发展形态:Serverless2.0.本文将以 Serverless 的概念.发展.形态.应用以及技术 ...

  6. Chromium的无锁线程模型C++代码示例

    引言 作者:程序员bingo,主要关注客户端架构设计.性能优化.崩溃处理,有多年的Chromium浏览器开发经验. 多线程一直是软件开发中最容易出问题的环节,很多的崩溃.卡死问题都与多线程有关.在常用 ...

  7. Serverless无服务器架构详解

    本文对Serverless架构的基础概念.具体产品.应用场景.工作原理进行详细解析. 基础概念 Serverless: 无服务器架构,即在无需管理服务器等底层资源的情况下完成应用的开发和运行,是云原生 ...

  8. 用花生壳实现内网映射,决解无域名、无公网IP、无服务器空间问题

    无域名.无公网IP.无服务器空间用花生壳提供的免费内网映射吧.你的PC就是服务器,花生壳提供的自定义二级域名轻松访问你的个人网站. 1.首先你得注册哦,然后申请免费的域名(2个) 2.设置路由器,下面 ...

  9. Linux 下 简单客户端服务器通讯模型(TCP)

    原文:Linux 下 简单客户端服务器通讯模型(TCP) 服务器端:server.c #include<stdio.h> #include<stdlib.h> #include ...

随机推荐

  1. Python-01矩阵、数组和列表等的总结

    python的基础知识总结 使用到了numpy库,所以第一步需要 import numpy as np 1.创建矩阵 1.1一般矩阵的创建 创建一个二维的矩阵,并使用ndim.shape.size分别 ...

  2. MYSQL 之 JDBC(八):增删改查(六)ReflectionUtils

    这里在网上找了一份ReflectionUtils package com.litian.jdbc; /** * @author: Li Tian * @contact: litian_cup@163. ...

  3. java 数据结构(三):java常用类 三 日期时间API

    JDK 8之前日期时间API 1.获取系统当前时间:System类中的currentTimeMillis()long time = System.currentTimeMillis();//返回当前时 ...

  4. java 基础(二) 搭建Java编译环境(linux系统)

    jdk安装配置 首先下载JDK和JRE,这里你的需要看看你的Linux系统是多少位的,比如我的是64位的:下载JDK并指定到Download目录,JRE同样操作:解压并且配置环境: tar -zxvf ...

  5. 数据规整:连接、联合与重塑知识图谱-《利用Python进行数据分析》

    所有内容整理自<利用Python进行数据分析>,使用MindMaster Pro 7.3制作,emmx格式,源文件已经上传Github,需要的同学转左上角自行下载或者右击保存图片. 其他章 ...

  6. Ethical Hacking - Web Penetration Testing(1)

    How to hack a website? An application installed on a computer. ->web application pen-testing A co ...

  7. 一位Google高管审查了20,000+简历,他发现了这5个致命的错误

    工作与生活的平衡 下班划水摸鱼时间,我比较喜欢浏览一下各类新闻网页,比如说ins,这不,我就在ins上看到了这样的一篇文章,内容很简单,就是简历,但是就是这样一份简历,却让这位Google高管震惊不已 ...

  8. 【Java面试】- 并发容器篇

    JDK 提供的并发容器 ConcurrentHashMap: 线程安全的 HashMap CopyOnWriteArrayList: 线程安全的 List,在读多写少的场合性能非常好,远远好于 Vec ...

  9. Redis(二)Jedis操作Redis

    如果测试连接的时候,报下面这个异常,可以参考下面的博客进行处理: Exception in thread "main" redis.clients.jedis.exceptions ...

  10. Mybatis(二)简化Mybatis实现数据库操作

    要操作的数据库: 一.与数据库对应的bean类 public class User { private String username; private String sex; private Str ...