多彩编程 多彩编程MZPH · CODE BLOG
ARTICLE DETAIL

文章详情

深耕前端与后端开发技术的一线实战笔记与踩坑复盘。

Midway Serverless 函数以应用模式部署到私有服务器:bootstrap 与 serverless-app 实战指南

Midway Serverless 函数以应用模式部署到私有服务器:bootstrap 与 serverless-app 实战指南 后端微服务云原生【免费下载链接】midway A Node.js Serverless Framework for front-end/full-stack developers. Build the application for next decade. Works on AWS, Alibaba Cloud, Tencent Cloud and traditional VM/Container. Super easy integrate with React and Vue. 项目地址https://gitcode.com/gh_mirrors/mi/midway点击查看免费下载Midway Serverless 自 v2.0 起支持把原本运行在阿里云 FC、腾讯云 SCF 等云平台上的 Serverless 函数以应用模式直接部署到你自己掌握的私有服务器、虚拟机或容器中复用同一套函数代码而不必改写成传统 Web 应用。本文基于midwayjs/bootstrap与midwayjs/serverless-app两个包完整讲解从安装依赖、编写bootstrap.js启动文件、配置start命令到使用 pm2 守护进程的整套部署流程并结合本仓库源码说明其底层启动机制帮助你快速完成 Serverless 函数向私有化应用部署的迁移。为什么需要函数转应用模式Midway Serverless 在 v1.0 版本就已经支持将函数部署到各个 Serverless 云平台例如阿里云函数计算FC、腾讯云云函数SCF等。这种模式下函数由云平台托管运行开发者的函数代码被包装成平台约定的 handler 结构由平台的网关触发执行。而从 v2.0 版本开始Midway 提供了另一条路径把已有的 Serverless 函数以应用模式部署在你的私有服务器上。这意味着函数代码结构基本不变仍然沿用已有的 FaaS 目录与入口约定部署目标从云平台网关切换到自建 HTTP 服务由应用自身监听端口并对外提供访问对于有私有化部署、数据本地化、成本控制或内网访问需求的场景这一模式可以直接复用既有函数资产无需重写业务代码。从本仓库的版本记录可以看到midwayjs/serverless-app包在 v2.8.9 / v2.8.10 版本中即已随框架发布见 packages/version/versions/2_8_4-2_8_9.json与下方前提条件中的版本要求相互印证。前提条件在开始之前需要确认你的函数项目满足以下要求项目要求框架版本midwayjs/faas版本需要大于2.8.7运行环境Node.js支持bootstrap.js以 CommonJS 方式加载只有midwayjs/faas高于 2.8.7 时midwayjs/serverless-app才能正确解析并包装已有的函数代码。当前仓库中midwayjs/faas的主版本为 4.x见 packages/faas/package.json远高于该下限说明这一函数转应用能力在后续版本中被持续保留与演进。第一步安装应用部署依赖在函数项目的根目录执行以下命令安装两个核心依赖$ npm i midwayjs/bootstrap midwayjs/serverless-app --save这两个包在部署链路中的分工如下midwayjs/bootstrap用于启动 Midway 上层框架。它是应用模式的统一启动器负责初始化全局应用上下文、加载框架并监听进程信号详见下文底层原理。midwayjs/serverless-app用于将原有的函数代码包裹成实际应用运行。它本身也是 Midway 的上层 Framework 之一等价于把函数框架在本地以 Web 服务的形式实例化。在本仓库的 mock 测试工具中也可以看到该包的引用痕迹当以函数应用方式启动时midwayjs/serverless-app会被作为备选的 serverless 框架模块查找并加载见 packages/mock/src/creator.ts这从侧面印证了它确实承担将函数代码转成应用框架的职责。第二步添加 bootstrap.js 启动文件在项目根目录添加bootstrap.js文件代码如下// bootstrap.js const { Bootstrap } require(midwayjs/bootstrap); const { Framework } require(midwayjs/serverless-app); const app new Framework().configure({ port: 7001, }); Bootstrap.load(app).run();这段代码的执行流程非常直观从midwayjs/bootstrap引入Bootstrap启动器从midwayjs/serverless-app引入Framework实例化并通过.configure({ port: 7001 })指定应用监听端口调用Bootstrap.load(app)将框架注册给启动器最后.run()启动整个应用。关于port配置从源码实现看端口最终会进入函数应用的启动逻辑process.env.MIDWAY_HTTP_PORT、faas配置中的port、以及此处configure传入的port依次生效见 packages/mock/src/creator.ts。因此除硬编码在bootstrap.js中外端口也可以通过环境变量或配置文件动态指定便于在不同环境中复用同一份启动文件。对于 TypeScript 项目启动器会默认以src目录作为代码加载目录对于编译后的 JavaScript 项目则会回退到dist目录见 packages/bootstrap/src/bootstrap.ts。因此在生产部署前请务必先完成编译npm run build确保dist产物存在。第三步配置启动命令并部署为了让启动过程更规范、可复用可以在package.json中增加start命令{ scripts: { start: NODE_ENVproduction node bootstrap.js } }然后执行$ npm run start即可启动应用。说明NODE_ENVproduction用于指定生产环境保证加载生产环境对应的配置与日志行为该写法适用于 Linux / macOS 等 POSIX shell若在 Windows 环境运行需要借助cross-env之类的工具设置环境变量启动成功后应用即监听 7001 端口。使用 pm2 守护进程除了直接node启动原文档明确指出可以直接使用pm2等进程管理工具执行该命令进行启动。pm2 是带内置负载均衡器的 Node.js 生产进程管理器支持性能监控、自动重启与多实例负载均衡。全局安装 pm2$ npm install pm2 -g部署 Midway 应用时对应的 pm2 命令为参见仓库中的 pm2 部署指南 site/docs/extensions/pm2.md$ NODE_ENVproduction pm2 start ./bootstrap.js --name midway_app -i 4其中--name midway_app为服务指定应用名之后可用应用名进行启停操作pm2 stop midway_app、pm2 restart midway_app等-i 4指定启动 4 个实例进程pm2 会以 cluster 模式启动并做负载均衡。常用管理命令速查$ pm2 list # 列出当前服务 $ pm2 logs # 查看服务输出日志 $ pm2 stop 1 # 停止编号为 1 的服务 $ pm2 delete 1 # 删除编号为 1 的服务如果在 Docker 容器中运行则后台守护进程方式不适用应改用前台运行的pm2-runtime$ NODE_ENVproduction pm2-runtime start ./bootstrap.js --name midway_app -i 4启动后访问应用启动成功后在本机即可通过以下地址访问http://127.0.0.1:7001原有的 Serverless 函数路由会被midwayjs/serverless-app以应用形式承载函数框架在启动时会加载函数列表将各函数的 handler 与完整 URL 映射存入路由表见 packages/faas/src/framework.ts从而保证之前通过函数网关访问的 HTTP 路径在本地服务上依然可用。如需对外提供服务再配合 Nginx 反向代理或直接暴露端口即可。底层原理bootstrap 与 serverless-app 如何协同工作理解了部署步骤之后再看一下本仓库源码中Bootstrap的启动实现可以帮助你在排查启动问题时更有方向。Bootstrap 的进程生命周期管理Bootstrap.run()在启动时会做以下几件事见 packages/bootstrap/src/bootstrap.ts注册SIGINT、SIGQUIT、SIGTERM信号处理器以及exit、uncaughtException、unhandledRejection处理器调用内部BootstrapStarter.run()初始化全局应用上下文启动成功后置位global[MIDWAY_BOOTSTRAP_APP_READY] true标记并打印[midway:bootstrap] current app started日志收到退出信号时优雅关闭应用上下文并退出见 packages/bootstrap/src/bootstrap.ts。这意味着使用bootstrap.js启动的应用天然具备优雅退出能力这也是它能被 pm2 等进程管理器可靠托管的前提之一。函数框架以应用模式运行midwayjs/serverless-app提供的Framework本质上是函数框架在应用模式下的实例。仓库中对应的函数框架实现为MidwayFaaSFramework见 packages/faas/src/framework.ts其configure方法会读取faas配置段并在非开发模式下作为主框架启用。函数路由的装载、HTTP 请求到函数 handler 的分发都由该框架完成。仓库中的测试同样验证了这一启动模式packages/faas/test/starter.test.ts通过自定义 Starter 演示了函数应用的启动与关闭流程见 packages/faas/test/starter.test.tsmock 工具的createFunctionApp也支持直接以bootstrap.js作为入口来模拟函数应用见 packages/mock/src/creator.ts。这些测试从侧面证实了函数代码 bootstrap 入口 可运行的应用这一部署模型的可行性。小结将 Midway Serverless 函数以应用模式部署到私有服务器本质上只做三件事装好midwayjs/bootstrap与midwayjs/serverless-app两个依赖、写好根目录的bootstrap.js、配置并执行start命令。之后无论是直接npm run start、用 pm2 守护进程、还是容器化部署都能复用同一套函数代码与路由实现 Serverless 函数资产在私有环境中的平滑落地。进一步可阅读仓库中的相关资料Serverless 函数开发说明、Serverless 本地开发、pm2 进程管理。赞分享后端微服务云原生【免费下载链接】midway A Node.js Serverless Framework for front-end/full-stack developers. Build the application for next decade. Works on AWS, Alibaba Cloud, Tencent Cloud and traditional VM/Container. Super easy integrate with React and Vue. 项目地址https://gitcode.com/gh_mirrors/mi/midway点击查看免费下载相关推荐Midway Serverless 函数开发实战从触发器装饰器到云端部署Midway Serverless 函数开发实战从触发器装饰器到云端部署 导读 本文基于 Midway 开源仓库中 Serverless 函数开发文档系统讲后端微服务云原生《动手学深度学习》现代卷积神经网络全览从AlexNet到DenseNet的架构演进与实践《动手学深度学习》现代卷积神经网络全览从AlexNet到DenseNet的架构演进与实践 导读 本文围绕《动手学深度学习》d2l zh仓库中 现代卷积神经后端微服务云原生Wechaty Serverless部署云函数与无服务器架构实践Wechaty Serverless部署云函数与无服务器架构实践 你是否还在为微信机器人的服务器维护而烦恼服务器成本高、部署复杂、需要24小时运行监控本文后端即时通讯上一篇**JavaScript SHA-256/SHA-224加密库全面解析**下一篇GitHub Linguist容器化部署指南Docker环境下的完整使用方法创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表