GCLI-闲鱼FaaS开发利器

本文涉及的产品
函数计算FC,每月15万CU 3个月
简介: FaaS研发效率利器

作者:闲鱼技术-无浩

关于GCLI

闲鱼技术团队推行了基于Flutter+Servless的一体化研发方案, 在Serverless技术的加持下,客户端开发可以轻松独立完成业务闭环。FaaS作为Serverless技术业务功能主要载体,其开发效率影响需求交付的速度。GCLI是一个基于支撑FaaS研发生命周期的命令行工具,它定义了闲鱼FaaS开发闭环,统一了FaaS的研发环境,是提升FaaS研发效率的利器。

关键问题

FaaS开发闭环

下图是简化后的闲鱼FaaS开发视角下的开发生命周期,和传统服务端开发相同,图中2.1~2.3是最高频动作,将这些动作串联起来、提供标准的操作语义,以高效的运转对于提升FaaS开发生产力至关重要。闲鱼FaaS希望给用户提供像开发本地函数一样开发FaaS代码的体验。

    ![image.png](https://ucc.alicdn.com/images/lark/0/2020/png/18740/1590387303295-d199b83c-3eb4-448e-a935-a97814e3a99e.png)
      

研发环境统一

闲鱼的FaaS自建了一套适配自家JAVA生态的工具链以简化FaaS的编程平面,但同时引入了开发环境的一致性问题, 开发环境不能收敛管理可能带来

  • 陷入「It works for me」困境,开发环境的干扰让问题本质迟迟无法重现
  • 开发环境退化,如环境变量被覆盖、OS被动升级导致兼容性问题等
  • 开发环境适应,基于linux开发的库、工具无法在非linux环境下运行
  • Start From Scratch, 对于一个新的技术栈,开发环境安装和配置是阻碍用户尝试创新的因素之一

上述几点在闲鱼的实践里得到了应验,之后闲鱼尝试基于WebIDE开发来解决环境的问题,但现阶段体验上和理想有差距,WebIDE由于用户研发习惯和工具也得不到很好的继承,开发效率反而因此下降;如何统一开发环境、延续用户开发习惯也是需要重点考虑的。

GCLI的解决方案

为了解决上面两个核心问题,如下图所述,GCli将研发闭环拆解成适合Serverless研发风俗的开发指令;为了让用户继承其研发习惯和工具,闲鱼优先选择了基于本地的开发方案;使用Docker技术统一开发环境,在Dcoker内声明Dart FaaS技术栈依赖的运行环境(软件+配置)。
image.png
借助容器技术,FaaS的软件环境可以移植到任何支持Linux运行的操作系统,从而解决了环境统一的问题;GCLI通过FaaS Open API实现本地和函数平台实现互操作,形成完整的研发闭环。

GCLI命令行

GCLI命令行被设计Standalone的可执行程序以消除编程语言Runtime的依赖。它会将用户开发指令转换为Docker的操作命令,并以一定的策略来控制Docker的生命周期。下面是GCLI的功能片段:
image.png
用户可以借助GCLI定义的研发指令开发函数。例如用户用开启热部署,只用关心代码编写,GCLI将代码实时同步到云端,随后调用一次函数并观察函数返回和结果即可。

  • 利用GCLI热部署和日志指令开发函数
#打开热部署能力,实时监听代码变化,并实时在云端生效
gcli hotdeploy -f my_function --watch
#调用远程函数,获取调用结果
gcli invoke -f my_function --data '{"data":{}}'
#查看云端函数日志以tail的方式运行
gcli logs -f my_function --tail
  • 本地运行或debug函数
#本地拉起函数容器
gcli local start
#本地debug
gcli local debug

GCLI Docker容器

GCLI Docker容器希望提供一个和技术栈无关的FaaS开发镜像规范,并解决与IDE本地协同开发的问题。在基于Dart的FaaS技术栈里,容器的设计参考下图:

    ![image.png](https://ucc.alicdn.com/images/lark/0/2020/png/18740/1590397735949-8810d36b-3f39-4b33-b5f5-5c2ef0305b24.png)
      
  • 宿主机IDE侧

    • 用户代码目录通过bind mount到Container,然后在容器内完成编译,之后的产物能够被IDE识别
    • GCLI通过Docker同步的配置文件,执行端口映射、bind mount或环境变量导入操作
    • 宿主通过Volume共享容器内的文件(如Pub仓库、Maven仓库),提升编译速度
    • 宿主通过NAT地址转换和容器打通网络,端口转换信息定义在GCLI的配置文件里
  • 容器侧

    • 镜像加速区,为了提升编译的速度,在镜像里预置了可能需要的缓存文件以及环境变量
    • 软件仓库,定义需要同步到host的软件
    • 编译/运行时环境,包括语言运行时、环境变量、仓库等
    • 定制软件,GCLI提供的开发指令的实现来自这里

有了对开发容器的抽象和定义,对于开发环境的提供者只要遵循镜像的设计标准,即可以复用GCLI的能力,快速交付一个基于统一开发环境的研发工具。

 

总结和展望

闲鱼自从在FaaS开发中实施了GCLI,开发人员在下面几点上获益:

  • 开发门槛降低了,对跨栈开发友好,非Dart技术栈开发人员可以在30分钟内从裸机到完成开发部署FaaS服务。
  • 本地开发环境稳定可靠,彻底消灭了开发环境不一致引起的问题,节约了宝贵的开发时间。
  • 开发闭环指令简单易用,而在GCli产出之前,50%的开发会由于定制开发工具复杂、易出错而选择放弃使用,进而选择传统低效的开发方式。以部署为例,传统方式需要10分钟完成部署,GCLI只需要5秒。
  • 容忍Windows等操作系统的开发,对于一种新的开发模式推广有正面作用。

文章前面提过GCLI为了延续用户的开发习惯,选择在宿主机IDE开发代码,基于Docker的GCLI解决了统一环境问题,但由于共享开发机的方式对于宿主的性能有一定要求,在非Linux系统上运行Docker多了虚拟机的开销,在本地运行Docker并不是提升编译性能的最优解。未来,特别在云原生开发技术不断发展中,不单是FaaS技术栈,开发环境会逐渐走向容器化,云主机托管用户的开发环境,另外IDE的职责更加单一,更加轻量化。作为对开发技术最了解的架构人员可以根据规范交付开发镜像,让开发人员享受「统一」带来的红利。
                                      

相关实践学习
【文生图】一键部署Stable Diffusion基于函数计算
本实验教你如何在函数计算FC上从零开始部署Stable Diffusion来进行AI绘画创作,开启AIGC盲盒。函数计算提供一定的免费额度供用户使用。本实验答疑钉钉群:29290019867
建立 Serverless 思维
本课程包括: Serverless 应用引擎的概念, 为开发者带来的实际价值, 以及让您了解常见的 Serverless 架构模式
相关文章
|
运维 Serverless 云计算
云上开发新范式:Serverless 的必然与应然 | 云栖深度对话
云上开发新范式:Serverless 的必然与应然 | 云栖深度对话
|
20天前
|
监控 Serverless 云计算
探索Serverless架构:开发实践与优化策略
本文深入探讨了Serverless架构的核心概念、开发实践及优化策略。Serverless让开发者无需管理服务器即可运行代码,具有成本效益、高可扩展性和提升开发效率等优势。文章还详细介绍了函数设计、安全性、监控及性能和成本优化的最佳实践。
|
1月前
|
监控 安全 Serverless
"揭秘D2终端大会热点技术:Serverless架构最佳实践全解析,让你的开发效率翻倍,迈向技术新高峰!"
【10月更文挑战第23天】D2终端大会汇聚了众多前沿技术,其中Serverless架构备受瞩目。它让开发者无需关注服务器管理,专注于业务逻辑,提高开发效率。本文介绍了选择合适平台、设计合理函数架构、优化性能及安全监控的最佳实践,助力开发者充分挖掘Serverless潜力,推动技术发展。
68 1
|
2月前
|
监控 Serverless 云计算
探索Serverless架构:开发的未来趋势
【10月更文挑战第5天】Serverless架构,即无服务器架构,正逐渐成为云计算领域的热点。它允许开发者构建和运行应用程序而无需管理底层服务器。本文介绍了Serverless架构的基本概念、核心优势及挑战,并展示了其在事件驱动编程、微服务架构和数据流处理等场景中的应用。通过优化冷启动、使用外部存储等实战技巧,开发者可以更好地利用Serverless架构提升开发效率和应用性能。随着技术的成熟,Serverless将在未来软件开发中扮演重要角色。
|
5月前
|
运维 Serverless API
Serverless 应用引擎使用问题之如何开发HTTP服务
阿里云Serverless 应用引擎(SAE)提供了完整的微服务应用生命周期管理能力,包括应用部署、服务治理、开发运维、资源管理等功能,并通过扩展功能支持多环境管理、API Gateway、事件驱动等高级应用场景,帮助企业快速构建、部署、运维和扩展微服务架构,实现Serverless化的应用部署与运维模式。以下是对SAE产品使用合集的概述,包括应用管理、服务治理、开发运维、资源管理等方面。
|
4月前
|
前端开发 大数据 数据库
🔥大数据洪流下的决战:JSF 表格组件如何做到毫秒级响应?揭秘背后的性能魔法!💪
【8月更文挑战第31天】在 Web 应用中,表格组件常用于展示和操作数据,但在大数据量下性能会成瓶颈。本文介绍在 JavaServer Faces(JSF)中优化表格组件的方法,包括数据处理、分页及懒加载等技术。通过后端分页或懒加载按需加载数据,减少不必要的数据加载和优化数据库查询,并利用缓存机制减少数据库访问次数,从而提高表格组件的响应速度和整体性能。掌握这些最佳实践对开发高性能 JSF 应用至关重要。
75 0
|
4月前
|
存储 设计模式 运维
Angular遇上Azure Functions:探索无服务器架构下的开发实践——从在线投票系统案例深入分析前端与后端的协同工作
【8月更文挑战第31天】在现代软件开发中,无服务器架构因可扩展性和成本效益而备受青睐。本文通过构建一个在线投票应用,介绍如何结合Angular前端框架与Azure Functions后端服务,快速搭建高效、可扩展的应用系统。Angular提供响应式编程和组件化能力,适合构建动态用户界面;Azure Functions则简化了后端逻辑处理与数据存储。通过具体示例代码,详细展示了从设置Azure Functions到整合Angular前端的全过程,帮助开发者轻松上手无服务器应用开发。
34 0
|
4月前
|
监控 Serverless Go
Golang 开发函数计算问题之Go 语言中切片扩容时需要拷贝原数组中的数据如何解决
Golang 开发函数计算问题之Go 语言中切片扩容时需要拷贝原数组中的数据如何解决
|
4月前
|
Java Serverless Go
Golang 开发函数计算问题之在 Golang 中避免 "concurrent map writes" 异常如何解决
Golang 开发函数计算问题之在 Golang 中避免 "concurrent map writes" 异常如何解决
|
4月前
|
Serverless Go
Golang 开发函数计算问题之defer 中的 recover() 没有捕获到 如何解决
Golang 开发函数计算问题之defer 中的 recover() 没有捕获到 如何解决