阿里云函数计算 + Aglio 实现 API Blueprint markdown 渲染

本文涉及的产品
Serverless 应用引擎免费试用套餐包,4320000 CU,有效期3个月
函数计算FC,每月15万CU 3个月
简介: 阿里云函数计算 + Aglio 实现 API Blueprint markdown 渲染

前言

本文为转载文章,原文地址:https://yq.aliyun.com/articles/723863
何为Serverless
从字面上意思来理解 Serverless,即无服务器。
将这个概念放在阿里云的函数计算服务上,即我只需要将我实际的业务代码上传到函数计算服务上,然后通过约定好的触发器去调用这个服务。在这其中,我并不需要去关心服务器相关的硬件配置,环境配置,以及运维等这些事情。我只需要专注于业务代码即可。
这可能和我们平时做的 RESTful API 有些相似,RESTful API 其实也可以看做是通过一个 HTTP 触发器,去调用相关服务。虽然二者的最终结果都是一样的,但 RESTful API 的背后,往往是我们的服务器一直在监听是否有请求,一旦有请求来了,就进行处理;而函数计算这个“事件驱动”更像是一个被动的东西,被触发后执行一段事先设定好的步骤,然后结束。

就像一个函数一样,每次执行都是差不多的步骤和内容,前后之间的两次调用并不会有太大的关联和影响。我们可以来看下大厂都在用它在干什么:

  • 新浪微博 - 调用函数将用户上传的图片进行个性化处理
  • 115 - 触发函数对用户上传的日志进行压缩、转换
  • 芒果 TV - 触发函数记录视频文件的属性信息
  • 石墨文档 - 使用函数来处理多用户文档编辑的冲突

Aglio 渲染 markdown

API Blueprint 的渲染器我之所以选择 Aglio https://github.com/danielgtaylor/aglio ,是因为它不仅可以自定义主题,还可以自定义模板。这样我就可以将页面中我不需要的标题、导航栏等内容删除,仅保留内容主体。同时 Aglio 不仅支持 CLI 使用,还可以当做一个包,放在项目中调用。
我们先在本地实现一个 markdown 的渲染,再将它改写成函数计算的模式。

先把 Aglio 给拉下来:

然后我们就可以开始编写主要的代码了:

let aglio = require('aglio')
let blueprint = `
# GET /message
+ Response 200 (text/plain)
        Hello World!
`

options = {
    themeTemplate: 'index.jade'
};

aglio.render(blueprint, options, function (err, html, warnings) {
    if (err) return console.log(err);
    if (warnings) console.log(warnings);
    console.log(html);
});

这里我使用的是 Aglio 的默认主题,你可以在 Aglio GitHub Repo 的olio-theme分支下载到主题需要的index.jade与mixins.jade这两个模板文件。然后就可以开始魔改这两个jade文件了:

doctype

include mixins

html
    head
        meta(charset="utf-8")
        style!= self.css
    body.preload
        div
            .row
                .content
                    block content
                        +Content('primary', false)

我这边将导航栏,标题栏、不用的 JavaScript 都去掉了。然后mixins.jade也是按需修改,相关英文的提示我也进行了汉化。最后的效果是这样的:
20191101092854
下面我们来将其部署到阿里云函数计算上。

部署到阿里云函数计算

因为我们这里的文件很多,故使用阿里云提供的fun工具来进行部署。安装fun工具详情
安装fun工具之后就可以执行fun init来初始化一个服务了。它会给我们创建template.yml文件,我们进行如下配置:

ROSTemplateFormatVersion: '2015-09-01'
Transform: 'Aliyun::Serverless-2018-04-03'
Resources:
  Aglio-Function:
    Type: 'Aliyun::Serverless::Service'
    Properties:
      Description: 'Markdown render'
    Aglio-Function:
      Type: 'Aliyun::Serverless::Function'
      Properties:
        Handler: index.handler
        Runtime: nodejs8
        CodeUri: './'
      Events:
        http-test:
          Type: HTTP
          Properties:
            AuthType: ANONYMOUS
            Methods: ['POST']
            

注意
这里的Events,即创建了一个 HTTP 触发器,仅允许使用 POST 进行调用,且不做鉴权。
还有在所有触发器中,HTTP 触发器只能在创建服务时添加,之后无法再添加。因此,在使用fun部署项目时,我们通过template.yml文件创建。

下面编写index.js,将我们的业务代码与阿里云函数计算的入口进行对接:

var getRawBody = require('raw-body');
module.exports.handler = function(req, resp, context) {
    let options = {
        themeTemplate: 'index.jade'
    };

    let aglio = require('aglio')
    getRawBody(req, function(err, body) {
        aglio.render(body.toString(), options, function (err, html, warnings) {
            if (err) return console.log(err);
            if (warnings) console.log(warnings);
            resp.send(html);
        });
    }); 

这里通过引入require('raw-body');来获取请求的 body,通过 Aglio 处理后返回。

之后执行fun deploy部署服务。注意:node_modules文件夹的内容也要一并上传,函数计算不会再次进行拉包。

魔改 Aglio

在阿里云函数计算的控制台中调试我们刚才部署的函数,发现会报 502 错误。
问题出在 Aglio 在渲染 markdown 时,会往node_modules目录下写入一个JavaScript的临时缓存文件。但阿里云的函数计算只开放了/tmp目录下的写入权限,其余都是只读。
那么这里我只能魔改 Aglio 源码了。还好函数计算不会使用包管理拉包,它就只用我们传上去的node_modules。
问题出在 Aglio 的文件写入那里,我们只需更改写文件的目录即可:
/node_modules/aglio-theme-olio/lib/main.js文件,第 144 行与第 249 行:

// Line 144
//compiledPath = path.join(ROOT, 'cache', (sha1(key)) + ".css");
compiledPath = path.join('/tmp', (sha1(key)) + ".css");

// Line 249
//compiledPath = path.join(ROOT, 'cache', (sha1(key)) + ".js");
compiledPath = path.join('/tmp', (sha1(key)) + ".js");

然后写入的 JavaScript 的临时文件中,有使用require引入node_modules目录其它的包,这里的相对路径我们改成绝对路径,否则还是会报错 502。
还是在main.js文件下,第 236 行:

// Line 236
//return compiled = "var jade = require('jade/runtime');\n" + (jade.compileFileClient(filename, options)) + "\nmodule.exports = compiledFunc;";
return compiled = "var jade = require('/code/node_modules/jade/runtime');\n" + (jade.compileFileClient(filename, options)) + "\nmodule.exports = compiledFunc;";

之后再部署,就可以看到啦~
20191101093835555

总结

对于一些功能单调、而又十分常用的功能,又不想专门放在服务器上花心思去维护,不妨可以尝试一下阿里云的函数计算。Serverless 这个东西,用得好真的可以解决很多问题。
阿里云的fun工具很好用,让我能快速部署从而能进行调试。在 Aglio 方面,Aglio 可以说是 API Blueprint 目前可定制度最高的工具了,这点不可否认。像临时缓存文件目录写死在node_modules,这个从开发的角度其实也能理解啦。

然后关于函数计算的定价方面:
每月免费额度
您的云账户与 RAM 账号共享每月的免费的调用次数和执行时间额度。免费额度不会按月累积,在下一自然月起始时刻会清零,重新计算。

调用次数:每月前 100 万次函数调用免费。

执行时间:每月前 400000(CU-秒)费用免费。

这里需要注意一下阿里云内存的计算方式,他并不是按照函数运行时的实际内存占用计算的,而是按照你给函数运行环境设定的执行内存计算。
也就是说我设定 1024 Mb 的最大执行内存,即使实际调用时远远没有用到这么多,阿里云还是按照 1024 Mb 来计费。
推荐是设定实际运行内存占用的两倍大小。像我这个 markdown 渲染,一次实际占用内存 66 Mb 左右,因此我选择的是 128 Mb 的执行内存。

相关实践学习
【文生图】一键部署Stable Diffusion基于函数计算
本实验教你如何在函数计算FC上从零开始部署Stable Diffusion来进行AI绘画创作,开启AIGC盲盒。函数计算提供一定的免费额度供用户使用。本实验答疑钉钉群:29290019867
建立 Serverless 思维
本课程包括: Serverless 应用引擎的概念, 为开发者带来的实际价值, 以及让您了解常见的 Serverless 架构模式
目录
相关文章
|
4天前
|
运维 监控 Cloud Native
阿里云 Serverless 重塑创蓝云智通信底座,引领行业变革!
创蓝云智的成功实践为整个企业服务行业提供了极具价值的数字化转型范本。特别是对于具有明显波峰波谷特征的业务场景,以及面临资源利用率低、运维压力大等共性挑战的企业,这一案例充分证明了云原生技术在解决传统IT架构痛点方面的巨大价值和广阔前景。
|
12天前
|
运维 Cloud Native 应用服务中间件
阿里云微服务引擎 MSE 及 API 网关 2025 年 6 月产品动态
阿里云微服务引擎 MSE 面向业界主流开源微服务项目, 提供注册配置中心和分布式协调(原生支持 Nacos/ZooKeeper/Eureka )、云原生网关(原生支持Higress/Nginx/Envoy,遵循Ingress标准)、微服务治理(原生支持 Spring Cloud/Dubbo/Sentinel,遵循 OpenSergo 服务治理规范)能力。API 网关 (API Gateway),提供 APl 托管服务,覆盖设计、开发、测试、发布、售卖、运维监测、安全管控、下线等 API 生命周期阶段。帮助您快速构建以 API 为核心的系统架构.满足新技术引入、系统集成、业务中台等诸多场景需要。
|
2天前
|
API
本地用阿里云API调用的r1模型,返回的think字段中有奇怪的东西,并且停止思考
这两张图片展示了模型生成内容时可能出现的异常情况,包括图像模糊、结构错误或不符合预期的结果。这可能是由于模型训练数据不足、输入指令不清晰或模型本身存在局限性所致。建议优化输入提示词或调整模型参数以提升输出质量。
|
19天前
|
人工智能 弹性计算 运维
亚太唯一!阿里云Serverless计算产品进入Forrester领导者象限
近日,Forrester发布《Serverless Development Platforms, Q2 2025》报告,阿里云函数计算FC与Serverless应用引擎SAE在21项评测中斩获9项最高分,成为国内唯一进入领导者象限的科技公司。
|
1月前
|
人工智能 分布式计算 DataWorks
一体系数据平台的进化:基于阿里云 EMR Serverless Spark 的持续演进
本文介绍了一体系汽配供应链平台如何借助阿里云EMR Serverless Spark实现从传统Hadoop平台向云原生架构的迁移。通过融合高质量零部件供应与创新互联网科技,一体系利用EMR Serverless Spark和DataWorks构建高效数据分析体系,解决大规模数据处理瓶颈。方案涵盖实时数据集成、Lakehouse搭建、数仓分层设计及BI/ML应用支持,显著提升数据处理性能与业务响应速度,降低运维成本,为数字化转型奠定基础。最终实现研发效率提升、运维压力减轻,并推动AI技术深度整合,迈向智能化云原生数据平台。
|
1月前
|
人工智能 弹性计算 运维
亚太唯一,阿里云Serverless计算产品进入Forrester领导者象限
Forrester发布Serverless开发平台评估报告《Forrester Wave™: Serverless Development Platforms, Q2 2025》:在21项测评中,阿里云函数计算FC和Serverless应用引擎SAE的产品能力拿到了9项最高分。阿里云成功进入领导者象限,是国内唯一进入该象限的科技公司。
|
1月前
|
分布式计算 运维 监控
Fusion 引擎赋能:流利说如何用阿里云 Serverless Spark 实现数仓计算加速
本文介绍了流利说与阿里云合作,利用EMR Serverless Spark优化数据处理的全过程。流利说是科技驱动的教育公司,通过AI技术提升用户英语水平。原有架构存在资源管理、成本和性能等痛点,采用EMR Serverless Spark后,实现弹性资源管理、按需计费及性能优化。方案涵盖数据采集、存储、计算到查询的完整能力,支持多种接入方式与高效调度。迁移后任务耗时减少40%,失败率降低80%,成本下降30%。未来将深化合作,探索更多行业解决方案。
|
1月前
|
自然语言处理 算法 API
阿里云增值税发票识别NET Rest API调用示例
本文介绍了使用NET代码调用阿里云增值税发票识别API的实现方式。通过示例代码,详细展示了如何构造请求、设置签名以及发送HTTP请求的具体步骤。代码中涵盖了请求参数的处理、签名生成逻辑(如HMAC-SHA256算法)以及调用API后的结果处理。此外,还提供了运行结果的截图和参考文档链接,帮助开发者更好地理解和应用该接口。
110 4
|
1月前
|
人工智能 自然语言处理 API
硅基流动入驻阿里云云市场,核心API服务将全面接入阿里云百炼平台💐
2025年6月18日,AI Infra企业硅基流动与阿里云达成战略合作,加入“繁花计划”并入驻云市场。其大模型推理平台SiliconCloud核心API将接入阿里云百炼平台,依托灵骏智能计算集群为客户提供高效服务。作为国内领先的MaaS平台,SiliconCloud已集成百余款开源大模型,服务600万用户及众多企业。双方将在算力协同、行业解决方案等领域深化合作,推动AI生态发展。
212 0
|
2天前
|
JSON 监控 API
在线网络PING接口检测服务器连通状态免费API教程
接口盒子提供免费PING检测API,可测试域名或IP的连通性与响应速度,支持指定地域节点,适用于服务器运维和网络监控。

相关产品

  • 函数计算