注意: 下面借助于 OSS 解压的方法已经不推荐,仅供学习而保留,对于大文件和依赖目前更推荐 NAS 方案,希望快速上手请移步 https://yq.aliyun.com/articles/718653
函数计算的按调用量收费,动态伸缩特性使其比较适合部署在线转化工具(如:图片裁剪,网页转图片,文字转音频)。这类转换工具通常考虑是 cpp 实现,最终编译成二进制的命令行工具或动态链接库。而函数计算支持多种语言运行时,采用 HTTP 协议进行远程调用,也非常适用于异构模式。本文将介绍如何基于 fc-libreoffice 项目快速搭建一个 Word 转 PDF 的云服务。
fc-libreoffice 是一个基于 nodejs 进行接口封装的 npm,其中内置了针对函数计算 运行时预编译的 libreoffice 。虽然 libreoffice 已经经过裁剪,并使用压缩比较高的 Brotli 算法进行压缩。但最终的压缩包大小为 84M,超过了函数计算 50M 压缩包的大小限制。所以示例项目采用上传 OSS,运行时预下载并解压 libreoffice。下文将侧重于快速搭建 libreoffice 云服务,调用几个脚本封装的 make 命令即可快速体验。
依赖工具
- docker-ce 安装方法参考官方安装文档
-
fun 一款函数计算的编排工具,用于快速部署函数计算应用。
MacOS 平台可以使用如下方法安装
brew tap vangie/formula brew install fun
其他平台可以通过 npm 安装
npm install @alicloud/fun -g
- ossutil oss 的命令行工具。将其下载并放置到 $PATH 所在目录。
克隆项目
fc-libreoffiice 项目下有一个 example 项目,进行简单配置就可以快速部署。
# 克隆项目
git clone https://github.com/awesome-fc/fc-libreoffice.git
# 进入示例工程目录
cd fc-libreoffice/example
修改配置文件
# 配置 .env 文件
cp env.example .env
填充 .env 文件里的环境变量
# 阿里云 AK。建议使用主 AK,fun 部署需要角色修改权限。
ALIBABA_CLOUD_ACCESS_KEY_ID=
ALIBABA_CLOUD_ACCESS_KEY_SECRET=
# 阿里云账户 ID。去阿里云账户中心可以查到
ALIBABA_CLOUD_ACCOUNT_ID=
# 部署的 region
ALIBABA_CLOUD_DEFAULT_REGION=
# 用于上传 liboffice 压缩文件的 oss bucket,请先去 oss 控制台创建一个
OSS_BUCKET=
部署函数并验证效果
部署函数,此过程中会安装依赖,上传 OSS,并部署函数到函数计算平台
$ make deploy
.... (此处略去了大量输出内容)
Waiting for service libre-svc to be deployed...
Waiting for function libre-fun to be deployed...
Waiting for packaging function libre-fun code...
package function libre-fun code done
function libre-fun deploy success
service libre-svc deploy success
调用函数,将预制的 example.docx 文件转换层 example.pdf 文件,并上传到 OSS。
$ make invoke
bin/invoke.sh
+ fcli function invoke -s libre-svc -f libre-fun
{"name":"example.pdf","url":"http://vangie-test.oss-cn-shanghai-internal.aliyuncs.com/example.pdf","res":{"status":200,"statusCode":200,"headers":{"server":"AliyunOSS","date":"Sat, 01 Dec 2018 03:42:25 GMT","content-length":"0","connection":"keep-alive","x-oss-request-id":"5C02032129DDF1C134B9BC7C","x-oss-event-status":"eyJSZXN1bHQiOiAiT2sifQ==","etag":"\"94829EEB576E66A2B5760DD034EECB0B\"","x-oss-hash-crc64ecma":"5833133482735102142","content-md5":"lIKe61duZqK1dg3QNO7LCw==","x-oss-server-time":"60"},"size":0,"aborted":false,"rt":83,"keepAliveSocket":true,"data":{"type":"Buffer","data":[]},"requestUrls":["http://vangie-test.oss-cn-shanghai-internal.aliyuncs.com/example.pdf"],"timing":null,"remoteAddress":"100.118.102.36","remotePort":80,"socketHandledRequests":3,"socketHandledResponses":3}}
从 OSS 下载 example.pdf 到当前目录,查看转换后的结果。
$ make download
bin/download.sh
Succeed: Total num: 1, size: 33,811. OK num: 1(download 1 objects).
0.192966(s) elapsed
下面是转换后的结果,左图为 word 源文件,右图为生成的 pdf 文件。中文和内嵌图片都效果不错。
小结
fc-libreoffcie/example 仅仅是一个示例项目,对于正在的生产环境应用,还有不少的优化空间,比如下载文件的完整性校验、流式解压、支持 http 接口输入源文件和输出目标文件、使用 time trigger 进行预热以减少冷启动开销等。上面几个简单的 make 命令背后调用了一些 bash 脚本编写的自动化步骤,这些步骤涉及到一些常用的函数计算领域的方法和技巧,如果您对 libreoffice 的移植过程比较感兴趣可以阅读另一篇文章《手把手教您将 libreoffice 移植到函数计算平台》或者您可以直接阅读 fc-libreoffice 的源码。