Serverless 微服务实践

背景

阿里云函数计算是事件驱动的全托管计算服务。通过函数计算,您无需管理服务器等基础设施,只需编写代码并上传。函数计算会为您准备好计算资源,以弹性、可靠的方式运行您的代码,并提供日志查询、性能监控、报警等功能。借助于函数计算,您可以快速构建任何类型的应用和服务,无需管理和运维。而且,您只需要为代码实际运行所消耗的资源付费,代码未运行则不产生费用。 buried_point 移动应用的打包和分发呈现明显的峰谷效用,用户常常需要短时间内准备大量资源保障分发的实时性,完成分发后又需要及时释放资源,降低成本。这里我们提供一个 fun 模板,帮助我们更快地搭建一个基于函数计算构建 Serverless 架构的包分发服务,在开发运维效率,性能和成本间取得良好的平衡。

在分包过程中,下载/修改/上传是一个比较消耗资源的任务,需要消耗大量的计算/网络资源。并且分包任务只在应用发布新版本时才会发生,需要在尽可能短的时间内完成。针对这种有明显波峰波谷的场景,非常适合使用函数计算来完成。更重要的是这个服务是具有弹性伸缩和高可用能力的。

apk 分包简介

apk_

更多参考函数计算--Serverless 微服务实践-移动应用包分发服务

准备工作:

1.安装 node

1curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.33.5/install.sh | bash 2nvm install 8

2.安装 fun 工具

npm install @alicloud/fun -g

fun 工具的某些子命令可能会用到 docker,所以你需要安装好 docker,具体参考文档:Fun 安装教程

3.apk 包准备

在这个实验中,我们会使用一个示例的 apk 包,可以从这里下载 qq-v2.apk

下载 qq-v2.apk ,上传到自己的 oss bucket中:

apk_

快速开始:

1.通过 fun 模板生成项目骨架

使用 fun init 命令可以快捷的将本模板项目初始化到本地,执行命令 :

1$ fun init -n apk https://github.com/coco-super/package-distribution-service-for-serverless 2start cloning... 3Cloning into '.fun-init-cache-2fc2d680-eeff-11e9-a930-6fd4d1ac6506'... 4remote: Enumerating objects: 23, done. 5remote: Counting objects: 100% (23/23), done. 6remote: Compressing objects: 100% (16/16), done. 7remote: Total 23 (delta 0), reused 18 (delta 0), pack-reused 0 8Unpacking objects: 100% (23/23), done. 9finish clone. 10? Please input a oss bucket name? sunfeiyu 11Start rendering template... 12+ /Users/ellison/simple-fc-uncompress-service-for-oss/apk 13+ /Users/ellison/simple-fc-uncompress-service-for-oss/apk/.funignore 14+ /Users/ellison/simple-fc-uncompress-service-for-oss/apk/pom.xml 15+ /Users/ellison/simple-fc-uncompress-service-for-oss/apk/src 16+ /Users/ellison/simple-fc-uncompress-service-for-oss/apk/src/main 17+ /Users/ellison/simple-fc-uncompress-service-for-oss/apk/src/main/java 18+ /Users/ellison/simple-fc-uncompress-service-for-oss/apk/src/main/java/example 19+ /Users/ellison/simple-fc-uncompress-service-for-oss/apk/src/main/java/example/App.java 20+ /Users/ellison/simple-fc-uncompress-service-for-oss/apk/target 21+ /Users/ellison/simple-fc-uncompress-service-for-oss/apk/target/classes 22+ /Users/ellison/simple-fc-uncompress-service-for-oss/apk/target/classes/example 23+ /Users/ellison/simple-fc-uncompress-service-for-oss/apk/target/classes/example/App.class 24+ /Users/ellison/simple-fc-uncompress-service-for-oss/apk/template.yml 25finish rendering template.

其中 -n 表示要作为文件夹生成的项目名称。默认值是 fun-app。更多fun init 命令格式选项说明请参考云栖文章开发函数计算的正确姿势 —— 使用 Fun Init 初始化项目

执行 fun init后会提示:输入一个 oss 的 bucket,注意 oss Bucket 是全球唯一的,如已经被占用了,请换一个新的名称或者一个已经创建好的(已经创建好的,请确保 region 一致)。

ps: 输入的内容和 apk 包准备中提到的 oss bucket name 是同一个,本示例为:sunfeiyu

4. 编译

在模版项目的根目录下执行 fun build 命令编译:

1$ fun build 2using template: template.yml 3start building function dependencies without docker 4 5building apk/apk 6running task flow MavenTaskFlow 7running task: MavenCompileTask 8running task: MavenCopyDependencies 9running task: CopyMavenArtifacts 10 11Build Success 12 13Built artifacts: .fun/build/artifacts 14Built template: .fun/build/artifacts/template.yml 15 16Tips for next step 17====================== 18* Invoke Event Function: fun local invoke 19* Invoke Http Function: fun local start 20* Deploy Resources: fun deploy

关于 Fun build 构建函数详细请参照云栖文章 开发函数计算的正确姿势 —— 使用 Fun Build 构建函数

5.服务部署

在模版项目的的根目录下执行 fun deploy 部署到云端。

1$ fun deploy 2using template: .fun/build/artifacts/template.yml 3using region: cn-shanghai 4using accountId: ***********8320 5using accessKeyId: ***********mTN4 6using timeout: 60 7 8Waiting for service apk to be deployed... 9 make sure role 'aliyunfcgeneratedrole-cn-shanghai-apk' is exist 10 role 'aliyunfcgeneratedrole-cn-shanghai-apk' is already exist 11 attaching policies AliyunOSSFullAccess to role: aliyunfcgeneratedrole-cn-shanghai-apk 12 attached policies AliyunOSSFullAccess to role: aliyunfcgeneratedrole-cn-shanghai-apk 13 Waiting for function apk to be deployed... 14 Waiting for packaging function apk code... 15 The function apk has been packaged. A total of 15 files files were compressed and the final size was 3.13 MB 16 function apk deploy success 17service apk deploy success

6.执行函数

提供两种方式:

  1. 登陆阿里云函数计算控制台,手动执行。

_

  1. 项目根目录下 fun invoke apk 命令远端调用:

    $ fun invoke apk using template: template.yml ========= FC invoke Logs begin ========= FC Invoke Start RequestId: 23f34cc4-0cd3-40e0-9a04-f6586cf29be6 2019-10-14 17:06:35.971 [INFO] [23f34cc4-0cd3-40e0-9a04-f6586cf29be6] cmd: java -jar /code/walle-cli-all.jar put -c aliyun-fc /tmp/input.apk /tmp/output.apk 2019-10-14 17:06:36.152 [INFO] [23f34cc4-0cd3-40e0-9a04-f6586cf29be6] Success!

    FC Invoke End RequestId: 23f34cc4-0cd3-40e0-9a04-f6586cf29be6

    Duration: 666.13 ms, Billed Duration: 700 ms, Memory Size: 1024 MB, Max Memory Used: 254.55 MB ========= FC invoke Logs end =========

    FC Invoke Result: Success

查看结果

登陆 oss 查看已经生成新的 apk 包:

apk

将 oss 中 qq-v2-signed.apk 下载到本地。

查看渠道信息是否写入:

1~/Downloads2$ java -jar /Users/ellison/Downloads/walle-cli-all.jar show qq-v2-signed.apk 3/Users/ellison/Downloads/qq-v2-signed.apk : {channel=aliyun-fc}

渠道信息 {channel=aliyun-fc} 已写入,成功!

参考阅读

  1. Fun (Fun with Serverless) 工具
  2. Fun Init 自定义模板

阿里巴巴云原生关注微服务、Serverless、容器、Service Mesh 等技术领域、聚焦云原生流行技术趋势、云原生大规模的落地实践,做最懂云原生开发者的技术圈。”

点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

一篇文章带你了解JavaScript日期

日期对象允许您使用日期(年、月、日、小时、分钟、秒和毫秒)。一、JavaScript的日期格式一个JavaScript日期可以写为一个字符串:ThuFeb02201909:59:51GMT0800(中国标准时间)或者是一个数字:1486000791164写数字的日期,指定的毫秒数自1970年1月1日00:00:00到现在。1\.显示日期使用

2020年前端实用代码段,为你的工作保驾护航

有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )