关于github:硬核调试实操-手把手带你实现-Serverless-断点调试

5次阅读

共计 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 namePort 以及 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 流动、直播,用户最佳实际。

正文完
 0