做网站后期需要什么费用,本地门户网怎么做,闷声赚钱的10个副业,网络营销是什么岗位简介#xff1a;本文将借助 Serverless Devs 工具#xff0c;对函数计算 (FC#xff09;应用的断点调试步骤进行详细指导#xff0c;手把手带你实现 Serverless 的断点调试#xff0c;并从以下四个方面为你厘清“硬核调试”的脉络步骤#xff0c;干货满满。
导读#x…简介本文将借助 Serverless Devs 工具对函数计算 (FC应用的断点调试步骤进行详细指导手把手带你实现 Serverless 的断点调试并从以下四个方面为你厘清“硬核调试”的脉络步骤干货满满。
导读在应用开发过程中或者开发完成后若出现执行结果不符合我们的预期时通常需要进行一定的调试工作。但是在 Serverless 架构下调试工作往往会受到一些环境因素限制如所开发的应用在本地是比较健康的、且符合预期的运行但是在 FaaS 平台上出现了一些问题或者是在某些特殊的环境下本地没有办法模拟线上环境难以进行项目的开发和调试怎么办
概述
本文将借助 Serverless Devs 工具对函数计算 (FC应用的断点调试步骤进行详细指导手把手带你实现 Serverless 的断点调试并从以下四个方面为你厘清“硬核调试”的脉络步骤干货满满
一、概述部分介绍了调试能力的重要性以及当前阿里云函数计算FC所能提供的调试能力
二、调试之旅罗列了关于 “使用 Serverless Devs 在不同 IDE 中进行断点调试” 的详细步骤
三、总结部分客观诉说断点调试的待改进之处
四、附录则为各位开发者汇总了断点调试操作的详细动图。
在 Serverless 应用架构下调试能力往往是应用开发者所十分关注的问题它决定着程序的开发效率。Hackernoon 在关于 Serverless无服务器的业界调研报告指出迄今为止Debugging调试仍旧是 Serverless 落地最大的痛点与挑战。 报告《Top 5 Serverless Trends》Top 5 Serverless Trends in 2020 | HackerNoon
调试能力主要包含两种一是运行程序的能力二是断点调试能力。前者是调试的基础能力可以判帮助开发者判断程序能否正常运行验证程序运行结果的正确性后者是调试的高级能力能够帮助用户方便定位到导致程序运行出错或者不符合预期的位置。
目前业界已有的 Serverless 应用调试手段主要是在本地模拟云端执行环境进行本地调试或者将应用部署到云端运行后基于日志进行调试。然而本地调试无法模拟云端的网络环境云端调试又缺乏本地的灵活性。为了能够克服这些缺陷将 Serverless 应用调试做到开箱即用阿里云函数计算团队经过一番探索开发出了一套业界创新的调试工具全方位提供本地调试以及端云联调能力。
本地调试基于本地环境以及网络依赖容器化技术对 Serverless 应用进行拟运行从而达到调试的目的具体操作文档可参考。fc/local.md at main · devsapp/fc · GitHub端云联调基于本地环境突破网络限制依赖容器化技术对 Serverless 应用进行拟运行运行时打通本地与云端网络的壁垒保证与云端资源的交互使用文档请参考。
fc/proxied.md at main · devsapp/fc · GitHub
本文所提到的本地调试工具均提供断点调试能力且与 Serverless 应用程序开发规范完全兼容下面我们一起看一下关于断点调试的具体操作步骤。
调试之旅
断点调试步骤总结为如下流程下面我将带领各位围绕这四个步骤开启一场断点调试之旅
启动 Serverless 应用启动断点调试器开始断点调试结束断点调试
1、前置操作
在开始进行调试之前需要进行一些前置操作本文将前置操作分为通用前置操作以及端云联调附加的前置操作
通用前置操作安装调试 IDE:可选的 IDE 有 VSCode、Pycharm 以及 Intellij 三种随后在开始使用这些功能之前请安装好调试工具: 这里我们需要安装一下 Serverless Devs具体的安装方式参考文档
安装Serverless Devs - 函数计算 - 阿里云 熟悉新一代函数计算工具链的使用方式可参考
GitHub - devsapp/fc: 阿里云函数计算FC组件
下载安装 Docker:调试能力都需要依赖 Docker因此需要本地环境中有 Docker 工具安装方式请参考这里:
Get Docker | Docker Documentation
最后还需要注册一个阿里云账号使用 Serverless Devs 配置阿里云账号具体配置方式可以参考这里。
配置Serverless Devs - 函数计算 - 阿里云
端云联调附加的前置操作准备一个阿里云账号由于端云联调涉及到辅助资源的部署和删除如果账号为子账号需要为该子账号添加指定的一些权限具体权限集合可以参考。fc/proxied.md at main · devsapp/fc · GitHub
2、参数引入
完成以上前置条件的准备后我们先了解一下调试指令中与断点调试所相关的具体参数 -c, --config [vscode/pycharm/intellij] [Required] Select which IDE to use when debugging and output related debug config tips for the IDE. value: vscode/pycharm/intellij -d, --debug-port number [Required] Specify the local function container starting in debug mode, and exposing this port on localhost --debug-args string [Optional] Additional parameters that will be passed to the debugger --debugger-path string [Optional] The path of the debugger on the host --tmp-dir string [Optional] The temp directory mounted to /tmp , default: ./.s/tmp/invoke/serviceName/functionName/ 使用断点调试时--config 参数以及 --debug-port 参数是必要的
--config 会指定断点调试的 IDE 环境目前支持 VSCode、Pycharm 、Intellij 三种。--debug-port 会指定调试的监听端口。
另外其余三种参数是可选的
--debug-args 会自定义程序启动时的调试参数不指定时默认的调试参数可以参考文末附录部分。--debugger-path 会将本地指定路径挂载到程序运行环境的 /tmp/debugger_file之中。--tmp-dir 会将本地指定路径挂载到程序运行环境中的 /tmp 目录上在调试时程序写入 /tmp 的结果文件则会在映射到本地目录用于验证结果是否符合预期。
3、实操演练
1VSCode
使用 VSCode 进行断点调试时流程十分简单下面我们将断点调试场景分为 Event 函数调试和 Http 函数调试两种分别进行介绍。
调试 Event 函数
step1首先启动 Serverless 应用打开终端进入目标项目下输入启动指令: # 本地调试 $ s local invoke --config vscode --debug-port 3000 # 端云联调 $ s proxied setup --config vscode --debug-port 3000 启动指令执行后本地的函数计算执行环境会有一定阻塞我们需要等待调用与此同时当前项目会生成 .vscode/launch.json 文件该文件是基于 VSCode 进行调试的配置文件若该文件已经存在那么启动指令会打印相应配置文本如下图所示需要利用这部分内容覆盖已有 .vscode/launch.json 中的内容。 .vscode/launch.json 更新内容示例
step2启动断点调试器打开 VSCode 界面然后打开 s.yml 中 codeUri 所存放的源代码为其打上断点接着点击开始调试按钮具体执行如下图所示。 VSCode 启动调试器示意图
对于本地调试而言启动调试器后程序便已经启动此时就可以开始进行我们的断点调试工作了。如果是端云联调的话启动调试器后在启动指令终端页面会出现 Debugger attached. 字段这时说明调试器也已启动成功正在等待被调用接下来我们继续进行如下步骤即可。
step3开始断点调试打开一个新的终端页面输入调用指令 s proxied invoke --event hello后程序启动断点调试开始。
step4结束断点调试调试结束后主动关闭断点调试器。端云联调场景下会创建一系列辅助函数资源因此调试完成后这里需要进行辅助资源释放防止额外的费用产生只需执行 s proxied cleanup 即可释放辅助资源。
调试 php7.2 Event 函数
php7.2 runtime 的本地调试 IDE 建议使用 VSCode其断点调试步骤与其他语言有一定差异性因此单独进行介绍。目前 php7.2 runtime 不支持端云联调断点调试。
step1首先启动 Serverless 应用打开终端进入目标项目下输入启动指令 s local invoke --config vscode --debug-port 3000。
与之前不同的是Event 函数启动指令执行完成后并不会出现阻塞的情况而是会直接执行成功同时在当前项目下会生成 .vscode/launch.json 文件如前文所述。
step2启动断点调试器打开 VSCode 界面然后打开 s.yml 中 codeUri 所存放的源代码为其打上断点接着点击开始调试按钮具体执行如下图所示。 step3开始断点调试打开一个新的终端页面再次输入启动指令 s local invoke --config vscode --debug-port 3000后程序启动断点调试开始。
step4结束断点调试调试结束后主动关闭断点调试器。
调试 Http 函数
端云联调中对 Http 函数的调试方式实际上与 Event 函数相同因此不再赘述本节我们主要介绍下本地调试关于 Http 函数应该如何进行调试。
step1启动 Serverless 应用首先打开终端进入目标项目下输入启动指令 s local start --config vscode --debug-port 3000启动指令执行后本地的函数计算执行环境会阻塞等待调用并打印访问 http 函数的 url 字段。
step2启动断点调试器打开 VSCode 界面然后打开 s.yml 中 codeUri 存放的源代码为其打上断点接着点击开始调试按钮如图所示。此时在启动指令终端页面会出现 Debugger attached. 字段说明调试器启动成功等待被调用。 VSCode 启动调试器示意图
step3开始断点调试可以通过 curl 指令、浏览器等方式访问 Http 函数的 URL此时程序启动断点调试开始。
step4结束断点调试调试完成后主动关闭断点调试器然后在启动指令终端页面执行 CtrlC 即可退出调试进程。
调试 php7.2 Http 函数
php7.2 runtime 的本地调试 IDE 建议使用 VSCode其断点调试步骤与其他语言有一定差异性因此单独进行介绍。目前 php7.2 runtime 不支持端云联调断点调试。
step1首先启动 Serverless 应用打开终端进入目标项目下输入启动指令 s local start --config vscode --debug-port 3000启动指令执行后会在当前项目下会生成 .vscode/launch.json 文件如前文所述同时项目会阻塞住此时需要执行 CtrlC 退出。
step2启动断点调试器打开 VSCode 界面然后打开 s.yml 中 codeUri 所存放的源代码为其打上断点接着点击开始调试按钮具体执行如下图所示。 step3开始断点调试打开一个新的终端页面再次输入启动指令 s local start --config vscode --debug-port 3000后本地的函数计算执行环境会阻塞等待调用并打印访问 http 函数的 url 字段可以通过 curl 指令、浏览器等方式访问 Http 函数的 URL此时程序启动断点调试开始。
step4结束断点调试调试完成后主动关闭断点调试器然后在启动指令终端页面执行 CtrlC 即可退出调试进程。
2Intellij
基于 Intellij 进行断点调试时针对不同语言需要手动在 IDE 中配置相应地断点调试器由于使用 Intellij 开发最多的语言是 Java同时更换 IDE 后唯一不同的步骤只有“启动断点调试器”因此接下来我们将以本地调试 Java Event 函数为例对“启动断点调试器”步骤进行详细说明。
step1启动 Serverless 应用 由于 Java 是编译型语言因此在开始前需要对程序进行打包本文示例会使用 mvn package 对函数打包然后执行启动指令 s local invoke --config intellij --debug-port 3000。
step2启动断点调试器打开 Intellij 界面在菜单栏依次选择 Run - Edit Configurations。
随后如下图所示新建一个 Remote JVM Debug。 新建 Remote JVM Debug
接着自定义调试器名称并将端口设置为 3000如下图所示。 Intellij 调试器配置
最后打开 s.yml 中 codeUri 存放的源代码为其打上断点接着点击开始调试按钮如图所示。 Intellij 启动断点调试器
3Pycharm
当前只有本地调试能够在 Pycharm 中进行断点调试操作支持的运行时有 python2.7 和 python3两个版本。在 Pycharm 中进行断点调试时不仅需要在 IDE 中配置断点调试器还需要对使用者的源码进行侵入式修改由于操作步骤内容与常规内容有所不同接下来我们详解一下这部分的调试步骤。 step1启动 Serverless 应用首先打开终端进入目标项目下输入启动指令: # event 函数 $ s local invoke --config pycharm --debug-port 3000 # http 函数 $ s local start --config pycharm --debug-port 3000 与之前不同的是Event 函数启动指令执行完成后并不会出现阻塞的情况而是会直接执行成功。此时就需要记录 Tips for PyCharm remote debug 内容具体内容示例如图所示记录完成后如果是 Http 函数则输入 CtrlC 退出启动程序。 Tips for PyCharm remote debug 内容示例
step2接下来启动断点调试器启动断点调试器主要包含 IDE 断点调试器配置和源码更新两部分。
首先打开 pycharm 界面在菜单栏依次选择 Run - Edit Configurations。
接下来如图中所示新建一个 Python Debug Server。 新建 Python Debug Server
随后设置自定义调试器名称并基于图五中获取的内容配置 IDE host name、Port 以及 Path mappings 这三个调试器配置的详情如图中所示。 pycharm 调试器配置
随后打开 s.yml 中 codeUri 存放的源代码将例图中Tips for PyCharm remote debug 内容示例的代码内容粘贴到代码开头然后按需在源码指定位置打上断点接着点击开始调试按钮具体操作如图 pycharm 启动断点调试器所示。 Tips for PyCharm remote debug 内容示例 pycharm 启动断点调试器
step3开始断点调试打开终端并进入目标项目执行启动指令p.S.此时可以不用带上断点调试的相关参数。 # event 函数 $ s local invoke # http 函数 $ s local start Event 函数启动指令执行后会直接进入断点调试阶段Http 函数启动指令执行后可以先通过 curl 指令、浏览器等方式访问 Http 函数的 URL此时程序会启动断点调试就开始了。
step4结束断点调试调试完成后主动关闭断点调试器对于 Http 函数而言在启动指令终端页面需执行 CtrlC 方可退出调试进程。
结语
Serverless 应用的调试虽然备受诟病但是各个云厂商并没有因此放弃在调试方向的不断深入探索。以阿里云函数计算为例目前支持提供在线调试、本地调试、端云联调等多种调试方案。而 Serverless Devs 工具所提供的应用调试能力也十分全面了。
上文是我所分享的一些实操经验但是在过程中也发现了一些待改进的点如
断点调试步骤繁琐需要在多个页面来回切换如果能将工具集成到 IDE以插件化形态供所用户使用简化流程那么体验感会大幅提升。断点调试模式下的热更能力Http 函数的断点调试过程中并不支持代码热更新每次修改完代码后都需要重新执行一遍断点调试流程体验不太流畅。断点调试能力目前还未全面覆盖所有 Runtime例如 custom runtime 不支持断点调试php runtime 不支持端云联调断点调试等。
希望本文对你有些帮助。
原文链接
本文为阿里云原创内容未经允许不得转载。