Serverless开发框架及依赖安装原理(下)

本文涉及的产品
函数计算FC,每月15万CU 3个月
Serverless 应用引擎免费试用套餐包,4320000 CU,有效期3个月
简介: Serverless开发框架及依赖安装原理(下)
  • • Resources 具体的资源对象
  • • Resources.*.Type 资源类型

远程调试

通过fun invoke functionName命令对函数进行远程调试

image.png

也可以添加--local进行本地调试,在本地调试之前先安装docker,通过docker在本地启动一个代码运行环境来执行代码,而不是直接模拟函数参数,这样的好处是更接近FaaS平台的运行环境。

应用部署

通过fun deploy进行应用部署。

image.png

开发框架的意义在于帮助开发者提升Serverless应用的开发效率。

小结

  • • 与FaaS、BaaS等基础技术一样,Serverless开发框架也是Serverless领域中非常重要的一部分
  • • 一个优秀的Serverless开发框架,可以让开发者很容易开发一个Serverless架构的应用,也能让企业轻易将现有业务演化到Serverless架构
  • • Serverless开发框架需要具备的基本能力是应用管理、应用调试和应用部署。


Serverless应用怎么安装依赖?


Serverless应用代码都是独立的函数,不涉及其他依赖,而在实际进行应用开发时,大部分情况下都会有第三方依赖。

image.png

上述代码引入了mysql的依赖。

为什么安装依赖很困难?

主要是因为它运行在FaaS平台上,而FaaS平台的运行环境由云厂商提供且预制开发者只能进行有限的定制。

没有服务器怎么登录服务器执行安装依赖的命令?

image.png

函数在被触发执行的时候会生成函数实例。

Serverless应用的依赖本质上是每个函数代码的依赖。

函数实例的实体就是容器,容器的实现方案可以是Docker等。

FaaS通过函数来隔离每个函数实例,也通过容器实现函数运行时的内存和cpu限制,比如给函数分配128M内存,函数实例所对应的容器内存资源只有128M。

运行环境

编程语言是你创建函数时指定的某个具体版本的编程语言,由FaaS平台提供。

内置模块

内置模块就是该编程语言的一些内置模块

比如Node.js中的http.js

为了让开发者使用更方便,FaaS平台一般还会默认安装一些依赖,比如函数计算的Node.js默认提供了aliyun-sdk模块。

函数实例创建时,会从存储服务中将你的代码下载下来并加载到运行环境中。

Serverless应用代码

函数实例中你能控制的只有函数代码,函数代码需要安装依赖实现方案就是将依赖安装到应用内部,将依赖和代码一并打包部署到FaaS平台当中。

实践难点

大多数编程语言的依赖通常安装在全局系统目录,比如maven工具,安装在项目之外的系统目录中。

  • • 安装依赖过程中可能涉及代码编译,环境不统一会导致编译产物有差异
  • • 系统依赖通常不可移植,应用运行时依赖一些系统级别的动态链接库和软件
  • • 安装依赖的难度依次递增的编程语言:Java、Node.js、Python

在Faas中部署的Java应用就是编译后的jar包而不是原始代码。


如何为Java应用安装依赖

虽然部署jar包不用关心依赖了,但也带来了问题:部署前需要先编译。

通常本地开发的时候Java的依赖安装在本地的.m2/home/repository目录下,编译的时候根据本地的jdk版本和本机的repository编译代码,如果有多个同学同时开发部署一个应用,大家电脑上安装的jdk版本或依赖包可能不完全相同,就会导致每个人编译出来的jar包不同,甚至部署到FaaS上的jar包无法正常运行。

想要解决编译环境问题就要有统一的构建机

image.png

不让开发同学直接编译部署Java代码。

开发Java的时候可以通过pom.xml文件来定义代码的依赖,部署Java应用的时候需要将Java的业务代码和pom.xml都上传到构建机,在构建机上统一安装依赖编译代码得到一个可以直接执行的jar包,然后再将jar包部署到FaaS平台。

总的来说Java是编译型语言,只要统一编译环境就不要关心依赖的问题,可是对于Node.js解释型语言怎么安装管理依赖呢?


Node.js安装依赖

image.png

项目依赖可以通过package.json管理,在代码中可以通过require方法引入某些依赖。依赖的查找路径是先查询项目目录再查询系统目录。

image.png

这种查找依赖所在路径的方式得益与Node.js包管理机制。要让运行在FaaS中的Node.js代码能够找到依赖,解决方法就是避免使用全局依赖,把所有的依赖都安装在node_modules中,然后把node_modules和代码一同部署在FaaS上。

对于Node.js来说,除了可以直接安装在node_moudles中的JS依赖外,还会使用C++来编写一些Node.js扩展

那么这些C++的扩展怎么安装呢?

先把C++代码编译为.node文件,再把编译产物和代码一同部署在FaaS平台。

代码示例

https://gitee.com/pingfanrenbiji/serverless-class/tree/master/06


image.png

使用C++编译之后的可执行文件需要和FaaS平台的运行环境兼容,不然就没有办法运行,所以跟Java一样,编写C++扩展的时候,需要使用统一的构建机,并且构建机的运行环境和Faas平台的运行环境保持一致。

依赖包体积太大,导致函数无法部署的问题

FaaS平台对代码体积有限制,函数计算限制是100MB,限制本质上是为了提高函数性能,因为FaaS构建函数实例的时候需要从文件存储当中下载代码,代码体积过大的话,耗时就会越来越长,这就会影响函数启动速度。

在Node.js中代码体积问题尤为常见。

node_moudles包体积经常会非常大,虽然说node.js的npm生态为编程带来了便利,但node_modules嵌套层级冗余代码多模块当中还包含了很多测试用例和源代码,这就很容易导致代码体积快速膨胀。

可能大部分时候引入一个新的代码依赖真正需要执行的代码就几行但是包的体积却有几MB,部署函数到FaaS上的时候就会造成不必要的资源浪费。

想办法减少模块的体积

在编译的过程当中分析代码的依赖,只把需要使用的模块和需要引入的函数构建打包,丢弃无用的代码,对代码进行压缩,这个过程和前端使用的webpack构建的redis.js的过程一样,要实现Node.js代码的编译也可以使用webpack来实现。Vercel是基于webpack开发的ncc工具,使用ncc可以把复杂的Node.js项目编译为单个文件并且去掉不必要的依赖,很大程度上就减少了代码的体积。

https://gitee.com/pingfanrenbiji/ncc

总的来说Node.js安装依赖都是比较方便的,因为是它的依赖可以轻松的安装在项目目录当中,但对于Python这种依赖需要安装在系统目录当中的编程语言到底要怎么去安装依赖呢?


Python安装依赖

pip是当前python当中最流行的包管理工具,所以通常会使用pip来安装依赖。

给Python项目安装依赖比较麻烦的地方在于使用pip安装的依赖通常会散落在系统的各个文件中

比如Python类库和动态链接都会放在/{user}/lib/python/site-packages、可执行文件都会放在/user/bin目录下,想要将所有文件都存放在同一个目录当中就会比较麻烦,pip提供了多种把依赖安装在指定目录的方案。


方法一:使用--install-option参数

image.png

可以让你精确的控制某个类型的依赖安装路径。

将模块安装到指定目录

image.png

把所有目录安装到指定目录或者--prefex=${pwd}当前目录,这样更方便依赖的管理。

有一个很大的问题就是在安装的过程中需要根据源码重新的构建依赖,如果某一个依赖包没有源码那就没有办法使用了,而且install-options参数设置比较复杂。


方法二:--target参数

这个是简单些的方式。

target参数可以将依赖直接安装到当前目录,不会产生lib/python3.7/site-packages子目录结构,适合依赖较少的情况下。


方法三:使用virtualenv

image.png

把python包安装到一个独立的虚拟环境中,这样就可以在虚拟环境中为代码安装所有的依赖,形态上你的代码和依赖就完全在同一个目录中了,这样就可以把依赖和代码一同部署到FaaS上了。

好处是不会污染全局环境不会把包管理相关的工具都本地化。

缺点就是会增加包的体积。

Python解析依赖的路径

image.png

但是对python来说把包安装到当前目录还不够,还需要修改python解析依赖的路径,可以通过sys.path查看python解析依赖的路径。

如果你的依赖直接安装在当前目录还好,因为sys.path包含了当前目录。

代码当中可以直接引入依赖,但通常不会将依赖安装在当前目录,因为这样会导致当前目录下的文件十分混乱,而是将他们安装在当前目录的lib/python3.7/site-packages目录下。

将python依赖包目录添加到sys.path中

image.png

需要在代码中修改sys.path,将子目录加入到sys.path之后,你才能使用其中的依赖模块。

小结

  • • 不同编程语言包管理机制不同,安装依赖的方式也不尽相同,但本质上,都是需要将依赖安装到应用项目中,并且随项目一起部署到FaaS平台。
  • • 开发框架也在解决安装依赖的问题,让用户尽可能的最低成本完成应用的开发。
  • • Serverless应用的代码依赖和系统依赖都需要安装在项目中和应用代码一起部署到FaaS平台
  • • FaaS对代码体积大小有限制,所以最好要精简依赖体积
  • • 如果代码或依赖需要编译,则编译环境需要和FaaS运行环境兼容,不然编译后的产物可能无法运行。




相关实践学习
【文生图】一键部署Stable Diffusion基于函数计算
本实验教你如何在函数计算FC上从零开始部署Stable Diffusion来进行AI绘画创作,开启AIGC盲盒。函数计算提供一定的免费额度供用户使用。本实验答疑钉钉群:29290019867
建立 Serverless 思维
本课程包括: Serverless 应用引擎的概念, 为开发者带来的实际价值, 以及让您了解常见的 Serverless 架构模式
相关文章
|
10天前
|
监控 安全 Serverless
"揭秘D2终端大会热点技术:Serverless架构最佳实践全解析,让你的开发效率翻倍,迈向技术新高峰!"
【10月更文挑战第23天】D2终端大会汇聚了众多前沿技术,其中Serverless架构备受瞩目。它让开发者无需关注服务器管理,专注于业务逻辑,提高开发效率。本文介绍了选择合适平台、设计合理函数架构、优化性能及安全监控的最佳实践,助力开发者充分挖掘Serverless潜力,推动技术发展。
25 1
|
14天前
|
缓存 前端开发 JavaScript
前端serverless探索之组件单独部署时,利用rxjs实现业务状态与vue-react-angular等框架的响应式状态映射
本文深入探讨了如何将RxJS与Vue、React、Angular三大前端框架进行集成,通过抽象出辅助方法`useRx`和`pushPipe`,实现跨框架的状态管理。具体介绍了各框架的响应式机制,展示了如何将RxJS的Observable对象转化为框架的响应式数据,并通过示例代码演示了使用方法。此外,还讨论了全局状态源与WebComponent的部署优化,以及一些实践中的改进点。这些方法不仅简化了异步编程,还提升了代码的可读性和可维护性。
|
28天前
|
监控 Serverless 云计算
探索Serverless架构:开发的未来趋势
【10月更文挑战第5天】Serverless架构,即无服务器架构,正逐渐成为云计算领域的热点。它允许开发者构建和运行应用程序而无需管理底层服务器。本文介绍了Serverless架构的基本概念、核心优势及挑战,并展示了其在事件驱动编程、微服务架构和数据流处理等场景中的应用。通过优化冷启动、使用外部存储等实战技巧,开发者可以更好地利用Serverless架构提升开发效率和应用性能。随着技术的成熟,Serverless将在未来软件开发中扮演重要角色。
|
3月前
|
缓存 运维 Serverless
函数计算产品使用问题之如何在Custom Runtime中引用层中的依赖
函数计算产品作为一种事件驱动的全托管计算服务,让用户能够专注于业务逻辑的编写,而无需关心底层服务器的管理与运维。你可以有效地利用函数计算产品来支撑各类应用场景,从简单的数据处理到复杂的业务逻辑,实现快速、高效、低成本的云上部署与运维。以下是一些关于使用函数计算产品的合集和要点,帮助你更好地理解和应用这一服务。
|
3月前
|
小程序 Serverless 开发工具
小程序开发问题之在小程序中安装并初始化小程序Serverless客户端SDK如何解决
小程序开发问题之在小程序中安装并初始化小程序Serverless客户端SDK如何解决
|
3月前
|
运维 物联网 关系型数据库
关于阿里云Serverless 框架的产品体验
阿里云Serverless框架简化运维,实现5分钟一键部署。弹性伸缩、按需付费等特点让企业专注业务创新,降低成本与运维负担。适用于Web应用、数据分析、物联网等多种场景,支持快速迭代与多语言开发。尽管面临资源配额、网络配置等挑战,其竞争力在于成本节约、功能集成与性能优化,尤其适合追求高效开发与弹性扩展的团队。
91 1
|
4月前
|
JSON 运维 Serverless
Serverless 应用引擎使用问题之ThinkPHP框架是否有基于SDK的demo
阿里云Serverless 应用引擎(SAE)提供了完整的微服务应用生命周期管理能力,包括应用部署、服务治理、开发运维、资源管理等功能,并通过扩展功能支持多环境管理、API Gateway、事件驱动等高级应用场景,帮助企业快速构建、部署、运维和扩展微服务架构,实现Serverless化的应用部署与运维模式。以下是对SAE产品使用合集的概述,包括应用管理、服务治理、开发运维、资源管理等方面。
|
3月前
|
前端开发 大数据 数据库
🔥大数据洪流下的决战:JSF 表格组件如何做到毫秒级响应?揭秘背后的性能魔法!💪
【8月更文挑战第31天】在 Web 应用中,表格组件常用于展示和操作数据,但在大数据量下性能会成瓶颈。本文介绍在 JavaServer Faces(JSF)中优化表格组件的方法,包括数据处理、分页及懒加载等技术。通过后端分页或懒加载按需加载数据,减少不必要的数据加载和优化数据库查询,并利用缓存机制减少数据库访问次数,从而提高表格组件的响应速度和整体性能。掌握这些最佳实践对开发高性能 JSF 应用至关重要。
65 0
|
3月前
|
存储 设计模式 运维
Angular遇上Azure Functions:探索无服务器架构下的开发实践——从在线投票系统案例深入分析前端与后端的协同工作
【8月更文挑战第31天】在现代软件开发中,无服务器架构因可扩展性和成本效益而备受青睐。本文通过构建一个在线投票应用,介绍如何结合Angular前端框架与Azure Functions后端服务,快速搭建高效、可扩展的应用系统。Angular提供响应式编程和组件化能力,适合构建动态用户界面;Azure Functions则简化了后端逻辑处理与数据存储。通过具体示例代码,详细展示了从设置Azure Functions到整合Angular前端的全过程,帮助开发者轻松上手无服务器应用开发。
26 0
|
4月前
|
运维 Serverless API
Serverless 应用引擎使用问题之如何开发HTTP服务
阿里云Serverless 应用引擎(SAE)提供了完整的微服务应用生命周期管理能力,包括应用部署、服务治理、开发运维、资源管理等功能,并通过扩展功能支持多环境管理、API Gateway、事件驱动等高级应用场景,帮助企业快速构建、部署、运维和扩展微服务架构,实现Serverless化的应用部署与运维模式。以下是对SAE产品使用合集的概述,包括应用管理、服务治理、开发运维、资源管理等方面。

相关产品

  • 函数计算