共计 7594 个字符,预计需要花费 19 分钟才能阅读完成。
导读:在利用开发过程中,或者开发实现后,若呈现执行后果不合乎咱们的预期时,通常须要进行肯定的调试工作。然而在 Serverless 架构下,调试工作往往会受到一些环境因素限度,如所开发的利用在本地是比拟衰弱的、且合乎预期的运行,然而在 FaaS 平台上,呈现了一些问题;或者是在某些非凡的环境下,本地没有方法模仿线上环境,难以进行我的项目的开发和调试怎么办?
概述
本文将借助 Serverless Devs 工具,对函数计算 (FC)利用的断点调试步骤进行具体领导,手把手带你实现 Serverless 的断点调试,并从以下四个方面为你厘清“硬核调试”的脉络步骤,干货满满:
一、概述局部 介绍了调试能力的重要性,以及以后阿里云函数计算(FC)所能提供的调试能力;
二、调试之旅 列举了对于“应用 Serverless Devs 在不同 IDE 中进行断点调试”的具体步骤;
三、总结 局部主观诉说断点调试的待改良之处;
四、附录 则为各位开发者汇总了断点调试操作的具体动图。
在 Serverless 利用架构下,调试能力 往往是利用开发者所非常关注的问题,它决定着程序的开发效率。Hackernoon 在对于 Serverless(无服务器)的业界调研报告指出:迄今为止,Debugging(调试)仍旧是 Serverless 落地最大的痛点与挑战。
报告《Top 5 Serverless Trends》:https://hackernoon.com/top-5-serverless-trends-in-2020-wd1m3t8g
调试能力次要蕴含两种,一是运行程序的能力;二是断点调试能力。前者是调试的根底能力,能够判帮忙开发者判断程序是否失常运行,验证程序运行后果的正确性;后者是调试的高级能力,可能帮忙用户不便定位到导致程序运行出错或者不合乎预期的地位。
目前业界已有的 Serverless 利用调试伎俩,次要是在本地模仿云端执行环境进行本地调试;或者将利用部署到云端运行后基于日志进行调试。然而,本地调试无奈模仿云端的网络环境,云端调试又不足本地的灵活性。为了可能克服这些缺点,将 Serverless 利用调试做到开箱即用,阿里云函数计算团队通过一番摸索,开发出了一套业界翻新的调试工具,全方位提供本地调试以及端云联调能力。
- 本地调试:基于本地环境以及网络,依赖容器化技术,对 Serverless 利用进行拟运行,从而达到调试的目标,具体操作文档可参考。https://github.com/devsapp/fc/blob/main/docs/zh/command/local.md
- 端云联调:基于本地环境,冲破网络限度,依赖容器化技术,对 Serverless 利用进行拟运行,运行时买通本地与云端网络的壁垒,保障与云端资源的交互,应用文档请参考。https://github.com/devsapp/fc/blob/main/docs/zh/command/proxied.md
本文所提到的本地调试工具,均提供断点调试能力,且与 Serverless 利用程序开发标准齐全兼容,上面咱们一起看一下对于断点调试的具体操作步骤。
调试之旅
断点调试步骤 总结为如下流程,上面我将率领各位围绕这四个步骤,开启一场断点调试之旅:
- 启动 Serverless 利用
- 启动断点调试器
- 开始断点调试
-
完结断点调试
1、前置操作
在开始进行调试之前,须要进行一些前置操作,本文将前置操作分为 通用前置操作 以及 端云联调附加的前置操作:
-
通用前置操作:
- 装置调试 IDE: 可选的 IDE 有 VSCode、Pycharm 以及 Intellij 三种;
- 随后在开始应用这些性能之前,请装置好 调试工具: 这里咱们须要装置一下 Serverless Devs,具体的装置形式参考文档:https://help.aliyun.com/document_detail/195474.html;相熟新一代函数计算工具链的应用形式,可参考:https://github.com/devsapp/fc;
- 下载安装 Docker: 调试能力都须要依赖 Docker,因而须要本地环境中有 Docker 工具,装置形式请参考这里:https://docs.docker.com/get-docker/
- 最初还须要注册一个阿里云账号,应用 Serverless Devs 配置阿里云账号,具体配置形式能够参考这里。https://help.aliyun.com/document_detail/295894.html
-
端云联调附加的前置操作:
- 筹备一个 阿里云账号,因为端云联调波及到辅助资源的部署和删除,如果账号为子账号,须要为该子账号增加指定的一些权限,具体权限汇合能够参考。https://github.com/devsapp/fc/blob/main/docs/zh/command/proxied.md#%E6%9D%83%E9%99%90%E4%B8%8E%E7%AD%96%E7%95%A5%E8%AF%B4%E6%98%8E
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、实操演练
1)VSCode
应用 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:完结断点调试:调试实现后,被动敞开断点调试器,而后在启动指令终端页面,执行 Ctrl+C
即可退出调试过程。
- 调试 php7.2 Http 函数
php7.2 runtime 的 本地调试 IDE 倡议应用 VSCode,其断点调试步骤与其余语言有肯定差异性,因而独自进行介绍。目前 php7.2 runtime 不反对 端云联调断点调试。
step1:首先 启动 Serverless 利用,关上终端,进入指标我的项目下,输出启动指令 s local start --config vscode --debug-port 3000
,启动指令执行后,会在以后我的项目下会生成 .vscode/launch.json
文件,如前文所述,同时我的项目会阻塞住,此时须要执行 Ctrl+C
退出。
step2:启动断点调试器 ,关上 VSCode 界面,而后关上 s.yml 中 codeUri
所寄存的源代码,为其打上断点,接着点击开始调试按钮,具体执行如下图所示。
step3: 开始断点调试 :关上一个新的终端页面,再次输出启动指令 s local start --config vscode --debug-port 3000
后,本地的函数计算执行环境会阻塞期待调用,并打印拜访 http 函数的 url
字段,能够通过 curl 指令、浏览器等形式拜访 Http 函数的 URL,此时程序启动,断点调试开始。
step4:完结断点调试:调试实现后,被动敞开断点调试器,而后在启动指令终端页面,执行 Ctrl+C
即可退出调试过程。
2)Intellij
基于 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 启动断点调试器
3)Pycharm
以后只有本地调试可能在 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 函数,则输出 Ctrl+C
退出启动程序。
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 函数而言,在启动指令终端页面,需执行 Ctrl+C
方可退出调试过程。
结语
Serverless 利用的调试尽管备受诟病,然而各个云厂商并没有因而放弃在调试方向的不断深入摸索。以阿里云函数计算为例,目前反对提供 在线调试、本地调试、端云联调 等多种调试计划。而 Serverless Devs 工具所提供的利用调试能力也非常全面了。
上文是我所分享的一些实操教训,然而在过程中也发现了一些待改良的点,如:
- 断点调试步骤繁琐,须要在多个页面来回切换,如果能将工具集成到 IDE,以插件化状态供所用户应用,简化流程,那么体验感会大幅晋升。
- 断点调试模式下的热更能力:Http 函数的断点调试过程中,并不反对代码热更新,每次批改完代码后,都须要从新执行一遍断点调试流程,体验不太晦涩。
- 断点调试能力目前还未全面笼罩所有 Runtime,例如 custom runtime 不反对断点调试,php runtime 不反对端云联调断点调试等。
心愿本文对你有些帮忙。
附录
默认调试参数
Runtime | Default Debug Args |
---|---|
nodejs 6 | --debug-brk=${debugPort} |
nodejs 8/10/12/14 | --inspect-brk=0.0.0.0:${debugPort} |
python 2.7/3 | -m ptvsd --host 0.0.0.0 --port ${debugPort} --wait |
java 8/11 | -agentlib:jdwp=transport=dt_socket,server=y,suspend=y,quiet=y,address=${debugPort} |
php7.2 | remote_enable=1 remote_autostart=1 remote_port=${debugPort} remote_host=${ip.address()} |
更多内容关注 Serverless 微信公众号(ID:serverlessdevs),会集 Serverless 技术最全内容,定期举办 Serverless 流动、直播,用户最佳实际。