
后端微服务云原生【免费下载链接】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 云平台输出的一套 Node.js 云函数开发方案帮助前端与全栈开发者以熟悉的 Midway 编程模型构建 FaaS 函数并部署到阿里云 FC、腾讯云 SCF、AWS Lambda 等平台。本文以 site/versioned_docs/version-3.0.0/serverless/serverless_intro.md 为主体结合仓库内midwayjs/faas函数框架、FC 启动器、事件类型定义等源码系统讲解 Midway Serverless 能做什么、函数的适用与不适用的场景以及函数、函数组、触发器、运行时、发布平台、Layer 等核心术语读完即可对 Serverless 化改造的边界与落地方式建立完整认知。Midway Serverless 能做什么Midway Serverless 是用于构建 Node.js 云函数的 Serverless 框架。它的核心价值在于帮助开发者在云原生时代大幅降低服务器与运维的维护成本把精力从如何部署、如何扩容、如何保证可用性中解放出来更专注于产品研发本身。在 Midway Serverless 的场景下开发者不再编写一个完整的、常驻监听端口的 Web 应用而是编写一个个独立的函数逻辑交给云平台去调度、伸缩和计费。平台负责实例的创建、销毁与扩容开发者只需关心输入长什么样、输出怎么处理。Midway Serverless 和 Midway 的关系Midway Serverless 是 Midway 产出的一套面向 Serverless 云平台的开发方案其内容主要包括两部分函数框架midwayjs/faas提供函数场景下的框架运行时、装饰器与上下文封装与平台配套的工具链、启动器等例如midwayjs/serverless-fc-starter阿里云 FC 启动器、midwayjs/serverless-http-parserHTTP 事件解析器等。在 Midway Serverless 2.0 之后Midway Serverless 和 Midway 的能力开始复用两者共享同一套 CLI 工具链、编译器、装饰器等基础设施。也就是说在传统 Web 应用中掌握的依赖注入、生命周期、配置加载、路由与中间件等能力在函数场景下依然成立。当前Midway Serverless 主要面向的是函数FaaS场景。从源码结构可以清晰看到这一分工midwayjs/faas包在 packages/faas/src/index.ts 中导出了MidwayFaaSFramework框架主体、FaaSConfiguration配置与初始化、AbstractBootstrapStarter启动器抽象基类以及事件装饰器而midwayjs/core的容器、装饰器、配置服务等能力则通过依赖复用。函数FaaS能做什么很多人对函数还不太清楚或者不知道它能做什么。当前函数可以理解为一个小容器原来要写一个完整的应用来承载能力现在只需要写中间的逻辑部分并考虑输入和输出的数据即可其余都由平台承载。具体来说函数可以承担以下几类工作承载 HTTP 等流量通过绑定平台的触发器Trigger/Event函数可以承接 HTTP、Socket 等流量。传统应用需要自己启动服务并监听端口而函数通过事件机制被平台调用调用 BaaS 服务通过平台提供的 BaaS SDK函数可以对外调用数据库、Redis 等托管服务提供传统 HTTP API 服务结合现有的前端框架React、Vue 等渲染页面形成完整的前后端交付作为独立的数据模块被触发例如文件上传变更后的处理、解压任务等作为定时任务的逻辑部分到了指定的时间或时间间隔被执行无需常驻进程。从源码看midwayjs/faas的函数框架 packages/faas/src/framework.ts 将函数分为两类调用路径invokeTriggerFunction会判断isHttpFunction为 true 时走httpMiddlewareManagerHTTP 中间件链否则走eventMiddlewareManager事件中间件链。HTTP 函数的返回值会写入ctx.body最终由formatHttpResponse统一格式化为{ isBase64Encoded, statusCode, headers, body }结构见 packages/faas/src/framework.ts#L412-L475而事件函数则直接把处理器返回值作为结果返回例如阿里云 OSS 上传事件、MNS 消息等其事件结构在 packages-serverless/faas-typings/typings/fc.ts 中有完整类型定义如SingleOSSEvent、SingleCDNEvent、MNSStreamEvent。另外midwayjs/faas还提供了Event参数装饰器见 packages/faas/src/decorator.ts在事件函数中可以直接注入原始事件对象ctx.originEvent ctx.originContext ? ctx.originEvent : ctx这样处理器就能以声明式方式拿到平台原始事件数据。函数不能做什么函数的架构决定了有些需求是函数无法支持的同时函数和应用在能力上仍有一定区别。文档明确列出了函数不适用的场景执行时间超过函数配置下限制的最好不超过 5s有状态、需要在本地存储数据的长连接场景例如 WebSocket 等后台任务、有大数据量执行的依赖多进程通信的大文件上传例如网关限制 2M 以上自定义环境的例如 nginx 配置、C 库C addon 动态链接库等、Python 版本依赖等大量服务端缓存的需要固定 IP 的情况。这些限制来自函数单一链路、无状态、由平台调度的本质函数实例生命周期短、可被平台随时回收重建本地磁盘数据与常驻内存状态无法保证可靠执行时长受平台超时配额约束网络出口 IP 与底层运行时环境由平台统一管控无法像传统 VM 一样自定义。从实现上也能印证这一设计取向AbstractBootstrapStarter见 packages/faas/src/starter.ts中getBaseDir在 TypeScript 环境下指向appDir/src、编译后环境指向appDir/dist函数代码以入口文件的形式被平台包裹执行并不像应用那样自带完整的服务生命周期管理。术语描述函数逻辑意义上的一段代码片段通过常见的入口文件包裹起来执行。函数是单一链路并且无状态的。现在很多人认为 Serverless FaaS BaaSFaaS 是无状态的函数BaaS 解决带状态的服务。在midwayjs/faas中函数通过MidwayFaaSFramework注册并调度框架维护了一个funMappingStore: Mapstring, RouterInfo在loadFunction()阶段通过MidwayServerlessFunctionService.getFunctionList()拿到全部函数清单并建立处理器名 → 路由信息的映射见 packages/faas/src/framework.ts#L165-L191调用时再通过invokeTriggerFunction根据handlerMapping定位到对应处理器执行。函数组多个函数聚合到一起的逻辑分组名对应原有的应用概念。一个函数组相当于传统应用的一次部署单元组内可以包含多个函数。源码中IMidwayFaaSApplication提供了getFunctionName()与getFunctionServiceName()两个方法见 packages/faas/src/interface.ts#L424-L465getFunctionName优先读取环境变量MIDWAY_SERVERLESS_FUNCTION_NAME其次读取平台适配器applicationAdapter提供的信息getFunctionServiceName同理对应MIDWAY_SERVERLESS_SERVICE_NAME。这里的 Service 即对应文档所说的函数组服务/分组在阿里云 FC 上即服务概念在 packages-serverless/midway-fc-starter/src/index.ts 的onInit中可以看到它正是从初始化上下文context.service.name与context.function.name中取得这两个值。触发器触发器也叫 Event事件、Trigger特指触发函数的方式。与传统的开发理念不同函数不需要自己启动一个服务去监听数据而是通过绑定一个或者多个触发器数据通过类似事件触发的机制调用到函数。在midwayjs/faas中HandlerOptions通过isHttpFunction区分触发类型见 packages/faas/src/interface.ts#L419-L422框架据此选择不同的中间件链与参数注入方式。FC 启动器在onRequest中通过事件特征判断触发方式见 packages-serverless/midway-fc-starter/src/index.ts#L86-L96event是IncomingMessage/EventEmitter时为 HTTP 触发事件含headers、queryParameters、httpMethod时为 API 网关触发否则按事件触发器处理Buffer 入参会先转为 UTF-8 字符串再尝试 JSON 解析。函数运行时英文叫 Runtime具体指执行函数的环境。在各个平台可能是镜像也可能是 Node.js 代码包例如社区常见的 kubeless 运行时。该代码包会实现对接平台的各种接口、处理异常、转发日志等能力。仓库中的midwayjs/serverless-fc-starter正是运行时/启动器这一角色的实例。它的 README见 packages-serverless/midway-fc-starter/README.md说明了其用途用于包裹无法定制运行时的 FaaS 平台比如阿里云 FC。启动器暴露exports.initinitializer 初始化入口与exports.handler函数入口内部通过AbstractBootstrapStarter初始化 Midway 容器与框架再调用framework.invokeTriggerFunction完成函数分发。onStart()中还会针对 FC 环境做特殊处理见 packages-serverless/midway-fc-starter/src/index.ts#L23-L55设置MIDWAY_SERVERLESS_REPLACE_LOGGER替换默认上下文日志、设置MIDWAY_LOGGER_DISABLE_COLORS禁用控制台颜色FC 控制台无法探测颜色支持日志采集必须禁用并支持initializeMethodName、handlerName、aggregationHandlerName等入口配置。发布平台函数最后承载的平台。现在社区最常见的有阿里云 FC、腾讯云 SCF、AWS 的 Lambda 等。仓库通过packages-serverless/faas-typings为不同平台提供了事件类型定义packages-serverless/faas-typings/typings/fc.ts 定义了阿里云 FC 的 OSS、CDN、MNS 等事件结构packages-serverless/faas-typings/typings/scf.ts 则对应腾讯云 SCF 的事件模型。同时midwayjs/faas的IFaaSConfigurationOptions提供了applicationAdapter平台适配器抽象见 packages/faas/src/interface.ts#L472-L485允许各平台通过getFunctionName、getFunctionServiceName、runAppHook、runContextHook等钩子接入统一的函数框架从而屏蔽平台差异。Layer由于运行时的代码比较简单且需要保证稳定性、无法经常性地更新Layer 被设计出来用于扩展运行时的能力同时可以精简本地的函数代码量因为有一些平台限制了上传压缩包的大小。Layer 是平台侧提供的共享依赖层能力把常见的公共依赖如 node_modules、ffmpeg 等二进制、公共配置打包成层函数在运行时挂载即可使用既避免重复上传大体积代码包也让运行时本身的更新可以独立于业务函数进行。这一设计正好呼应了上文函数代码包应当精简的约束以及函数不能做的事里对自定义环境如 C 动态链接库的限制——在平台不支持自定义运行时的情况下Layer 提供了一条补充运行时能力的路径。小结从应用到函数先评估边界再动手通过上面的梳理可以看出Midway Serverless 的定位非常清晰复用 Midway 的依赖注入、配置、装饰器与工具链把应用改造成函数组 函数 触发器的结构部署到各云平台。改造前应优先对照函数不能做什么的清单做边界评估——执行时长、有状态存储、长连接、大文件、自定义环境、固定 IP 等场景都不适合直接函数化。如果决定走函数化路线可以从本文提到的三个仓库模块入手继续深入函数框架与中间件调度看 packages/faas/src/framework.ts 和 packages/faas/src/configuration.ts平台启动器与入口封装看 packages-serverless/midway-fc-starter/src/index.tsHTTP 事件到 Koa 风格上下文的转换看 packages-serverless/serverless-http-parser/src。本文所属的 Serverless 系列文档还包含平台部署aliyun_faas.md、aws_lambda.md、上下文与开发调试serverless_context.md、serverless_dev.md等专题可作为下一步阅读的入口。赞分享后端微服务云原生【免费下载链接】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 入门指南Node.js 云函数框架的能力边界与核心术语全解析Midway Serverless 入门指南Node.js 云函数框架的能力边界与核心术语全解析 Midway Serverless 是 Midway 体系下后端微服务云原生Midway Serverless 框架入门函数即服务FaaS能力边界与术语体系全解析Midway Serverless 框架入门函数即服务FaaS能力边界与术语体系全解析 本文基于 Midway 开源仓库 site/versioned_d后端微服务云原生Midway Serverless 入门指南基于 midwayjs/faas 的 Node.js 云函数开发全解析Midway Serverless 入门指南基于 midwayjs/faas 的 Node.js 云函数开发全解析 导读 Midway Serverless后端微服务云原生上一篇Python性能监控与分布式追踪OpenTelemetry完全指南下一篇Newt ProxyManager源码解析TCP/UDP代理的高效实现之道创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考