零基础入门Serverless:Hello World

949 阅读7分钟

来自Serverless,向世界说句你好。

背景知识

什么是Serverless

自2006年8月9日,Google首席执行官埃里克·施密特(Eric Schmidt)在搜索引擎大会(SESSanJose2006)首次提出"云计算"(Cloud Computing)的概念之后,云计算的发展可以用日新月异这个词来形容。那么究竟什么才是Serverless呢?

简单来说,Serverless可以说是一种架构,一种云计算发展的产物,至于具体说什么是Serverless,可能没有谁能给他一个明确的概念,如果非要说一个可以稍微容易理解一些的概念,那或许可以参考Martin Fowler在《Serverless Architectures》中对Serverless这样定义:Serverless=BaaS + FaaS。 image.png Serverless架构和传统的项目的区别

首先,我们以一个常见的Web服务为例: image.png 在这个图中,服务器中可能涉及路由规则、鉴权逻辑以及其他各类复杂的业务代码。同时,开发团队要付出很大的精力在这个服务器的运维上面,例如要时刻关注以下问题:

客户量突然增多时是否需要扩容服务器。 服务器上的脚本和业务代码等是否还在健康运行。 是否有黑客在不断地对服务器发起攻击。

当我们把这个思路切换到Serverless的逻辑之后,变成了这样: image.png 可以认为,当客户端和数据库未发生变化的前提下,服务器变化巨大。

之前需要开发团队维护的路由模块以及鉴权模块都将接入服务商提供的API网关系统以及鉴权系统,开发团队无须再维护这两部分的业务代码,只需要持续维护相关规则即可。

在这个结构下,业务代码也被拆分成了函数粒度,不同函数表示不同的功能。

我们已经看不到服务器的存在,是因为Serverless的目的是让使用者只关注自己的业务逻辑即可,所以一部分安全问题、资源调度问题(例如用户量暴增、如何实现自动扩容等)全都交给云厂商负责。

相对于传统项目而言,传统项目无论是否有用户访问,服务都在运行中,都是有成本支出,而Serverless而言,只有在用去发起请求时,函数才会被激活并且执行,并且会按量收费,相对来说可以在有流量的时候才有支持,没有流量的时候就没有支出,相对来说,成本会进一步降低。

通过以上分析和描述,不难看出Serverless架构相对于传统的开发模式的区别,也逐渐的发现了它的优势。但是问题来了,很多工作都交给了云厂商来做,那我们做什么呢? image.png 使用Serverless架构的优势

从上文中我们不难看出,相对于传统项目,Serverless具备的以下优势:

您无需采购和管理服务器等基础设施,运维成本低。 您只需专注业务逻辑的开发,使用函数计算支持的开发语言设计、优化、测试、审核以及上传自己的应用代码。 以事件驱动的方式触发应用响应用户请求。与阿里云对象存储OSS、API网关、日志服务和表格存储等服务无缝对接,帮助您快速构建应用。例如,通过OSS解决图片和视频的存储问题,当有新数据写入您的OSS资源时,自动触发函数处理数据。 提供日志查询、性能监控和报警等功能快速排查故障。 毫秒级别弹性伸缩,快速实现底层扩容以应对峰值压力。 按需付费,支持百毫秒级别收费。只需为实际使用的计算资源付费,适合有明显波峰波谷的用户访问场景。

总而言之,Serverless是在传统容器技术和服务网格上发展起来,更多指的是后端服务与函数服务的结合。对于开发者而言,能够将更多的精力关注在函数服务上,更侧重让使用者只关注自己的业务逻辑即可。

同时,Serverless也是云计算发展到一定阶段的必然产物。作为普惠科技,云计算发展的目标一定是绿色科技和大众科技的产品------而Serverless能够很好的诠释这些:最大程度利用资源、减少空闲资源浪费;同时降低学习成本和使用成本。

Serverless架构被称为是"真正实现了当初云计算的目标",这种说法虽然有些夸张,但是也从另一方面表现出了大家对Serverless架构的期盼和信心。自2012年被提出至今,Serverless架构也是经历了7年时间,正在逐渐的走向成熟。

开通并进入到阿里云Serverless产品

1.通过阿里云首页,找到"产品"->"弹性计算"->"Serverless"->"函数计算FC" image.png 2.点击进入函数计算FC的页面 image.png 3. 点击管理控制台按钮,并进行账号注册/登陆 image.png 4.针对首次使用的用户需要进行函数计算服务的开通,需要阅读协议,并且同意(点击1中的选择框),然后点击右下角的立即开通即可 5.进入控制台之后,如果右上角有“体验新版控制台”按钮,请点击该按钮,如果没有该按钮,可以跳过本步骤 image.png

创建服务和函数

1.选择左侧的服务及函数之后,可以先进行服务的创建 image.png 2. 按照页面提醒,进行服务名称设定,然后可以选择性的进行描述信息填写、日志服务和链路追踪功能开启,最后点击确定即可 image.png 3. 完成服务的创建之后,可以进行函数的创建 image.png 4. 需要我们天蝎函数名,选择一个自己熟悉的编程环境,以及设置一个内存规格,最后点击创建即可 image.png 5. 创建之后可以在代码框中,编写代码,例如默认的Hello World

# -*- coding: utf-8 -*-
import logging

# To enable the initializer feature (https://help.aliyun.com/document_detail/158208.html)
# please implement the initializer function as below:
# def initializer(context):
#   logger = logging.getLogger()
#   logger.info('initializing')

def handler(event, context):
  logger = logging.getLogger()
  logger.info('hello world')
  return 'hello world'

6.当代码有变更之后,系统会进行提醒,我们需要部署代码 image.png 7. 部署代码之后,我们可以进行测试函数 image.png 测试完成之后,可以看到最终的return将会作为返回结果进行展示,中间的logger.info将会作为日志输出进行展示

创建一个可以通过网址访问的Hello World

在刚刚的流程中,我们创建的是一个通过其他触发器触发函数的案例,此时我们可以创建一个通过HTTP请求触发函数的案例。

此时需要注意的几个点:

什么是触发器:help.aliyun.com/document_de… 什么是HTTP触发器:help.aliyun.com/document_de…

创建一个新的函数,并在创建函数的时候,选择“通过HTTP请求触发” image.png 2. 创建完成之后,与刚刚的代码不同的是,这个Http触发的代码包括了一些Http的信息

# -*- coding: utf-8 -*-

import logging
HELLO_WORLD = b'Hello world!\n'

# To enable the initializer feature (https://help.aliyun.com/document_detail/158208.html)
# please implement the initializer function as below:
# def initializer(context):
#    logger = logging.getLogger()  
#    logger.info('initializing')


def handler(environ, start_response):
    context = environ['fc.context']
    request_uri = environ['fc.request_uri']
    for k, v in environ.items():
      if k.startswith('HTTP_'):
        # process custom request headers
        pass
    # do something here
    status = '200 OK'
    response_headers = [('Content-type', 'text/plain')]
    start_response(status, response_headers)
    return [HELLO_WORLD]

关于不同语言的HTTP触发方法案例可以参考文档:help.aliyun.com/document_de…

在文档最下面有相对应的案例链接: image.png 3. 创建完成函数之后,我们可以进行触发器查看 image.png 4. 可以看到,这个函数下又一个HTTP触发器,并附带一个请求地址,我们可以通过POSTMAN等工具,对这个地址进行测试: image.png 额外说明:如果在浏览器中直接打开请求地址,将会以附件的方式下载响应。这是因为 Http 触发器会自动在响应头中添加 Content-Disposition: attachment 字段。开发者可以使用自定义域名避免该问题。自定义域名文档:help.aliyun.com/document_de…

至此我们完成了通过不同事件触发函数计算的Hello World案例

更多场景体验 至developer.aliyun.com/adc/labs/