前言

首先介绍下在本文出现的几个比较重要的概念:

函数计算(Function Compute): 函数计算是一个事件驱动的服务,通过函数计算,用户无需管理服务器等运行情况,只需编写代码并上传。函数计算准备计算资源,并以弹性伸缩的方式运行用户代码,而用户只需根据实际代码运行所消耗的资源进行付费。函数计算更多信息 参考
Fun: Fun 是一个用于支持 Serverless 应用部署的工具,能帮助您便捷地管理函数计算、API 网关、日志服务等资源。它通过一个资源配置文件(template.yml),协助您进行开发、构建、部署操作。Fun 的更多文档 参考。 
ROS: 阿里云资源编排服务(ROS)助您简化云计算资源的管理。您可以遵循ROS定义的模板规范,在模板中定义所需云计算资源的集合及资源间依赖关系。ROS自动完成所有资源的创建和配置,实现自动化部署和运维。更多文档参考

备注: 本文介绍的技巧需要 Fun 版本大于等于 3.0.0+。

背景介绍

在 Fun 3.0 版本之前,Fun Deploy 功能只有一种部署方式,即直接使用 fun deploy 命令进行部署。

随着用户的不断反馈,虽然我们一直在增强 deploy 的功能,但我们 Fun 依旧在某些场景下做的依旧不够好:

  1. 没有完善的资源状态管理机制:原有的 Fun 部署的资源,只支持创建、更新两种操作。我们希望,在部署时,Fun 能够准确的感知到,哪些资源是新增的、哪些资源是更新的、哪些资源是被删除了的以及哪些资源是不变的。通过感知到这些资源的状态变化,Fun 才能作出正确的决策,达到预期的行为。
  2. 回滚机制缺失:一次部署往往涉及非常多的资源,而这些资源可能存在着错中复杂的依赖关系,其中的某服务部署失败,都可能会导致整个部署操作的失败,一旦部署失败,能否自动回滚到上一正确状态,是保证用户服务可用性的关键。
  3. 严格遵循模型定义:通常一个 template.yml 用来描述一个完整的应用,我们想为用户提供保证,你看到的 template.yml 的内容,就是你部署到线上的应用的最终形态。
  4. 难以明确部署差异。如果是一个许久没有更新的应用,用户可能很难作出直接将本地模板部署到生产的决定。难于作出这种决定的原因在于,用户也无法知晓当前的模板文件与线上是否为同步的状态。
  5. 支持有限的云资源。我们已经为用户提供了比较多的云资源的支持,但即使这样,也很难覆盖全用户的场景,我们需要纳入更多的云资源的管理。
  6. 无法快速创建多套开发环境。由于没有资源集合的概念,所以,使用不同的模板进行部署时,操作的单位永远是单个资源,所以,单个模板文件进行多次部署时,操作的永远都是同一批资源。当需要创建多套开发环境时,需要手动修改资源的唯一名称等标识。

为了解决这些问题,我们在 Fun 3.0 引入了一种全新的部署方式:ROS。

ROS 通过 Transform 宏实现了将函数计算的模板语法转换为 ROS 支持的语法。这意味着对于 Fun 规范文档 里描述的语法规则,ROS 是同样支持的。同时,ROS 支持的资源 也能在 Fun 模板文件中进行声明了,比如 RAM、函数工作流 等等。

ROS 部署方式的命令格式

可以使用 -h,查看 fun deploy 的帮助文档:

$ fun deploy -h
Usage: fun deploy [options] [resource]
Deploy a serverless application. use 'fun deploy' to deploy all resources
use 'fun deploy serviceName' to deploy all functions under a service
use 'fun deploy functionName' to deploy only a function resource with '--only-config' parameter, will only update resource config without updating the function code Options:
-t, --template [template] The path of fun template file.
-c, --only-config Update only configuration flags
--use-ros Deploy resources using ROS
--stack-name <stackName> The name of the ROS stack
-h, --help output usage information

当部署 ROS 相关资源时,需要在 fun deploy 后面追加 --use-ros 以及 --stack-name 两个参数,--use-ros 表示使用 ROS 的方式进行部署,--stack-name 表示使用 ROS 部署时使用的资源栈的名称。

如何理解资源栈呢?简单理解起来就是使用模板文件部署的一整套应用(云端资源集合)的 ID。即使同一个模板文件,也可以通过指定不同的资源栈的名称,实现部署多套应用。当通过模板文件进行部署时,会将模板文件的资源属性与所指定的资源栈进行对比并计算差异,进而完成线上资源的创建、删除、更新等操作。

ROS 部署示例

1. 初始化示例项目

直接执行下面的命令即可初始化一个简单的函数示例:

fun init -n RosDemo event-nodejs8

2. 项目打包

在体验上,由于 ROS 部署,要求资源必须“云化”。也就是没办法直接使用本地的代码资源。必须先通过 fun package 命令将资源上传到 oss:

fun package --oss-bucket bucket-name

3. 项目部署

最后将资源通过 ROS 的方式进行部署:

fun deploy --use-ros --stack-name bucket-name

ROS 更多使用场景举例

1. 快速创建多套应用部署环境

通过在部署时,指定不同的 stackName,可以部署应用到不同环境:

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

2. 测试 demo 效果,并快速清理

从网上、模板或者官方文档看到相关示例,进行一些测试后,想要将这些资源全部清理干净。可以打开 ROS 控制台,找到想要删除的资源栈,点击删除后。我们测试时创建的所有云资源,就都会被正确的清理掉了。

3. 部署过程失败,自动回滚上一正确状态

在部署过程中,任何资源的操作失败,都会导致整个资源栈的回滚,通过这种机制,可以成功解决部署过程中的服务不可用的问题。

4. 在模板文件里描述更多资源

除了原有的 Fun 定义的资源外,现在 ROS 支持资源也可以在 Fun 的模板文件里声明了,比如我们可以通过下面的方式声明一个 oss 的 bucket 实例:

Bucket:
Type: 'ALIYUN::OSS::Bucket'
Properties:
BucketName: 'oss-unzip-demo-bucket'

总结

通过引入 ROS 的部署方式,解决了我们在开篇提到的几个问题(除“部署差异查看”功能还在开发外,其他功能均可以在 Fun 3.0.0 版本中使用了)。

本文作者:tanhe123

原文链接

本文为云栖社区原创内容,未经允许不得转载。

开发函数计算的正确姿势 —— 使用 ROS 进行资源编排的更多相关文章

  1. 开发函数计算的正确姿势 —— 使用 Fun Local 本地运行与调试

    前言 首先介绍下在本文出现的几个比较重要的概念: 函数计算(Function Compute): 函数计算是一个事件驱动的服务,通过函数计算,用户无需管理服务器等运行情况,只需编写代码并上传.函数计算 ...

  2. 开发函数计算的正确姿势——OCR 服务

    作者 | 杜万(倚贤) 阿里云技术专家 简介 首先介绍下在本文出现的几个比较重要的概念: OCR(光学字符识别):光学字符识别(Optical Character Recognition, OCR)是 ...

  3. 使用webpack开发ES6程序的正确姿势

    1.cnpm install babel-loader babel-core babel-preset-es2015 -D 2.cnpm install babel-plugin-transform- ...

  4. 函数计算工具链新成员 —— Fun Local 发布啦

    刚刚,我们发布了函数计算工具链的新成员,Fun Local.欢迎大家使用! 如果你还不了解 Fun 是什么,我们来简单解释下. Fun 是什么 Fun 是 have Fun with Serverle ...

  5. Serverless 解惑——函数计算如何安装字体

    前言 首先介绍下在本文出现的几个比较重要的概念: 函数计算(Function Compute):函数计算是一个事件驱动的服务,通过函数计算,用户无需管理服务器等运行情况,只需编写代码并上传.函数计算准 ...

  6. Taro 多端开发的正确姿势:打造三端统一的网易严选(小程序、H5、React Native)

    笔者所在的趣店 FED 早在去年 10 月份就已全面使用 Taro 框架开发小程序(当时版本为 1.1.0-beta.4),至今也上线了 2 个微信小程序.2 个支付宝小程序. 之所以选用 Taro, ...

  7. SpringBoot 开发案例之参数传递的正确姿势

    前言 开发这么多年,肯定还有不少小伙伴搞不清各种类型的参数是如何传递的,很多同学都是拿来即用,复制粘贴一把撸,遇到问题还是一脸懵逼. 姿势 学习参数传递的正确姿势,先说怎么做,再说为什么,本质上还是复 ...

  8. 函数计算: 让小程序开发进入 Serverless 时代

    点击下载<不一样的 双11 技术:阿里巴巴经济体云原生实践> 本文节选自<不一样的 双11 技术:阿里巴巴经济体云原生实践>一书,点击上方图片即可下载! 作者 | 吴天龙(木吴 ...

  9. 使用imread()函数读取图片的六种正确姿势

    OpenCV实践之路——使用imread()函数读取图片的六种正确姿势 opencv里的argv[1]指向的文件在哪里 测试 #include "opencv2/highgui/highgu ...

随机推荐

  1. org.mybatis总是认不出来的原因,pom.xml中有

    idea打开maven project,然后就华丽丽的看见下载失败,怎么刷新都没有用. 请按以下步骤完成即可: https://blog.csdn.net/ZhengYanFeng1989/artic ...

  2. Keystone controller.py & routers.py代码解析

    目录 目录 Keystone WSGI 实现 controllerspy routerspy 参考文档 Keystone WSGI 实现 Keystone 项目把每个功能都分到单独的目录下,EXAMP ...

  3. CSS3 RGBA等于RGB加上opacity吗?

    在我们前端设计里有两篇教程: CSS3 RGBA colors使用说明 css3中opacity属性学习与实践,他们公别介绍了RGBA,RGB,opacity的用法,这里我们把这三个属性放在一起来考虑 ...

  4. Number Sequence /// oj21456

    题目大意: 有一组规律数 the first 80 digits of the sequence are as follows: 1 12 123 1234 12345 123456 1234567 ...

  5. 2019 HDU 多校赛第二场 HDU 6598 Harmonious Army 构造最小割模型

    题意: 有n个士兵,你可以选择让它成为战士还是法师. 有m对关系,u和v 如果同时为战士那么你可以获得a的权值 如果同时为法师,你可以获得c的权值, 如果一个为战士一个是法师,你可以获得b的权值 问你 ...

  6. Lucene TFIDFSimilarity评分公式详解

    版权声明:本文为博主原创文章,遵循CC 4.0 by-sa版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/zteny/article/details/ ...

  7. java笔试之查找组成一个偶数最接近的两个素数

    任意一个偶数(大于2)都可以由2个素数组成,组成偶数的2个素数有很多种情况,本题目要求输出组成指定偶数的两个素数差值最小的素数对. package test; import java.util.Sca ...

  8. spring在普通类中获取session和request

    在使用spring时,经常需要在普通类中获取session,request等对像.比如一些AOP拦截器类,在有使用struts2时,因为struts2有一个接口使用org.apache.struts2 ...

  9. TCP/IP协议,,OSI的七层参考模型,HTTP请求响应机制

    一.TCP/IP协议 TCP/IP是Transmission Control Protocol/Internet Protocol的简写,中译名为传输控制协议/因特网互联协议,又名网络通讯协议,是In ...

  10. django项目基础

    D:\>django-admin startproject GodWork1 D:\>cd GodWork1 D:\GodWork1>python manage.py startap ...