什么?大二学生竟然用koa写了一个企业级BFF框架?

92 阅读4分钟

如果你对koa还不了解的话,可以先阅读 《什么是koa?》这篇文章内容,可以帮助你快速了解什么是koa!

1. 框架概述

Elpis 是一个基于 Node.js 和 Koa 的企业级应用框架,采用模块化设计,支持多环境配置(local、beta、prod),旨在提供统一、可扩展的企业级应用开发解决方案。

2. 整体架构

image.png

2.1 目录结构

elpis/
├── app/                  # 业务代码目录
│   ├── controller/       # 控制器层
│   ├── service/          # 服务层
│   ├── router/           # 路由定义
│   ├── router-schema/    # 路由参数校验规则
│   ├── middleware/       # 中间件
│   ├── extend/           # 扩展模块 如日志工具log4js
│   └── public/           # 静态资源
├── elpis-core/           # 框架核心
│   ├── loader/           # 模块加载器
│   ├── env.js            # 环境配置
│   └── index.js          # 框架入口
├── config/               # 配置文件
└── index.js              # 项目启动入口

2.2 核心组件

  1. 框架核心 (elpis-core)

    • 负责整个应用的启动和模块加载
    • 通过不同的加载器加载业务模块
  2. 模块加载器 (Loaders)

    • config.js: 加载配置文件
    • controller.js: 加载控制器
    • service.js: 加载服务
    • middleware.js: 加载中间件
    • router.js: 加载路由
    • router-schema.js: 加载路由参数校验规则
    • extend.js: 加载扩展模块

    Loader其实就是遍历加载app目录下的业务文件,然后挂载在app对象实例下,方便在运行时直接调用。

image.png 3. 业务模块 (app/)

-   controller: 处理请求和响应
-   service: 实现业务逻辑
-   router: 定义路由映射
-   middleware: 处理请求中间逻辑
-   extend: 扩展应用功能 

那么问题来了:这跟koa有什么关系呢?

接下来,就通过一个洋葱圈图,来说明是如何用koa框架来实现的。

image.png

3. 框架特性

3.1 模块化设计

框架采用模块化设计,将不同功能划分为独立模块:

  • Controller-Service 模式:遵循 MVC 架构,控制器负责处理请求,服务负责业务逻辑
  • 自动加载机制:通过 loader 自动扫描并加载各模块
  • 命名转换:文件名自动转换为驼峰命名(如 custom-module 转为 customModule)

3.2 多环境支持

框架支持三种环境:

  • local(本地开发)
  • beta(测试环境)
  • prod(生产环境)

配置加载器会根据当前环境加载对应的配置文件,优先级为环境配置覆盖默认配置。

3.3 中间件系统

框架实现了完整的中间件系统,包括:

  • 错误处理中间件(error-handler) 【在洋葱圈的最外层用 try catch 捕获所有的错误】
  • API 签名校验中间件(api-sign-verify) 【请求头里面用md5校验】
  • API 参数校验中间件(api-params-verify) 【ajv和jsonschema配合校验路由】

中间件按照注册顺序执行,提供了请求处理前后的钩子。

3.4 路由与参数校验

  • 路由采用 koa-router 实现
  • 支持基于 JSON Schema 的参数校验
  • 通过 router-schema 定义接口参数校验规则

3.5 扩展机制

框架支持通过 extend 目录扩展应用功能,如日志扩展等。

4. 工作流程

  1. 应用启动时,通过 index.js 调用 elpis-core/index.js 的 start 方法

  2. 框架初始化 Koa 实例并设置基础配置

  3. 加载顺序优化说明:

    1. config 配置最先加载
    • 配置信息是基础,其他模块可能需要根据配置进行初始化
    • 例如数据库连接、API密钥等都需要在其他组件初始化前准备好
    1. extend 扩展功能其次
    • 扩展功能可能被其他模块使用,应该在service等之前加载
    • 为其他模块提供扩展能力
    1. service 服务层第三
    • 服务层是业务逻辑的核心,通常不依赖controller等上层模块
    • 但可能需要配置信息和扩展功能
    1. routerSchema 路由模式
    • 路由校验规则,依赖关系较少
    1. middleware 中间件
    • 中间件可能需要用到service、config等
    • 需要在路由注册前准备好
    1. controller 控制器
    • 控制器依赖service等组件
    • 是路由处理的直接执行者
    1. 全局中间件
    • 必须在路由之前注册,但需要controller等已经加载完成
    1. router 路由
    • 最后加载,因为它需要所有controller已经准备就绪
    • 路由是实际的请求入口点
  1. 启动服务监听端口

5. 技术栈

  • 后端框架:Koa 2.7.0
  • 路由:koa-router 7.4.0
  • 参数校验:Ajv (Another JSON Schema Validator)
  • 日志:log4js 6.9.1
  • 构建工具:Webpack 5.88.1

6. 总结

Elpis 框架通过模块化设计和自动加载机制,提供了一套完整的后端开发解决方案。其核心优势在于:

  1. 清晰的架构分层,便于维护和扩展
  2. 灵活的模块加载机制,支持自动扫描和注册
  3. 完善的中间件系统,提供统一的请求处理流程
  4. 强大的参数校验功能,确保接口安全性
  5. 多环境支持,适应不同部署场景