Serverless初探

Serverless概念介绍

Server-服务,less-少,Serverless其实是一种开发者只需关注如何更好提供服务,而无需关心服务器的架构思想。传统应用缺点:服务器利用率低(应用常年cpu利用率<10%)、DevOps成本高(Docker、进程、限流、日志等前端维护乏力)

从发展视角看Serverless

  1. 物理机时代:单机版的单体架构,数据库、应用、Nginx 等服务全都在一台你自己管理的服务器上。最大问题就是需要关心网络,关心主机,关心它的虚拟化,关心操作系统和中间件,关心应用运行时和node版本,关心数据存储位置和后期运维成本。
  2. 虚拟机时代 :不需要关注物理机,把一台物理机分割成多台虚拟机提供给多用户使用,充分利用硬件资源,而且创建速度和弹性也远超物理机。这中间很多云厂商也提供了IaaSPaaS服务。但IaaS只是也需要关心它的运行时、成本、应用、数据。而PaaS类似提供应用引擎,只需提交代码即可运行,但还是要关心成本、应用、数据,而且不是按量付费,而是按租用时间。
  3. 容器技术时代:不需要关心运行环境,把代码和运行环境打包在一起,这样代码就可以在任何地方运行。但容器多了如何管理成了问题,虽出现Kubernetes容器编排技术可实现自动弹性伸缩,但支撑不了双十一这种需秒级弹性要求。
  4. Serverless 时代:构建和运行不需要服务器管理的一种概念,相当于写一个云函数,部署后,调用就收费,不调用就不收费,即按流量计费。

IaaS、PaaS、SaaS是什么?

IaaS PaaS SaaS
Infrasturcture as a Service Platform-as-a-Service Software-as-a-Service
基础设施即服务 平台即服务 软件即服务
IaaS公司提供场外服务器、存储和网络硬件等 PaaS公司提供应用程序开发环境或部分应用 SaaS公司提供完整可食用应用程序

FaaS和BaaS是什么?

FaaS是函数即服务,应用层面的对外接口,而BaaS则是后端即服务,更多的是业务系统相关的服务。 写一个函数提供出去,并通过回调结果返回,就可以实现一次Faas调用,调用完后就会显示Hello Serverless exports.handler = (event, context, callback) => { callback(null, 'Hello Serverless'); } 整体架构就是会有不同数据源,不同数据源都可连接到FaaS后端,FaaS会根据当前请求量去缩扩容,并且决定启用多少容器,去算最终成本。

Serverless特性

  • Hostless:不绑定具体主机,跑在云厂商服务器任何一台都可以
  • Elastic:弹性,遇到大流量可快速扩容
  • Stateless:无状态,因为函数随时可能被启动,随时可能被销毁
  • Event-driven:事件驱动,如上传文件就是上传事件,请求服务器就是请求事件,不同事件对应不同函数,不同函数实现不同功能
  • Lego Blocks:乐高式组合
  • High Availability:高可用,不会因流量洪峰导致额外故障
  • Usage-based Cost:按量付费,而不是传统的按时间付费

Serverless案例

  • Web应用:当用户访问cdn内容分发网络,cdn会把事件派发给函数计算,函数计算可连通后台服务,可以去表格存储里拉数据,去文件存储里拉文件,去日志函数里打日志,然后返回计算结果,最后给用户返回一个站点或一些数据。
  • 视频转码:上传mp4可能需要转成mkv等各种格式,用户上传视频到对象存储,对象存储此时派发一个事件去触发函数,即文件上传后函数计算就会收到一次调用,从而进行相关操作,包括调用整个函数工作流,即调用更多函数去执行转码任务,转码完成后这些函数又会被回收掉,并把转码后文件上传到对象存储。

Serverless落地

开发 Serverless 应用

  • Serverless应用开发流程

    1. 选择一个 Serverless FaaS 平台,如 阿里云函数计算

    2. 开发完的函数代码部署到 FaaS 平台

    3. 为函数配置 HTTP 触发器

    • 下面结合在阿里云函数计算平台相关操作配图进行详细说明
      1. 进入函数计算控制台,新建一个函数

      2. 函数创建成功后,就会进入到代码编辑页面,在编辑器中写入代码

      3. 写完代码后,你就可以在"触发器"标签下看到函数计算为你默认创建的 API Endpoint,用该 API Endpoint 对函数进行测试。接口也按照预期返回了status code: 200。

  • 到目前为止,这个应用很简单(只有一个函数),而实际情况绝大部分应用都是由多个函数组成的,应用部署时需要将所有函数一同部署,并且函数运行依赖 FaaS 环境,这就导致函数代码不能直接在本地运行。要解决这些问题,你就需要一套完整的开发、调试和部署 Serverless 的解决方案,于是出现了 Serverless 开发框架

现在主流 Serverless 开发框架 Serverless Framework/Serverless Cloud Framework

目前最完善的 Serverless 开发框架之一。它不仅实现了前面提到的应用开发、调试、部署等基础功能,还实现了多个 Serverless 平台的支持。

框架使用讲解

  • 安装 Serverless Framework 是使用 Node.js 开发的,所以你可以使用 npm 直接来安装它
ruby 复制代码
$ npm install -g serverless
$ serverless --version
  • 账号设置
css 复制代码
$ serverless config credentials --provider aws --key key --secret secret
--provider 具体的 Serverless 平台
--key AWS 账号的 aws_access_key_id
--secret AWS 账号的 aws_secret_access_key
  • 应用配置

    • 初始化一个应用
shell 复制代码
$ serverless create --template svl-nodejs
$ ls
index.js    serverless.yml
  • 通过 YAML 配置文件来定义应用和函数
yaml 复制代码
# serverless.yaml
# 应用名称
service: myservice
frameworkVersion: '2'
provider:
  name: aws
  runtime: nodejs12.x # 函数运行环境
# 函数列表
functions:
  # 函数1
  index:
    handler: index.handler # 函数入口
    events: # 函数触发器,一个函数可能有多个触发器
      - http
  • 应用开发
javascript 复制代码
// index.js
exports.handler = (event, context, callback) => {
    // 从 event 中获取 URL query 参数
    const { name } = event.queryStringParameters;
    // 定义 HTTP Response
    const response = {
        statusCode: 200,
        headers: {
            "Content-Type": "application/json"
        },
        body: JSON.stringify({ message: `Hello ${name}!`} ),
    };
    callback(null, response);
};
  • 应用调试 调试函数也很简单,直接通过 invoke 命令
shell 复制代码
# 远程调试
$ serverless invoke --function hello

# 本地调试
$ serverless invoke local --function hello
  • 应用部署 使用 deploy 命令来部署应用,将函数部署之前,serverless 会先在本地将代码打包,最终代码是一个压缩包,路径为 .serverles/[serviceName].zip 。
lua 复制代码
$ serverless deploy
Serverless: Packaging service...

$ tree
  |-- .serverless
  |-- myservice.zip
  |-- handler.js
  |-- serverless.yaml
相关推荐
Dylanioucn1 小时前
【分布式微服务云原生】掌握 Redis Cluster架构解析、动态扩展原理以及哈希槽分片算法
算法·云原生·架构
飞酱不会电脑3 小时前
云计算第四阶段 CLOUD2周目 01-03
云原生·容器·kubernetes
程序那点事儿5 小时前
k8s 之安装busybox
云原生·容器·kubernetes
是芽芽哩!6 小时前
【Kubernetes】常见面试题汇总(五十八)
云原生·容器·kubernetes
tangdou36909865518 小时前
1分钟搞懂K8S中的NodeSelector
云原生·容器·kubernetes
Lansonli19 小时前
云原生(四十一) | 阿里云ECS服务器介绍
服务器·阿里云·云原生
Dylanioucn20 小时前
【分布式微服务云原生】掌握分布式缓存:Redis与Memcached的深入解析与实战指南
分布式·缓存·云原生
later_rql21 小时前
k8s-集群部署1
云原生·容器·kubernetes
大G哥1 天前
记一次K8S 环境应用nginx stable-alpine 解析内部域名失败排查思路
运维·nginx·云原生·容器·kubernetes
feng_xiaoshi1 天前
【云原生】云原生架构的反模式
云原生·架构