一、背景
1.1 Serverless是什么:
无服务器计算是指开发者在构建和运行应用时无需管理服务器等基础设施,应用被解耦为细粒度的函数,函数是部署和运行的基本单位。用户只为实际使用的资源付费。这些代码完全由事件触发(event-trigger),平台根据请求自动平行调整服务资源,拥有近乎无限的扩容能力,空闲时则没有任何资源在运行。代码运行无状态,可以轻易实现快速迭代、极速部署。
1.2 Serverless的特点:
以函数为扩展单位,虚拟化运行时环境(Runtime)。是现有计算资源的最小单位,具有完全自动、一键部署、高度可扩展等特点。
1.3 Serverless的作用:
- 低成本
运营成本,Serverless将用户的服务器,数据库,中间件委托于BaaS/FaaS,用户将不再参与基础设施及软件的维护,尤其在大规模的集群运营上成本大幅度降低。
开发成本,对比IaaS或者PaaS平台的服务器或者操作系统,Serverless的架构中,用户操作的是服务化的组件比如存储服务,授权服务等,可以缩短开发周期,降低开发难度。
- 按需计费
Serverless/FaaS区别于IaaS/PaaS预先分配计算资源的计费方式,其计费方式通常是按请求次数及运行时间,一方面可以最大程度利用资源,另一方面真正的按需计费可以降低用户的资源成本。
- 弹性伸缩
Serverless架构一个显而易见的优点即“横向扩展是完全自动的、有弹性的、且由服务提供者所管理”。
- “绿色”计算
据统计,商业和企业数据中心的典型服务器仅提供5%~15%的平均最大处理能力的输出,本质上这是对社会资源的一种浪费。而在Serverless架构下,提供商将提供更细力度的计算能力最大限度满足实时需求,资源利用率将大幅度提升,可以认为相对IaaS与PaaS Serverless/FaaS是一种 “绿色” 计算。
- NoOps
运维的发展经历了人肉运维,自动化运维,DevOps,AiOps等,而Serverless带来一种新的运维模式,这种模式下用户需要管理的只有Code可以认为NoOps。
1.4 演进历史
云计算的发展从IaaS,PaaS,SaaS,到最新的BaaS,FasS,在这个趋势中serverless(去服务器化)
计算资源发展Physical->Virtualisation->Cloud Compute->Container->Server-less
1.5 各厂商产品
目前各大公有云厂商都上线了自己的serverless,如:
二、简单示例
2.1 示例背景
目前有客户有需求对数量众多的测试环境想通过非工作时间进行关机操作,每天早上工作时间提前进行开机,如此如果人工来操作重复周期性的操作显然非常不合适,但是共有云目前没有提供这种对服务器定时开关机操作的产品功能,只能利用其API来进行,但是需要一台具备公网能力的服务器来发起API调用请求,此时刚好利用Serverless小试牛刀,本次示例利用腾讯无服务器云函数(CFS)简单示例下Serverless的一小部分功能,来实现此需求。
2.2 创建函数
无服务器云函数入门可以参考官网文档:入门概述
- 选择地域创建函数服务
- 进行函数配置
填写函数名称,选择程序函数运行的环境,选择内存及函数运行的超时时间,最后可以在高级配置内,配置函数环境变量,在此我将腾讯云的ak配置在环境变量中以便后续调用。
注意:在配置函数中如果选择VPC,编写的函数是具有出公网调用的能力,对应的VPC需要具备此能力。
- 编写功能函数代码
在此我利用腾讯云的CVM的SDK进行了云服务器的停止与开机操作,代码的输入支持在线编程,以及本地zip上传和cos上传代码
** 注意**:如果为本地代码调用的二进制或可执行文件,需要打包一并上传。
完整启动代码(多个CVM可以写入event的json instance列表内)
# -*- coding: utf8 -*-
# _auth:kaliarch
from tencentcloud.common import credential
from tencentcloud.cvm.v20170312 import cvm_client, models
import os
import logging
# 腾讯云secretid
SecretId = os.getenv('secretid')
# 腾讯云secretkey
SecretKey = os.getenv('secretkey')
# 事件
def cmvstart_handler(event, context):
# 定义操作的CVM地域及实例ID
event = {
"region": "ap-shanghai",
"instanceids": ["ins-kqf9os9x"]
}
logger = logging.getLogger()
cred = credential.Credential(SecretId, SecretKey)
Region = event['region']
InstanceIds = event['instanceids']
cvmoper = cvm_client.CvmClient(cred, Region)
request = models.StartInstancesRequest()
request.InstanceIds = InstanceIds
logger.info('requests:%s' % request)
# 操作CVM启动
response = cvmoper.StartInstances(request)
result_content = response.to_json_string()
logger.info('result_content')
print(result_content)
return result_content
停止的函数与此一致,在此只是抛砖引玉,其他的重启,停止,已经对其他云产品的操作等也都可以利用此来完成。
- 进行在线函数功能测试
可以利用在线函数测试功能,对功能函数进行测试
注意:在线测试的数据格式必须为json格式,其传入为event变量中
- 创建触发方式
目前腾讯云支持图中的四种触发方式,在此示例中适用于定时任务进行触发
定时任务可以选择自定义配置,和Linux下的crond服务器配置一致。
注意:定时任务形式触发不会传入event变量,需要自己函数内部指定在创建函数配置时进行变量配置。
2.3 查看日志
函数返回值部分将显示运行结果,还将显示代码中 return 语句返回的函数执行结果。
运行信息部分将显示函数运行的时间、内存等信息。
日志部分将显示函数运行时生成的日志,包括用户代码中的打印语句、函数运行失败trace stack等,将会写入至日志模块。
2.4 官网示例
腾讯云官网为我们了解及如何使用CFS,提供了不同的触发条件示例及最佳实践,可以进行进一步了解:最佳实践
三、思考
- 在此只是最简单的试用了一下CFS,其更强大的功能及优势在云计算的潮流下后期会越显明显,适用场景众多,业务进行拆分,分工更加精细。截取官网的一张最常用的移动与WEB应用图,业务各模块分离,函数具有弹性伸缩,前端入口为各业务模块的API网关,配合CDB/COS完成总体架构。
- 无服务器云函数想要后期更快的发展,需要进行业务逻辑的精细梳理和各函数调用,其次需要云厂商多个性化定制服务,已经自己需要完善生态,最少无服务器云函数支持自家云上各产品。