开发者学堂课程【从 0 入门函数计算:函数的开发与配置】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/645/detail/10722
函数的开发与配置
内容简介:
1.基本概念
2.开发流程
3.操作演示
1、基本概念
1)服务
服务是函数计算资源管理的单位。
Ø 同一服务下有很多函数。
Ø 这些函数共享服务配置:网络配置、权限配置、NAS 配置、SLS 配置。
服务可以对应于一个微服务的概念,这个微服务可以由和很多函数共同组成,这些函数具有相同的访问权限,网络配置,日志也会记录到相同的 local store 里面去。这些函数本身的配置可以各不相同,比如说同一个服务下面有的函数内存为 3G,有的函数内存为 512M,有的函数用 python 写,有的函数用另一种语言写。如果应用比较复杂,同一个应用可以对应多个服务,没有强制的绑定关系。
2)服务配置
Ø 日志配置 LogConfig:设置日志服务的日志项目和日志仓库,用于存储和分析函数运行的日志。
开发者的代码在函数计算平台运行,如何查看函数运行产生的日志呢?
在 ESC 上或者是在传统的服务器上开发,日志都会打到统一的文件里面,通过日志收集工具收集到用户自己的 elastic search 中,并且通过可视化工具来查看日志或者指标。但是函数计算里面运行代码的机器是由函数计算动态分配的,开发者无法自己收集日志了。函数计算需要帮助开发者投递日志,日志配置就是起到这个作用。
配置 LogConfig,设置日志服务的 project 和 logstore,函数计算会将函数运行中产生的日志投递到开发者的 logstore 里面。但是为了成功投递日志,单单配置logstore 还不够,函数计算是没有权限向开发者的 logstore 里面投递日志的,还需要开发者授予函数计算向指定的 logstore 到写数据的权限,有了这个权限以后,函数计算就可以名正言顺的向开发者的 logstore 投递日志了。
总结一下,日志配置就是为了让用户有一个地方配置他的 logproject 和 logstore,然后允许函数计算向这个里面去投递函数日志,然后用户可以在 logstore 里再做一次进一步的分析。
Ø 文件存储配置 NASConfig:配置 NAS,让函数访问 NAS 文件系统时如同访问本地文件系统一样。
函数计算的每个函数都是独立的,都在不同的执行环境里运行。执行环境可以把它理解成是一个容器,如果用户有一些公共文件,希望多个函数共享怎么办呢?
在传统的开发方式中,那就是将公共文件放到磁盘里面,各个函数都去磁盘里面同一个位置读,但是函数计算的机器还是动态分配的,同一个函数的不同实例可能不在同一个主机上面,开发者也没有办法将这些文件存入磁盘,因为这个机器是函数计算的,那怎么办呢?
为了解决这个问题,函数计算推出了挂载 NAS 的功能,在服务中挂载了 NAS 函数,就可以像访问本地文件系统一样访问 NAS 的文件了,用户可以在 NAS 的控制台上去对文件进行操作。
Ø 网络配置:配置函数访问公网、配置函数访问指定 VPC。
网络配置顾名思义就是设置网络的访问能力,就是函数的网络访问能力。主要有两种。
一个是函数中是否可以访问公网,有的他不希望访问公网,因为产生一些预期之外的公网流量费用,然后这函数计算在这里设置了一个开关,默认是开启的,如果不需要访问公网就可以关闭开关。
另一个是函数是否可以访问指定 VPC,VPC 是专有网络,专有网络中的数据比较机密,是不能通过公共网络访问的,如果需要通过函数访问VPC的资源,那就需要授予函数计算访问指定 VPC 的能力。
Ø 权限 Role:
授予函数计算执行函数所需的权限:授权函数计算服务使用您的日志服务的权限、授权函数访问其他云资源的权限
函数计算和云上很多服务都会产生交互。阿里云有非常严格的权限限制,函数计算是没有能力访问开发者的其他云资源的。当开发者需要函数计算访问其他云服务的时候,就需要显示的授予函数计算权限。权限主要有两个应用场景。
一个是授予函数计算访问其他服务的权限,比如说授权函数计算访问开发者的日志服务。
另一个是授权函数可以访问开发者的云资源,
3)函数
Ø 函数是管理、运行的基本单元。
Ø 通常由一系列配置可运行代码包组成。
函数计算中函数是核心概念,函数是管理和运行的基本单元,函数通常有一系列的配置和一个可运行的代码包组成。
Runtime 是函数运行时的环境类型,函数目前支持 Python、PHP 等开发环境,同时也支持 custom run time,允许用户来建立运行环境。
Code 是函数代码包,函数计算的后端是指认代码包的,各个开发工具会自动帮助你打包,比如您可以在控制台上编写代码,控制台会将这些代码自动打包,然后给你为您创建函数或者更新函数,你也可以在本地编写函数或者调试函数,通过我们的部署工具部署到函数计算,
代码包中主要是有代码以及代码所需要第三方依赖。比如说你的代码当中用到了一些第三方的库,也需要将第三方的库和代码一同搭到这个代码包里面。
Handler 是入口函数,就是你告诉函数计算入口函数的位置,
Timeout 是函数的超时时间,如果函数计算执行超过了这个时间,函数就会被强制停止执行。
Memorysize 是函数分配的执行环境的内存,目前的取值范围是 128 兆到 3G,如果函数耗用的内存超过分配的内存就会 oin 掉。
initializer 叫做初始化函数,Initializer 中的逻辑就是在第一次分配执行环节中来执行的,
并且保证同一个执行环境执行且执行一次。基于这个特性,就是同一执行环境中执行起且只执行一次的特性,我们就可以将一些建立连接,加强依赖这些耗时的操作放到 initializer 里面来执行。
Initializertimeout 就是 initializer 函数的最大执行时间。
4)触发器
触发器是触发函数执行的方式。
Ø 在事件驱动的计算模型中,事件源是事件的生产者,函数是事件的处理者。
Ø 触发器提供了一种集中、统一的方式来管理不同的事件源。
Ø 当事件发生时,如果满足触发器定义的规则,事件源会自动调用这个触发器所对应的函数。
使用场景示例
Ø 对上传的 OSS 当中的对象进行处理
Ø 对 SLS 中日志进行清洗、处理、转存
Ø 在指定时间触发函数执行
5)版本
Ø 版本相当于是服务的快照,包括服务的配置、服务内的函数代码以及函数的配置。
Ø 函数计算提供服务级别的版本控制功能,支持您为自己的服务发布一个或多个版本。
Ø 版本发布后,已发布的版本不可更改。
6)别名
Ø 别名为指向特定服务版本的指针,别名无法脱离服务或版本单独存在。
Ø 使用别名访问服务或函数时,函数计算会将别名解析为其指向的版本。
Ø 可以使用别名切换流量进行灰度发布。
2、开发流程
开发者需要先创建服务,设置日志,权限等配置,然后创建函数,在当前版本下编写代码,开发函数,测试通过后可以发布版本。第一次发布的版本为版本1,创建别名 prod 指向版本 1,就可以对外提供服务了。客户端调用函数的日志会记录在开发者配置的 logstore 里,函数计算提供完备的监控图表,应用上线后,开发者可以通过监控图表和日志来查看应用的健康状况。当开发者由新的需求的时候,可以继续在Latest版本来更改代码和开发函数,测试通过后就可以发布函数,这个时候发布版本为版本2,更改别名,切换别名 prod 10% 的流量到版本 2,观察一段时间之后,可以切换别名 prod 百分之百的流量到版本 2 上。
3、操作演示
打开函数计算工作台,新建服务,服务名称为 DemoService2,勾选绑定日志。
自定义修改以下的更多配置
创建好服务之后继续创建一个函数。
这里有三个函数,分别是事件函数,HTP 函数和模板函数。HTP 函数是说函数的入参就是 HTP 的 request,返回值是 HTP 的 response,它可以直接做你的应用的server,然后事件函数是说用户可以指定的一个入参,它不是 request,是你指定是什么就是什么。返回值也是,你指定什么就是什么,就像平时写的一个函数一样。模板是云服务提供的一些比较常用的模板,可以在这里面选。
以 hello world 函数为例。
函数入口就是函数计算从哪里的开始执行这一串代码。
单实例并发度指的是,函数计算是在实例里面执行,但实例默认情况下是同时只能执行一个请求的,有更多的请求怎么办?我们会调动更多的实例来执行更多的请求。但实际上有的时候,一个实例直接一个请求就会有点浪费,所以用户可以在这里选择一个实例同时可以并发多少个请求。
函数创建完成
创建完成之后,这里会有一个默认的代码
左边是文件数,右边的是代码
点击执行,产生结果
也可以在日志查询里面查看。
高级查询会显示多条日志
latest 当前版本已经开发完成,假如你的代码就在 latest 上面,那就可以上线了,我们第一个上线的就是刚刚的 hello world 应用。怎么上线呢?比如我们要发布一个版本,并且创建一个别名指向这个版本,版本是服务级别的,发布了这个版本之后,这个服务下面所有的函数就都会跟着翻一个版本。
先发布一个版本,这个版本的 ID 是版本一。
当你发布了版本之后,代码是不能编辑的,只有在 latest 版本可以编辑,但可以看这个代码。
接下来创建一个别名,指向你刚才发布的版本。
主版本就是 100% 流量都会在这。灰度版本就是你想切多少流量到别的版本上面去。
接下来就可以通过别名来访问用户。
如果产品经理又提了新的需求,要开发迭代,那就在 lastest 上面开发。这时不叫hello word 叫 new word,保存,response 就变成 new word。最新的版本都要改成 new word
发布版本二。
在别名管理里不用新建一个别名,只需要将刚才的别名指向版本二就好了,更新别名。
新版本设置灰度 50% 的流量。
现在是有一半的概率执行版本一,有一半的概率来执行版本二的,也就是一半的概率是输出 hello world,一般概率输出 new world 的
选了别名之后是看不到代码的,因为让用户更加的清楚,别名下是没有任何资源的,它只是一个指针,但是你可以来执行它,
所以这里我们搭建了一个简单的应用,就是 hello world 这里面应用,
然后并且模拟了应用的更新迭代,新的版本发布和上线,再有新的版本发布的时候,我们只需要在函数这里发布版本,并且将别名指向最新的版本,就可以完成一次应用的升级。