后端微服务云原生【免费下载链接】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 函数开发文档系统讲解如何从零编写一个可部署到云环境的 FaaS 函数从脚手架初始化、目录结构、ServerlessTrigger/ServerlessFunction装饰器用法到本地调试与阿里云 FC 部署的完整闭环。读完本文你将掌握 Midway 函数化开发的标准化写法f.yml Class 式函数理解触发器和函数元信息在源码中的定义与解析方式并能独立完成第一个纯 HTTP 函数的发布与访问。初始化代码创建一个 FaaS 项目开发第一个纯 HTTP 函数前先确认本机 npm 版本Midway 脚手架在不同 npm 主版本下的初始化命令略有差异$ npm -v # 如果是 npm v6 $ npm init midway --typefaas my_midway_app # 如果是 npm v7 $ npm init midway -- --typefaas my_midway_app也可以直接执行npm init midway在交互界面中选择faas脚手架效果相同。脚手架会生成一个包含函数定义文件、TypeScript 编译配置与示例函数的最小项目函数发布到云环境后即可按调用量计费各云平台均提供免费额度一般开发调试场景不产生费用。目录结构一个函数的最精简形态初始化完成后的项目结构如下核心是一个标准化函数定义文件f.yml以及 TypeScript 的工程骨架. ├── f.yml # 标准化 spec 文件 ├── package.json # 项目依赖 ├── src │ └── function │ └── hello.ts ## 函数文件 └── tsconfig.json各文件职责如下f.yml—— 函数定义文件描述函数组服务名、发布平台、域名等元信息构建时据此生成各云平台所能识别的部署文件tsconfig.json—— TypeScript 配置文件控制源码编译行为src—— 函数源码目录src/function/hello.ts—— 示例函数文件。将函数统一放在function目录下是为了与项目中其他类型的代码如configuration配置、service业务类清晰隔离。从仓库实现看启动器会根据运行环境自动定位代码根目录在 TypeScript 环境下使用src编译产物环境发布运行下使用dist相关逻辑见 packages/faas/src/starter.ts。函数文件用 Class 装饰器定义函数传统 Serverless 平台上的函数是一个裸functionMidway 为了复用自身的依赖注入体系将其封装为 Class 形态。函数默认就是一个Provide()的 IoC 组件可以注入Context也可以注入任何其他自定义服务。下面是一个典型的 HTTP 函数通过ServerlessTrigger装饰器把方法标注为 HTTP 接口并声明path与method属性import { Provide, Inject, ServerlessTrigger, ServerlessTriggerType, Query } from midwayjs/decorator; import { Context } from midwayjs/faas; Provide() export class HelloHTTPService { Inject() ctx: Context; ServerlessTrigger(ServerlessTriggerType.HTTP, { path: /, method: get, }) async handleHTTPEvent(Query() name midway) { return hello ${name}; } }代码要点ServerlessTrigger(ServerlessTriggerType.HTTP, {...})声明这是一个 HTTP 触发器path为访问路径method为 HTTP 方法Query() name midway为参数装饰器自动从查询串解析name缺省值为midway函数返回值直接作为 HTTP 响应体返回。Context类型来自midwayjs/faas它融合了 HTTP 请求/响应对象与 Midway 的运行时上下文requestContext、logger、env等完整定义见 packages/faas/src/interface.ts。触发器装饰器的源码实现ServerlessTrigger本身是一个方法装饰器MethodDecorator其核心逻辑位于 packages/core/src/decorator/faas/serverlessTrigger.ts当触发器类型为HTTP或API_GATEWAY时若未显式传入method会自动补全为getmetadata[method] metadata[method] ?? get这解释了为什么只写path也能生成一个可访问的 GET 接口通过DecoratorManager.saveModule(FUNC_KEY, target.constructor)将类注册到函数模块列表通过MetadataManager.attachMetadata(FUNC_KEY, { type, methodName, metadata }, target)把触发器类型、方法名与参数挂到类元数据上供构建期读取。触发器类型是一个枚举ServerlessTriggerType定义在 packages/core/src/interface.ts除 HTTP 外还包括event—— 通用事件apigw—— API 网关os—— 对象存储OSScdn—— CDN 事件log—— 日志服务timer—— 定时任务mq—— 消息队列kafka—— Kafka 事件hsf、mtop、ssr等平台特定类型函数级元信息ServerlessFunction 与多触发器除触发器外还可以用ServerlessFunction描述函数层面的元信息例如函数名、并发度、超时时间等。当需要在同一个函数上挂载多个触发器时二者组合使用例如同一个定时函数同时注册每 5 分钟与每 10 分钟两个 TIMER 触发器import { Provide, Inject, ServerlessTrigger, ServerlessTriggerType, Query } from midwayjs/decorator; import { Context } from midwayjs/faas; Provide() export class HelloServerlessService { Inject() ctx: Context; // 一个函数多个触发器 ServerlessFunction({ functionName: abcde, }) ServerlessTrigger(ServerlessTriggerType.TIMER, { type: every, value: 5m, }) ServerlessTrigger(ServerlessTriggerType.TIMER, { type: every, value: 10m, }) async handleTimerEvent() { // TODO } }:::caution 注意有些平台无法将不同类型的触发器放在同一个函数中比如阿里云规定HTTP 触发器和其他触发器不能同时在一个函数生效。因此在设计函数时应将 HTTP 类触发器与定时/事件类触发器拆分为不同函数。 :::函数定义文件f.ymlf.yml是函数的定义文件构建时 Midway 会依据它生成目标平台所能识别的部署文件。最小示例内容如下service: name: midway-faas-examples ## 函数组名可以理解为应用名 provider: name: aliyun ## 发布的平台这里是阿里云 custom: customDomain: domainName: auto ## 由于发布 HTTP 服务域名这里使用自动生成后续可以单独绑定字段说明service.name—— 函数组名相当于应用名同一组下的函数在平台控制台上归为一组管理provider.name—— 目标云平台标识常见取值包括aliyun阿里云 FC、腾讯云等custom.customDomain.domainName—— 自定义域名配置设为auto表示由平台自动生成临时域名发布后可用该域名做开发与调试后续可替换为自行绑定的域名。f.yml与装饰器声明共同构成了函数即代码的双重描述装饰器负责在源码层面描述触发行为f.yml负责描述部署层面服务名、平台、域名的规格。触发器装饰器参数详解ServerlessTrigger的第二个参数即触发器信息它由通用触发器参数 各触发器专属参数组成。通用参数定义于TriggerCommonOptions见 packages/core/src/interface.ts包括functionName—— 所属函数名name—— 触发器名称role—— 函数调用角色仅阿里云生效version—— 函数发布版本仅阿里云生效isDeploy—— 是否部署该触发器middleware—— 函数中间件。各类型触发器的专属参数在源码中均有对应接口HTTP 触发器HTTPTriggerOptionspackages/core/src/interface.tspath必填、method可选值为get、post、delete、put、head、patch、all定时触发器TimerTriggerOptionspackages/core/src/interface.tstype取cron、every、interval三选一value为对应表达式如5m、*/5 * * * * *另有payload与enable对象存储触发器OSTriggerOptionsbucket、events、filter前缀/后缀日志触发器LogTriggerOptionssource、project、log、retryTime、interval消息队列触发器MQTriggerOptionstopic、tags、region、strategy重试策略。例如把定时触发器的名称修改为abcServerlessTrigger(ServerlessTriggerType.TIMER, { name: abc, type: every, value: 5m, })函数装饰器参数详解ServerlessFunction用于定义函数级元信息其参数对应ServerlessFunctionOptionspackages/core/src/interface.ts常用项包括functionName—— 函数名description—— 函数描述memorySize—— 函数内存单位 Mtimeout—— 函数执行超时时间单位秒默认 3sinitTimeout—— 初始化超时时间仅阿里云 FC 生效默认 3sruntime—— 函数运行时如nodejs10、nodejs12、nodejs14concurrency—— 单实例并发度仅阿里云生效stage—— 函数调用阶段环境仅腾讯云生效environment—— 环境变量键值对isDeploy—— 是否部署handlerName—— 函数处理器名如index.handler。示例ServerlessFunction({ functionName: abcde, initTimeout: 3, // 初始化超时只对阿里云 fc 有效默认 3s timeout: 3 // 函数执行超时时间默认 3s })装饰器实现同样位于 packages/core/src/decorator/faas/serverlessTrigger.ts通过MetadataManager.defineMetadata(SERVERLESS_FUNC_KEY, options, target, key)将函数元信息写入类方法元数据构建期与f.yml合并后生成平台部署文件。本地开发像 Web 应用一样调试HTTP 函数的本地开发体验与传统 Web 应用一致输入以下命令启动本地 HTTP 服务器$ npm run dev $ open http://localhost:7001Midway 会启动 HTTP 服务器浏览器访问 http://127.0.0.1:7001页面会打印出Hello midwayjs的信息。这也意味着你可以在本地使用浏览器、curl、Postman 等任意工具对函数做完整的 HTTP 联调再发布到云端。部署函数一键打包发布部署函数直接执行发布命令即可完成打包与部署$ npm run deploy:::info 如果部署过程中输错了账号信息可以重新执行npx midway-bin deploy --resetConfig修改配置后再次部署。 :::这里以阿里云 FC 平台演示如需部署到腾讯云操作流程相似只是provider.name与平台凭证、触发器的配置不同可参照仓库 site/docs/serverless 下的 Serverless 部署文档。阿里云部署首次需要配置accountId、accountKey、accountSecret三个账号参数accountId—— 阿里云账号 IDaccountKeyAccessKey ID与accountSecretAccessKey Secret—— 阿里云 AccessKey 凭证可在阿里云控制台的 AccessKey 管理页面生成出于安全考虑建议使用 RAM 子账号并仅授予函数计算相关的权限。发布完成后从平台控制台即可获取当前函数的访问 URL。由于开启了自动域名customDomain.domainName: auto阿里云会免费赠送一个临时域名用于开发与调试后续也可以自行绑定新的自定义域名。总结Midway 的 Serverless 开发把函数抽象为带触发器的 ClassServerlessTrigger声明方法对外暴露的事件入口HTTP、定时、对象存储、消息队列等ServerlessFunction声明函数运行规格f.yml声明部署规格。三者结合使同一套 TypeScript 代码既能本地热更新调试也能一键发布到阿里云、腾讯云等平台。如需进一步阅读可深入仓库源码装饰器实现见 packages/core/src/decorator/faas/serverlessTrigger.ts触发器与函数参数类型定义见 packages/core/src/interface.tsFaaS 运行时上下文与启动器分别见 packages/faas/src/interface.ts 与 packages/faas/src/starter.ts包整体能力说明见 packages/faas/package.json。赞分享后端微服务云原生【免费下载链接】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 midwayjs/faas 为对象后端微服务云原生Midway 部署阿里云函数计算FC实战指南触发器开发、本地测试与 Serverless Devs 部署Midway 部署阿里云函数计算FC实战指南触发器开发、本地测试与 Serverless Devs 部署 本文以 Midway 的 Serverless后端微服务云原生Midway 阿里云函数计算FC部署实战触发器开发、Serverless Devs 部署与自定义运行时接入Midway 阿里云函数计算FC部署实战触发器开发、Serverless Devs 部署与自定义运行时接入 本篇技术指南围绕 Midway 框架在阿里云函后端微服务云原生上一篇OpenRig rig discover与rig adopt教程把已有Claude Code和Codex会话纳管下一篇从传统ML到LLMBeginner-Data-Science-Projects Airbnb评论情感分析全栈流水线深度解析创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考