从 Serverless 看云计算未来
Serverless 的出现,彻底地改变了云计算的面貌,将其发展推向了一个全新的方向。通过 Serverless 特有的无须管理底层服务器和应用运行环境的优势,程序员能够专注于编写程序本身而非底层基础架构的管理。这一无服务器的思路,彻底地颠覆了人们对于云计算的传统认知,为云计算未来的发展之路打开了更大的想象空间。在本文中,我们将从 Serverless 的角度来看一看云计算未来的可能性。
什么是 Serverless?
所谓 Serverless,指得是开发者写代码,无需关心服务器操作系统,运行环境,负载均衡等等问题,而这些都交给云服务商处理的一种云计算模式。开发者不再需要开发、运维、和扩展底层基础架构,大大降低了开发者的运维成本,同时也解放了开发者的生产力。目前,AWS Lambda 和 Azure Functions 都是 Serverless 的代表公司。
Serverless 的结构
要了解 Serverless,首先要理解其架构。Serverless 模式主要由以下三个组成部分构成:
- 事件触发器
事件触发器是 Serverless 的核心,它通过注册触发事件,并根据执行条件触发相应的函数。比如,AWS Lambda 中,事件可以是 S3 bucket 中的文件上传、API 网关的 HTTP 请求、SNS 的消息推送等。
- 代码执行器
每个 Serverless 函数都有自己的执行器,代码执行器会读取这个函数的内部代码,根据事件所传递的数据开始执行函数。
- 存储器
Serverless 函数需要一个存储器来保存和读取数据。这个存储器可以是对象存储(如 S3),也可以是内存集群(如 Redis 和 Memcached)等。
为什么 Serverless 会成为未来的一种趋势?
- Serverless 的成本较低
云计算的发展,使得开发者可以将应用程序迁移至在大型数据中心的云上运行。传统的云计算模式,开发者需要租用一定规格的服务器,并为这些服务器购买配套服务进行部署,这些费用对于开发者来说是不可承受的。而 Serverless 模式,能够大幅度降低应用程序运行的成本,同时也能够更好地管理软件的部署和运行。在 Serverless 模式下,你只需要支付你所用的计算时间、请求次数、存储量等费用。
- Serverless 的弹性伸缩性更高
传统的云计算模式,开发者需要设置一定规格的服务器,服务能力在负载高峰期无法扩展,可能会导致用户无法访问。而在 Serverless 模式下,服务器是自动分配的,无需开发者手动进行扩展,系统具备了弹性伸缩性,可以根据实际负载自动增加或减少服务器的数量。
- Serverless 更加适用于微服务
随着企业软件的复杂度逐渐增大,应用程序转向微服务架构也变得越来越普遍了。微服务架构的一个核心思想,是通过将应用程序拆分成较小的、独立的部分组件,以增强整个系统的灵活性、可维护性和可伸缩性。而 Serverless 模式,恰恰依赖于事件触发和微服务架构的原理非常类似,这使得 Serverless 更加适用于微服务架构。
- Serverless 更加安全可靠
Serverless 的架构具有良好的安全模式,使得应用程序可以更安全地运行。在 Serverless 模式下,开发者不需要担心服务升级和补丁更新的问题,也不需要关注底层基础架构的安全问题。因为这些都由云计算服务提供商管理。
Serverless 的使用示例
下面通过一个例子,来介绍一下 Serverless 的实际应用。在我们的例子中,我们将使用亚马逊 Lambda,以获取文件的角度来展示 Serverless 的优越性。Lambda 是 Serverless 计算服务的另一种选择,AWS Lambda 构建于亚马逊基础设施的顶级产品之上,可以通过创建函数并向这些函数添加事件触发器和处理程序来完成云计算。以下为代码示例:
- 定义事件
// www.javascriptcn.com code example
{
"Records": [
{
"eventVersion": "2.0",
"eventSource": "aws:s3",
"awsRegion": "us-west-2",
"eventTime": "2020-05-06T23:50:16.423Z",
"eventName": "ObjectCreated:Put",
"userIdentity": {
"principalId": "EXAMPLE"
},
"requestParameters": {
"sourceIPAddress": "127.0.0.1"
},
"responseElements": {
"x-amz-request-id": "EXAMPLE123456789",
"x-amz-id-2": "EXAMPLE123/5678abcdefghijklambdaisawesome/mnopqrstuvwxyzABCDEFGH"
},
"s3": {
"s3SchemaVersion": "1.0",
"configurationId": "EXAMPLEconfigID",
"bucket": {
"name": "mybucket",
"ownerIdentity": {
"principalId": "EXAMPLE"
},
"arn": "arn:aws:s3:::mybucket"
},
"object": {
"key": "test.jpg",
"size": 1024,
"eTag": "0123456789abcdef0123456789abcdef",
"versionId": "096fKKXTRTtl3on89fVO.nfljtsv6qko",
"sequencer": "0055AED6DCD90281E5"
}
}
}
]
}- 定义 Lambda 函数
// www.javascriptcn.com code example
import json
import boto3
client = boto3.client('rekognition')
def lambda_handler(event, context):
# get the image
key = event['Records'][0]['s3']['object']['key']
bucket = event['Records'][0]['s3']['bucket']['name']
response = client.detect_labels(
Image={
'S3Object': {
'Bucket': bucket,
'Name': key
}
},
MaxLabels=10,
MinConfidence=90
)
return {
'statusCode': 200,
'body': json.dumps(response)
}- 部署 Lambda 函数
在 AWS Lambda 中创建一个函数,上传代码和文件,设定触发器为 S3 存储桶中的文件上传事件。
- 测试 Lambda 函数
在 S3 存储桶中上传一个 JPG 图片,然后等待数秒钟,Lambda 函数将自动调用,你将在结果中看到图像的详细标签信息。
本文通过 Serverless 的例子,解释了 Serverless 的优点,同时也给出了 Serverless 的能力和特点。相信 Serverless 在未来的云计算中将会越来越流行,并为开发者提供更强大、更便捷的服务。您可能会发现,Serverless 很容易上手,而且拥有高质量的构建模块。为了最大化 Serverless 模式的效用,建议对您的架构进行设计和架构,以使这些服务在开发过程中的使用更加顺利。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/67d668aaa941bf7134c27e3d