开发函数计算的正确姿势 —— Http Trigger 本地运行调试-阿里云开发者社区

开发者社区> 倚贤> 正文

开发函数计算的正确姿势 —— Http Trigger 本地运行调试

简介: 前言 首先介绍下在本文出现的几个比较重要的概念: __函数计算(Function Compute)__: 函数计算是一个事件驱动的服务,通过函数计算,用户无需管理服务器等运行情况,只需编写代码并上传。
+关注继续查看

前言

首先介绍下在本文出现的几个比较重要的概念:

__函数计算(Function Compute)__: 函数计算是一个事件驱动的服务,通过函数计算,用户无需管理服务器等运行情况,只需编写代码并上传。函数计算准备计算资源,并以弹性伸缩的方式运行用户代码,而用户只需根据实际代码运行所消耗的资源进行付费。函数计算更多信息 参考

__Fun__: Fun 是一个用于支持 Serverless 应用部署的工具,能帮助您便捷地管理函数计算、API 网关、日志服务等资源。它通过一个资源配置文件(template.yml),协助您进行开发、构建、部署操作。Fun 的更多文档 参考

__Fun Local__: Fun Local 作为 Fun 的一个子命令存在,可以直接通过 fun local 命令使用。Fun Local 工具可以将函数计算中的函数在本地完全模拟运行,并提供单步调试的功能,旨在弥补函数计算相对于传统应用开发体验上的短板,并为用户提供一种解决函数计算问题排查的新途径。

《开发函数计算的正确姿势 —— 使用 Fun Local 本地运行与调试》中,我们介绍了通过事件的方式在本地触发函数运行以及调试的方法。

而这一次,我们本地调试运行 Http Trigger 函数的方法。

备注: 本文介绍的技巧需要 Fun 版本大于等于 2.8.0。

Fun Local Start 命令格式

使用 fun local invoke -h 可以查看 fun local invoke 的帮助信息:

  Usage: fun local start [options]

  Allows you to run the Function Compute application locally for quick development & testing.
    It will start an http server locally to receive requests for http triggers and apis.
    It scans all functions in template.yml. If the resource type is HTTP, it will be registered to this http server, which can be triggered by the browser or some http tools.
    For other types of functions, they will be registered as apis, which can be called by sdk in each language or directly via api.

    Function Compute will look up the code by CodeUri in template.yml.
    For interpreted languages, such as node, python, php, the modified code will take effect immediately, without restarting the http server.
    For compiled languages ​​such as java, we recommend you set CodeUri to the compiled or packaged localtion.
    Once compiled or packaged result changed, the modified code will take effect without restarting the http server.

  Options:

    -d, --debug-port <port>      specify the sandboxed container starting in debug mode, and exposing this port on localhost
    -c, --config <ide/debugger>  output ide debug configuration. Options are vscode
    -h, --help                   output usage information

本地运行 Http Trigger 函数

运行命令格式为:

fun local start [options]

其中 options 是可以省略的。

执行 fun local start 后,fun 会首先启动一个 http server,以提供 http 的服务。然后 fun 会扫描 template.yml 中描述的所有配置了 Http Trigger 的函数,注册到 http server 中。注册成功后,就可以通过浏览器或者其他的 http 工具访问了。

比如,对于在 local_http 下执行 fun local start 后,会显示所有的 http trigger 信息:

打开任意一个 url,即可通过 http trigger 的方式触发函数运行。

以下是一个访问 nodejs http trigger 的动态演示(其他类型的 runtime,比如 python、php 使用体验一致):

本地调试 Http Trigger 函数

备注:Fun Local 涉及到的 debugging 技术全部都基于各个语言通用的调试协议实现的,因此无论什么语言的开发者,即使不喜欢用 VSCode,只要使用对应语言的 remote debugging 方法都可以进行调试。

Http Trigger 本地调试的方法与使用事件触发函数的方法一致 ———— 通过 -d, --debug-port <port> 选项。同时还支持 -c, --config <ide/debugger>,支持在调试时,显示调试 ide 配置。

调试方法为,首先通过 fun local start --debug 3000 --config vscode 启动服务,然后会看到 template.yml 中声明的函数都被注册成功:

根据服务名、函数名或者 http trigger 触发器名称选择合适的 url,使用浏览器打开会看到浏览器页面一直无响应,但在终端会看到日志输出:

skip pulling image aliyunfc/runtime-python3.6:1.2.0...
you can paste these config to .vscode/launch.json, and then attach to your running function
///////////////// config begin /////////////////
{
    "version": "0.2.0",
    "configurations": [
        {
            "name": "fc/local-http-demo/python3",
            "type": "python",
            "request": "attach",
            "host": "localhost",
            "port": 3000,
            "pathMappings": [
                {
                    "localRoot": "/Users/tan/fun_local_http_demo/python3",
                    "remoteRoot": "/code"
                }
            ]
        }
    ]
}
///////////////// config end /////////////////
FunctionCompute python3 runtime inited.
FC Invoke Start RequestId: 04c57fba-cbe9-4c1f-8c57-f8e0b539fa08

将日志中的配置信息复制到 vscode 调试器中,在代码中下好断点,单击开始调试即可。更多信息,请参考

以下是一个调试 python http trigger 的动态演示(其他类型的 runtime,比如 nodejs、php 使用体验基本一致):

热加载

本地运行、调试 Http Trigger 时,支持热加载。

当通过 fun local start 启动本地服务后,即使修改了代码,也无需重启本地服务,可以直接刷新网页或者重新触发函数即可运行变更后的函数。

以下是一个 nodejs 热加载的动态演示(其他类型的 runtime,比如 php、python 类似)。

备注:请提前在函数目录执行 npm install,用于初始化函数依赖的 nodejs 模块。

其他功能的支持

本文主要介绍了本地运行、调试 Http Trigger 函数的体验,其他功能,比如环境变量、Initializer、Credentials 等,请参考

示例代码

本文讲解涉及到的示例代码,托管在 github 上。项目目录结构如下:

.
├── nodejs6
│   ├── README.md
│   ├── index.js
│   └── package.json
├── nodejs8
│   ├── README.md
│   ├── index.js
│   └── package.json
├── php7.2
│   ├── README.md
│   └── index.php
├── python2.7
│   ├── README.md
│   └── index.py
├── python3
│   ├── README.md
│   └── index.py
└── template.yml

template.yml 定义了函数计算模型,其中定义了一个名为 local-http-demo 的服务,并在该服务下,定义了 5 个函数,名称分别是 nodejs6、nodejs8、php72、python27、python3。它们对应的代码目录由 template 中的 CodeUri 定义,分别位于 nodejs6、nodejs8、php7.2、python2.7、python3 目录。

本文作者:小默

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
《BREW进阶与精通——3G移动增值业务的运营、定制与开发》连载之74---BREW 中的HTTP 开发
版权声明:本文为半吊子子全栈工匠(wireless_com,同公众号)原创文章,未经允许不得转载。
432 0
十分钟上线-基于函数计算开发 Restful web api & asp.net core web app
.NET Core是一个开源通用的开发框架,支持跨平台, 阿里云函数计算推出了 dotnetcore2.1 runtime, 使用 C# 编写 serverless 函数, 除了很好地支持通常意义上的函数外, 还可以基于函数计算开发 asp.
4388 0
开发指南—函数—拆分函数—MM
本文将介绍MM函数的使用方式。
11 0
PHPpraffa也有了,一个PHP版本的阿里云函数计算与API网关的开发框架
发布了Python版本的函数计算与API网关的开发框架后,一直觉得对不起PHP,因为公司一直是用PHP的,我这弄了个Python,实在不该,对了,(Python版本说明点这里。 PHPpraffa是什么? PHPpraffa 是praffa的PHP版本。
1141 0
开发者云《Serverless函数计算初体验》火热上线。体验函数计算场景领取定制版马克杯
火遍全网的体验挑战第二弹抢鲜首发,体验函数计算相关场景并通过答题挑战即可获得印有阿里云第一行代码的定制版马克杯 活动地址:https://developer.aliyun.com/adc/series/fc/
25762 0
使用阿里云Serverless函数计算实现HTTP健康检查+故障短信通知
定时对网站/API进行请求,根据请求响应判断服务是否可用,网站是否存在宕机,当发生宕机时,发送短信通知管理员.
1054 0
函数计算助力闲鱼构建云端一体化变成模式,节省30%开发成本
闲鱼是依托阿里电商体系的前台型业务,有非常独特的业务特点和用户诉求,在底层依托阿里系统的同时,在表现层和业务层需要探索适合闲鱼的、并且更加快速灵活的研发体系。
939 0
开发函数计算的正确姿势———为 PHP 运行时添加自定义扩展
PHP 语言提供了一种扩展机制(Extension),通过 PHP 扩展可以增强语法、调用 C/C++ 实现的库函数以及优化执行性能。PHP 扩展是与平台相关的动态链接库,在 Linux 和 Mac 平台是 .so 文件,在 Windows 平台是 .dll 文件。由于函数计算的开发通常在 Mac 和 Windows 平台,而运行时是 Linux(Debain)环境,所以为函数计算 PHP 运行时添加扩展会遇到由于动态链接库平台相关而导致要么本地无法调试,要么远端无法运行的问题。本文介绍借助 Funcraft 工具提供的模拟环境进行 PHP 扩展的安装、本地运行调试以及构建发布。
386 0
+关注
倚贤
全栈工程师,从事了 12 年以 Java 语⾔为主的软件开发工作,热衷于整合框架与开发工具,关注 交互设计,喜欢写技术博客(http://codelife.me/),Linux拥趸,问题终结者。近期开始学习和关注 Elixir 函数语言,合作翻译了《Elixir 程序设计》。
35
文章
48
问答
来源圈子
更多
专注Serverless、微服务、函数计算等
+ 订阅
文章排行榜
最热
最新
相关电子书
更多
文娱运维技术
立即下载
《SaaS模式云原生数据仓库应用场景实践》
立即下载
《看见新力量:二》电子书
立即下载