首页 阿里云动态正文

阿里云函数计算- 调研

云返利网 阿里云动态 2020-08-21 17:14:20 10 0 阿里云返利


前言

本文以一个Nodejs前端开发者角度出发,体验了函数计算开发生态流程与功能,以及阅读了官方生态文档和视频后的总结梳理。希望对想快速建立阿里云函数计算全局观 的小伙伴有所帮助。

官方产品主页:
官方文档:
控制台:

整体

利用 (控制台可视化界面、CLI工具) 通过模板快速生成规范化的工程、函数
利用 开发者生态工具(Vscode插件、Fun、Fcli、WebIDE、SDK、OpenAPI)来开发、测试、上线
利用 (控制台可视化界面),进行高级配置:超时时间、并发度、内存大小、自定义域名、灰度版本管理、预留资源

主要概念

区域

region这个概念阿里云上资源都涉及到,即你购买的服务部署的集群地域。不同产品支持的集群region可能有些不同,不同region他们有时候会有一定的服务访问网络限制、域名备案要求等。我这里选择比如选择 华东1(杭州)

服务

函数是挂载在服务下
一个大型应用拆成多个服务,每个服务是一个业务工程,一个服务工程下有多个函数。
函数计算,以函数为单位管理开发,通过配置将流量路由到对应服务对应函数下

Path 服务名 函数名
/* s2 f2
/login s3 f3
/login/a s4 s4
/login/* s5 f5

函数

作为业务逻辑执行处理的入口,有两类需要区别

  • 普通函数,由触发器触发
// event 触发器调用传递的事件数据
// context 执行上下文相关配置,如服务配置、函数配置
// callback 遵循nodejs异步处理标准,第一个参数异常
exports.handler = function(event, context, callback) {
  callback(null, 'hello world');
};
  • HTTP函数,有http触发器 触发的函数,其入口参数比较特殊,但也是我们最常用的
// req 阿里云函数计算规范,请求request结构体
// res 返回response 结构体
// context 同普通函数接口的 context 接口相同
 exports.handler = function (req, res, context) {
   res.send('hello world')
 }
  • 初始化入口函数,这是一个特殊的入口函数,为什么有时需要这么个函数:比如创建mongo数据库连接,可以在这个初始化函数中启动,不需要每个请求进来才进行检查,创建连接,加快函数冷启动时间,也更好管理代码
// context 同普通函数接口的 context 接口相同
exports.initializer = function(context, callback) {
  callback(null, '');
};

触发器

在事件驱动的计算模型中,函数基于事件触发执行。
常见的触发器:

  • 定时触发器
  • OSS事件触发器(文件存储
  • CDN 回源事件触发器
  • API 网关触发器
  • 常用的HTTP 触发器

故创建的普通函数,需要配置对应的触发器,通过触发器事件来触发函数的执行。
这里因为触发事件后,函数执行有两种情况

  • 函数同步调用:事件被函数处理后直接将结果返回。如:http触发器、使用控制台调用
  • 函数异步调用:事件在写入到消息队列后则返回。如:定时任务、 OSS 事件触发器

开发者工具

  • 控制台可视化界面
  • Vscode插件:
  • Fun:
  • Fcli:
  • SDK client
  • OpenAPI
  • WebIDE:

最为开发者一开始上来工具太多了,有些不知如何下手。控制台可视化界面 + Vscode插件 应该就能够满足大大部分开发者的需求了, 这里就上面工具一一介绍下

1. 控制台可视化界面

地址:
功能如下:


  • 主页:

    • 产品动态
    • 用户整体监控数据:函数执行次数、公网流量Byte、资源使用量CU(Compute Unit)
    • 用户帮助文档入口
  • 函数管理

    • 创建:普通函数、http函数、根据模板创建函数
    • 编辑:函数在线编写, 触发调用、代码包上传、OSS文件存储关联
    • 触发器管理:修改触发器配置,新增函数触发器(触发器与函数多对多关系)
    • 监控指标:内存、执行时间、错误量、错误率
    • 日志:需要用户额外开通日志服务进行对接,实时采集分析,个性化表盘配置、报警规则设定
    • 预留实例:因为函数是弹性自动扩缩容的,每次冷启动耗时影响,会对服务耗时有毛刺的影响,对耗时有要求的用户可以联系平台给账号配置白名单,配置预留实例。
    • 创建应用:将服务配置、函数配置、trigger配置、工程构建、通用场景化应用模板创建好一个应用
    • 服务版本:给服务设置版本,做快照备份。设置别名,进行流量版本灰度比例设置,目前支持两个版本切分流量
  • 自定义域名

    • 默认域名:账号id.服务地址.fc.aliyuncs.com 如:16530750.cn-shanghai.fc.aliyuncs.com, 请求函数为:xxx.xxx.fc.aliyuncs.com/2016-08-15/proxy/服务名/函数名/
      http触发器的函数,服务端会为 response header 中强制添加 content-disposition: attachment 字段,此字段会使得返回结果在浏览器中以附件的方式打开。此字段无法覆盖,使用自定义域名将不受影响。
    • 自定义域名, 将自己的域名 CNAME 到 xxx.xxx.fc.aliyuncs.com ,域名需要备案成功后才能访问成功

2. Vscode插件

地址:
vscode 编辑器开发神器,占有率和生态不断提升。函数计算平台给出了IDE一站式插件:本地图形化开发、调试和部署工具
使用前需要安装Docker,其原因是,通过docker运行有平台提供标准化的函数Runtime, 来在开发者本地进行开发、调试。
该插件功能如下:


  • 关联阿里云账号
  • 第二栏列出远端部署的服务和函数,支持菜单按钮刷新,切换地区、账号

    • 点击菜单按钮,下载服务工程、下载函数工程
    • 点击菜单按钮,触发执行远端函数,右侧可以编写触发事件参数
    • 点击服务、函数、触发器菜单栏,右侧打开其配置信息
  • 第一栏列出当前本地工程,根据配置文件 template.yaml 中所有服务、函数、触发器

    • 点击菜单按钮,浏览器打开函数计算相关文档
    • 点击菜单按钮,浏览器打开函数计算Vscode插件源码仓库
    • 点击菜单按钮,对当前服务(一个配置文件template.yaml)所有函数进行代码上传,部署deploy
    • 点击菜单按钮,新增一个新服务, 一步步输入服务名、函数名、选择运行Runtime、选择函数类型(普通函数、http函数), 此时会在该工程配置文件template.yaml 中会更新添加一个服务。其中一步步提示,可进行后退操作
    • 点击菜单按钮,新增一个函数,在当前服务中。同上一步步输入选择配置,最终更新配置文件,新建一个函数目标
    • 点击菜单按钮, 可也进行查看函数代码、触发函数、debug 触发函数。
    • 点击菜单,能快速定位高亮提示到,配置文件中对应位置。
    • 入口函数代码位置,定位有两个按钮触发函数、debug触发函数

3. Fun

地址:
安装:npm install @alicloud/fun -g
本地命令行开发、调试和部署工具,作为一个命令行工具,内置了多个子命令,比如 config、local、deploy 等

  • init 根据模板初始化一个服务,fun init 选择需要模板、或者指定自定义工程模板
  • config 子命令可以用来配置通用信息,如 Account ID、Access Key Id
  • local 子命令可以用来本地运行、调试函数,

    • 运行函数 fun local start service/function
    • 调试函数 fun local start -d 3000 --config VSCode service/function (根据提示配置vscode调试配置,启动后即可调试)
  • deploy 子命令可以将本地开发代码发布到线上

    • 部署所有服务、所有函数:fun deploy -t ./template.yml
    • 部署特定服务中特定函数: fun deploy -t ./template.yml demo/hello
  • 对生成环境更推荐 ROS 部署,在配置文件中声明bucket 配置

    • 打包上传资源到OSS: fun package --oss-bucket bucket-name
    • 进行不同环境部署,任何资源中间环节部署失败,都会自动整个资源栈的自动回滚,解决部署过程中的可能导致服务不可用的问题。

      • fun deploy --use-ros --stack-name test
      • fun deploy --use-ros --stack-name staging
      • fun deploy --use-ros --stack-name prod

4. OpenAPI

地址:
函数计算资源管理接口API,即可以通过http接口, 对平台资源(服务、函数、触发器等) 增删查改操作

5. SDK

地址:
函数计算clientSDK ,即开发者可以方便通过这个sdk, 对平台资源增删查改操作
源代码即通过http接口调用上面OpenAPI,SDK里自动处理了签名认证

6. Fcli

地址:
注意要和Fun 进行区别。
Fun: 本地开发、调试、部署的命令行工具
Fcli: 操作管理 在阿里云函数计算平台资源的命令行工具。


开发者通过这个命令行工具 ,对函数计算平台资源增删查改操作。如我用控制台可视化界面、vscode可视化界面都没有找到删除服务的操作入口,后来通过这个命令行工具成功将不需要的服务删除掉了。
源代码即通过依赖使用上面的SDK client 进行操作的

7.WebIDE

地址:
浏览器版本IDE进行函数管理开发。体验了下,可能因为资源成本考虑,还需要用户自己本地使用docker 启动镜像,将本地创建的网络磁盘挂载到WebIDE。且服务region只支持一个华东1(杭州)。故开发者目前可以忽略使用
因为以下已经是一个很不错且低成本的最佳实践方式。故官方对WebIDE开发链路建设优先级没这么重

  • 日常开发:vscode插件 + vscode + docker里标准化runtime
  • 高级配置:官网函数计算控制台

8.开发者工具总结

以上开发者生态工具关系:

OpenAPI => SDK client => Fcli
=> Fun(开发、调试、部署命令行工具) + Fcli(平台资源管理命令行工具)
=>(本地vscode 可视化插件 |+官网站点平台)
=> 我想的理想状态(官网Web站点平台 + 无依赖的WebIDE )


开发者工具能力一层层抽象、复用,对我们构建类似生态可以说有很好的借鉴作用

配置文件

阿里云函数计算配置文件 template.yaml , 一个工程一个配置文件,一个配置文件下可以有多个服务,每个服务有多个函数,
每个函数多个触发器,如下进行了大体解释

# template.yaml
ROSTemplateFormatVersion: '2015-09-01'  # ROS(Resource Orchestration) 资源编排 本号
Transform: 'Aliyun::Serverless-2018-04-03' # 继承模板
Resources:  # 资源列表
  demo:  # 资源-服务1
    Type: 'Aliyun::Serverless::Service' # 资源类型
    Properties: # 资源属性
      InternetAccess: true
    hello: #函数1
      Type: 'Aliyun::Serverless::Function'
      Properties:
        Handler: index.handler # 处理函数入口
        Runtime: nodejs10 # 函数运行环境
        Timeout: 60 # 函数超时时间s
        MemorySize: 512  # 运行内存限制
        EnvironmentVariables: {} # 环境变量
        CodeUri: ./demo/hello  # 函数代码
      Events:  # 函数的触发器
        http-trigger:
          Type: HTTP # 触发器类型
          Properties: # 触发器配置
            AuthType: anonymous # 权限认证
            Methods: # http接口method
              - GET
              - POST
    common-fun: # 函数2
      Type: 'Aliyun::Serverless::Function'
      Properties:
        Handler: index3.handler  
        Runtime: nodejs10 
        Timeout: 60 
        MemorySize: 512 
        EnvironmentVariables: {}
        CodeUri: ./demo/common-fun 
  demo-vscode: # 资源 - 服务2
    Type: 'Aliyun::Serverless::Service'
    Properties:
      Description: This is demo-vscode service
    hello:
      Type: 'Aliyun::Serverless::Function'
      # ...

传统应用工程迁移

因为我们传统的web 大都是express、koa、egg 框架写的。函数计算以函数为执行入口,相对传统工程少了应用的启动端口号监听、路由部分。路由部分被放在了平台外层。那如何快速底层平迁移传统服务呢?有如下两种方式

1. 函数内部路由 + 添加代理层

const { Server } = require('@webserverless/fc-express')
const express = require('express');
const app = express();

// 保留传统服务内部路由
app.all("/", (req, res) => {
  // ...
});
app.all('/login/*', (req, res) => {
 // ....
});
const server = new Server(app);

// 此时函数变成了一个传统服务
module.exports.handler = function(req, res, context) {
  server.httpProxy(req, res, context);
};

进行平台自定义域名 + 路由配置, 将这个服务的流量都导入这个特殊的函数

Path 服务名 函数名
/service/* s1 f1

可以看到通过官方提供的模块@webserverless/fc-express, 我们很快的进行了服务的迁移。
这个模块里做了什么

  • 针对http 触发器对应函数(特殊处理函数)

    • 阿里云自己的规范 res/req 参数,适配转化到对应的 express req res 对象上,
    • 阿里云callback 执行,适配到 express res.send/res.json 上
  • 针对API 网关触发器对应函数(普通处理函数)

    • event 对象需要映射到 express req 对象
    • 阿里云callback 执行,适配到 express res.send/res.json 上
  • 问题

    • 适配多少代理了不确定的风险
    • 请求对象属性没有从函数计算中透传出来,比如:protocol、hostname 等,所以在 express 应用中无法获取
    • 移植后的 express 也需要是无状态的,函数是无状态的

自定义运行时

2019年10月推出支持用户自定义 Custom Runtime,可以完成以下目标:

  • 打造属于自己的自定义runtime,各种依赖通用上下文、环境自己把握,把握函数入口参数规范
  • 不在需要每次重复安装、打包上传通用依赖,加大冷启动时间,补充官方默认基础依赖:,即这些你服务工程不需要安装依赖,也可以 require('ali-oss')
  • 现有的 web 应用或基于传统开发 web 项目基本不用做任何改造,即可将项目迁移到函数计算平台
  • 具体做法文档:, 这边还没找到一个完整的自定义Runtime的nodejs 方案工程,可以快速参考,希望官方可以补充

依赖安装

由于阿里云-函数计算,才有的非docker镜像发布业务代码,而是上传zip包的形式(官方给出的原因是 docker镜像太大的问题,下载给冷启动带来影响,另外docker 方案并非绝对隔离安全。阿里云函数计算底层用的是虚拟机,不知道是如何做到同docker一样资源利用率这么高的)
因为上传的是包含依赖+业务源代码,有些安装依赖是会进行编译的,如node-gyp编译c++, 编译环境与运行环境不一致,可能会造成线上问题。故你本地开发安装需要编译依赖是,需要保持与你部署环境一致,对应nodejs用户,函数计算的 Nodejs 运行环境是:

  • Linux 内核版本:Linux 4.4.24-2.al7.x86_64
  • docker 基础镜像:docker pull node:xxx 对应配置设置的版本 (nodejs 版本一致能解决大大部分问题, 使用nvm 即可)
    其他语言这个问题会多些,官方给出了通过 fun install 命令行 在一个docker 标准运行环境容器sbox环境安装的解决方案

函数工作流

2019年中推出的产品,目前公测中
产品文档:
产品控制台:
函数工作流-函数编排,不仅仅是为函数计算而生,但其和函数计算结合起来十分合适。函数工作流提供了丰富的控制原语让您描述业务逻辑,比如您可以串行执行任务、并行执行任务。这样我们可以通过配置文件来描述各原本独立函数计算之前如何流转起来,传递数据。该配置文件也可以通过可视化拖拽形成一张数据流转操作图。
这是函数级serverless, 相对应用级serverless的优势
相对应用级工程管理,函数级管理更为复杂,但却带来了复用函数、灵活组合编排函数的好处。




加快冷启动

  • 开发者减小最后打包上传的工程代码大小,如 业务代码拆分、减少依赖node_modules大小.
  • 选择合适的函数语言,如nodejs 代替java 大大提升语言运行时创建
  • 优化函数初始化逻辑

    • 使用定时触发器 预热函数
    • 使用 Initializer 函数入口,异步复用初始化通用依赖,如mongo连接
  • 选择合适的内存: 在并发量一定的情况下,函数内存越大,冷启动表现越优

  • 2019.9月推出预留实例能力,来解决部分应用对冷启动耗时尖刺的问题

最后

阿里云-函数计算,是阿里自研的一种Serverless实现, 经过几年发展可以说产品相对成熟、生态完善丰富。其初始定位应该是面向简单函数级的Severless, 基于zip包上传源代码和依赖,进行下载部署。 因为Severless 是还在蓬勃发展,各大平台(亚马逊、Google、微软)有自己的实现规范, 对ymal配置文件、入口函数参数等会有不同。
标准化发起者Google牵头的开源项目 也在蓬勃发展中,定位是提供一套标准化,面向函数、应用、容器的Serverless方案,在阿里云上已经开始支持私有化部署K8s+Istio+Knative集群来搭建,相对函数计算服务拿来即用,门槛更高些,目前还在公测阶段,我在另一篇文章里有详细介绍:。

以上使我对阿里云函数计算平台的一些总结,希望对大家有所帮助,如有理解有误,欢迎指出,共同成长。

【关于云返利网】

云返利网是阿里云、腾讯云、华为云产品推广返利平台,在各个品牌云产品官网优惠活动之外,云返利网还提供返利。您可以无门槛获得阿里云、华为云、腾讯云所有产品返利,在官网下单后就可以领取,无论是自己用、公司用还是帮客户采购,您个人都可以获得返利。云返利网的目标是让返利更多、更快、更简单!详情咨询13121395187(微信同号)