云函数基本应用
云函数(Serverless Cloud Function)是腾讯云提供的无服务器(serverless)执行环境,帮助用户在没有购买和管理服务器时仍能运行代码。
用户只需要使用云平台支持的语言编写核心代码及设置代码运行的条件,代码即可在腾讯云基础设施上弹性、安全地运行,并可完全管理底层计算资源,包括服务器CPU、内存、网络、代码部署、弹性伸缩、负载均衡等服务。
1.服务端架构的演进
1.1 物理机时代(机房)
步骤:
购买主机
托管机房(备案)
链接电源网线
安装系统
部署运行环境
申请静态IP
部署繁琐,问题多(磁盘受损,停电...)
1.2 虚拟机时代
物理机分割成多台虚拟机提供给用户使用,硬件设备管理统一由云厂商负责,直接在云平台购买虚拟机
问题:用户增多,数据和图片过多,数据库性能瓶颈,磁盘耗尽、资源不足,服务器负载
处理:数据库迁移到云厂商提供的云服务器上,更稳定性能更好;图片存储迁移到对象存储上,无限扩容。服务器只处理请求,将计算和存储分离开,降低了系统负载。
虚拟机优点:不用关心底层硬件
存在问题:服务器集群管理(服务器运行环境配置、统一)
1.3 容器时代(主流服务器架构技术,docker)
在虚拟机技术的基础上把代码和环境打包到一起,与服务器配置分离,使代码和运行环境保持一致。在服务器部署容器,不再部署应用。
存在问题:容器过多时的管理
解决方法:容器编排技术(k8s)
||
问题:流量洪峰(服务器预估不到位宕机)-》 服务器扩充、大量编排工作 -》 平时大量服务器运行浪费成本
需要:只关心业务代码的实现,脱离服务器管理,不用再关注运行环境和服务器扩容,流量洪峰来临时自动调配更多服务器资源支撑,流量低谷时自动释放服务器资源节约成本。
解决方案:serverless,自动进行服务器资源管理
服务端发展(基础架构的抽象)
物理机 -> 虚拟机: 脱离硬件设备管理,将计算机拆分为相互隔离的虚拟机
虚拟机 -> 容器:摆脱运行环境和集群管理工作,将虚拟机运行环境抽象为容器
容器 -> serverless:不再关心运行环境和服务器资源调配
2.serverless概念
serverful:服务器的一切都需要人工进行干预
广义概念:服务端架构理念,开发者不用关心服务器,将服务器相关工作交给云平台,与服务器运维有关的所有工作都不再关心。
开发者只关注业务逻辑本身,所有与业务无关的基础设施都交由云平台负责,由云平台统一调度、管理、运维。
狭义概念:Serverless架构就是采用FaaS(函数即服务)和BaaS(后端即服务)服务来解决问题的一种设计。
Baas(backend as a service):(服务器和开发环境)由serverless对后端架构进行包揽,包括硬件维护、集群管理、运行环境搭建、缓存等等,由云平台做好封装,以接口方式提供服务。对开发者来说,只需要编写业务逻辑代码,不需要关心实现,baas作为一个黑盒,通过接口对黑盒进行取用。
-
Faas(function as a service):(运行逻辑代码)以函数方式运行代码,函数运行平台。选择编程语言编写函数。
对开发来说,faas即serverless,在faas中能体会到serverless全部特性:
无运维:faas函数运行时,开发者对底层函数无感知,faas负责服务器资源调度和运维
事件驱动:不持续运行,通过一定条件进行触发,集成触发器直接使用
按量付费:根据faas执行次数和消耗CPU进行付费
弹性收缩:根据函数运行需要资源量自动调配服务器资源,实时弹性伸缩
faas进行计算+baas进行存储,分开部署收费。应用存储被分离成独立云服务器,减少丢失风险;应用本身变为无状态,易于调度和扩缩容。
serverless的缺点
严重依赖云平台厂商:各云厂商实现接口的标准不同,同一套代码无法在不同serverless产品上运行,云平台迁移成本高
开发调试困难:serverless依赖云服务,本地难以搭建云服务环境,在本地开发调试复杂。serverless架构飞速发展,开发调试部署等工具不完善。
底层硬件不确定:baas对开发者来说是个黑盒,硬件资源不确定。当代码需要在特定CPU和GPU上运行时,云厂商未提供对底层硬件的可选项,底层硬件的类型和型号不可知。
(其它:运行机制、开发方式……)
3.云函数使用
云平台:腾讯云(初学者友好)
云开发CloudBase:包含整个使用时需要的所有服务,用户验证、数据库存储、缓存等(不使用服务器资源时免费)
1)登录腾讯云
2)选择serverless应用
3)选择函数服务
4)创建函数
用户帐号配额限制
内容 | 默认配额限制 |
---|---|
每个地域下的函数代码总体积 | 100GB |
每个地域下的总函数并发配额 | 128000MB(广州、上海、北京、成都、中国香港)64000MB(孟买、新加坡、东京、多伦多、硅谷、法兰克福、深圳金融、上海金融) |
每个地域下命名空间个数 | 5 |
每个命名空间下的总函数并发配额 | 可购买 函数套餐包进行配额调整 |
每个命名空间下函数个数 | 50 |
函数类型选择:
event 函数: 由指定格式的事件触发,例如定时触发事件、COS 触发事件等,事件结构详情见 触发器。
Web 函数:专注于优化 Web 服务场景,可以直接接受并处理 HTTP 请求,详情见 Web 函数。
执行方法:对应项目的主函数,是程序执行的起点,以文件名.执行方法名的形式进行设置,如
index.main_handler
。-
函数入参:指函数在被触发调用时所传递给函数的内容。
event: 触发函数执行的基本信息
-
云 API 触发函数执行: 在调用方和函数代码之间自定义一个 dict 类型的参数。调用方按照定义好的格式传入数据,函数代码按格式获取数据。
示例: 定义一个 dict 类型的数据结构
{"key":"XXX"}
,当调用方传入数据{"key":"abctest"}
时,函数代码可以通过event[key]
来获得值 abctest。 -
触发器触发函数执行: SCF 和 API 网关、对象存储 COS、消息队列 Ckafka 等多种云服务打通,可以通过给函数绑定对应的云服务触发器触发函数执行。触发器触发函数时,event 会以一种平台预定义的、不可更改的格式作为 event 参数传给函数,可以根据此格式编写代码并从 event 参数中获取信息。
示例: 通过对象存储 COS 触发函数时会将对象存储桶及文件的具体信息以JSON 格式 传递给 event 参数,在函数代码中通过解析 event 信息即可完成对触发事件的处理。
-
context: SCF 平台提供的入参,获取到运行环境及当前请求的相关信息。SCF 提供的入参 context
包含的字段及含义如下:
[图片上传失败...(image-ee09f3-1688375998501)]
-
函数返回:云函数执行完成后的返回值。
callback 是一个可选参数,在非异步函数中返回执行结果,参数包括一个 Error 和一个返回。
异步函数将忽略 callback 的返回,必须通过 return、throw exception 或者 promise 来处理返回或错误。
SCF 平台会获取到云函数执行完成后的返回值,并根据下表中不同的触发方式进行处理。
触发方式 | 处理方式 |
---|---|
同步触发 | 通过 API 网关、云 API 同步 invoke 触发函数的方式为同步触发。使用同步方式触发的函数在执行期间,SCF 平台不会返回触发结果。在函数执行完成后,SCF 平台会将函数返回值封装为 JSON 格式并返回给调用方。 |
异步触发 | 使用异步方式触发的云函数,SCF 平台接收触发事件后,会返回触发请求 ID 。在函数执行完成后,函数的返回值会封装为 JSON 格式并存储在日志中。用户可在函数执行完成后,通过返回的请求 ID 查询日志获取该异步触发函数的返回值。对于异步函数,可以使用 return 和 throw 来发送返回或错误。函数必须使用 async 关键字。在异步函数中,第三个参数 callback 没有定义。 |
js异步函数示例:
const httpRequest = url => {
const promise = new Promise(function(resolve, reject) {
https
.get(url, res => {
resolve(res.statusCode)
})
.on('error', e => {
reject(Error(e))
})
})
return promise
}
exports.main_handler = async function(event, context) {
try{
const result = await httpRequest(url)
// 在async函数中callback未定义
// callback(null, result)
return result
}catch(e) {
throw e
}
}
js同步函数示例:
exports.main_handler = function(event, context, callback) {
https.get(url, (res) => {
// 只能通过callback返回,return会被忽略
callback(null, res.statusCode)
}).on('error', (e) => {
callback(Error(e))
})
}
函数配置:
5)创建事件触发器。环境->访问服务->新建触发路径(关联资源:云函数)
4. 云函数实战
-
功能:实现一个定时提醒员工吃饭的企业微信机器人
代码:
/**************************************************
demo-show 说明
postData里的content需要修改为自己需要的
request里的url需要填写之前创建的机器人对应的WebHook
***************************************************/
const request = require('request')
exports.main_handler = async (event, context, callback) => {
return new Promise((resolve, reject) => {
const date = dateFormat({
time: +new Date(),
format: 'yyyymmdd'
})
const postData = {
"msgtype": "text",
"text": {
"content": "吃饭了\n",
"mentioned_list":["@all"]
}
}
request({
url: 'https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=',
method: 'POST',
headers: {
"content-type": "application/json",
},
body: JSON.stringify(postData)
}, function(err, res) {
if (!err && res.statusCode == 200) {
resolve('success')
} else {
reject(err)
}
});
})
}
触发器设置:
- 创建express项目
-
VSCode开发
下载Tencent Serverless Toolkit for VS Code,登录账户,通过该插件生成云函数,上传到云端
说明文档