Yunfly 一款高效、性能优异的node.js企业级web框架

介绍

Yunfly 一款高性能 Node.js WEB 框架, 使用 Typescript 构建我们的应用。

使用 Koa2 做为 HTTP 底层框架, 使用 routing-controllerstypedi 来高效构建我们的 Node 应用。

Yunfly 在 Koa 框架之上提升了一个抽象级别, 但仍然支持 Koa 中间件。在此基础之上, 提供了一套强大的插件系统, 给开发者提供更强大更灵活的能力。

github地址:https://github.com/yunke-yunfly/yunflyjs

文档地址:https://yunke-yunfly.github.io/doc.github.io/document/introduction/introduce

框架技术栈

  • Koa2 node.js http 框架, async await异步编程 参考文档
  • find-my-way 一款高性能的 http 路由器 参考文档
  • typescript 微软开发的自由和开源的编程语言, 它是JavaScript的一个超集, 添加了可选的静态类型和基于类的面向对象编程 参考文档
  • routing-controllers 使用装饰器的方式来进行路由的开发 参考文档
  • typedi: 依赖注入插件工具 参考文档
  • grpc: 一个高性能、开源和通用的 RPC 框架 参考文档
  • winston: javascript 的 log 日志插件 参考文档

与社区框架差异

能力 yunfly eggjs nestjs
Typescript ❌[支持但不友好]
cluster
openapi
框架约束 部分约束 约束 自由
扩展模型 插件 插件 模块

性能

yunfly 框架底层 web 库为 koa, 路由开发模型库为 routing-controllers, 路由命中库为 find-my-way。

koa 对于写业务来说性能是足够优异的,routing-controllers 使用装饰器的方式来进行路由的开发,对于开发者来说是很提效的。

框架剔除了低效的 koa-router 更换为高效的 find-my-way。框架未内插件,开发者可以根据自己的需求定制插件。

性能压测

以下性能测试为同一台机器同样的容器场景下压测3分钟得出的结果。

容器环境

1G1核 Docker 容器

hello world 场景

web框架 qps 备注
yunfly 6400 使用 koa 为底层库
eggjs 3950 使用 koa 为底层库
nestjs 2900 使用 express 为底层库
nestjs 7200 使用 fastify 为底层库

1000 个路由场景

web框架 qps 备注
yunfly 6100 使用 koa 为底层库
eggjs 1680 使用 koa 为底层库
nestjs 2050 使用 express为底层库
nestjs 6550 使用 fastify为底层库

以上压测结果不同的机器得出的结果会略有不同。

开始使用

当前提供了2种快速上手模式

编写一个简单的Controller

ts 复制代码
import { Get, JsonController, BodyParam, Post, QueryParam } from '@yunflyjs/yunfly';
/**
 * 测试案例controller
 *
 * @export
 * @class TestController
 */
@JsonController('/example')
export default class ExampleController {
  /**
   * 简单案例 - get
   *
   * @param {string} name 姓名
   * @return {*}  {string}
   * @memberof ExampleController
   */
    @Get('/simple/get')
    simple(
        @QueryParam('name') name: string,
    ): string {
        return name || 'success';
    }
    /**
    * 简单案例 -post
    *
    * @param {string} name 姓名
    * @return {*}  {string}
    * @memberof ExampleController
    */
    @Post('/simple/post')
    simple1(
        @BodyParam('name') name: string,
    ): string {
        return name || 'success';
    }
}
  • 访问应用
shell 复制代码
http://127.0.0.1:3000/example/simple/get?name=xxx

当前支持的一些特性

支持多进程模型

若应用需要开启node多进程,只需要在 config 中配置启用即可,单多进程模型随意切换

Cluster 配置

ts 复制代码
// src/config/config.default.ts
/**
 * cluster config
 */
config.cluster = {
  enable: true,
};
  • 自定义启动进程数
ts 复制代码
// src/config/config.default.ts
config.cluster = {
  enable: true,
  count: 4,
};
  • 备注:在 docker 容器场景下,会优先获取容器分配的cpu核数, 优先级:容器核数 > config.cluster.count

随意定制你的框架

yunfly web框架是由基础包+一个个插件组合而成,框架自身提供了很多插件,支持开发者自定义插件。

备注:yunfly 的插件部分理念实现参考了eggjs的插件模型

开发者可以把常规插件+自定义插件打包成一个集合组装成一个新的框架。

此处能力可以参考:Yunfly 框架开发

支持生成openapi

框架提供了辅助插件 routing-controllers-to-openapi, 能把所有路由与Typescript代码转换为openapi, 进而你可以通过openapi生成接口文档信息。

  • 支持 typescript 生成 jsonschema
  • 支持注释(行内注释,代码块上方注释,块级注释)
  • ts 类型描述的越全,接口生成的越详细
  • 支持所有的 routing-controllers api方法

关于ts生成openapi更详细的文档请参考:框架生成OpenAPI数据

支持生成前端request代码

框架提供辅助插件openapiv3-gen-typescript, 能通过openapi 生成前端request代码

  • 因此可以通过routing-controllers-to-openapi 生成openapi, 再通过openapi生成前端request代码

关于openapi生成request代码详细文档:openapi 生成前端 request 代码

限流插件

为了防止流量洪峰时应用的崩溃,我们可以采取限流的方式来保护我们的应用,限流有多种规则

限流规则

  • Node.js应用 整体限流,即: 应用在某一段时间内所有接口的总流量限制
  • 具体 path 路径限流, 即: 应用在某一段时间内某个具体的 path 路径的流量限制
  • 具体 path+具体用户限流, 即: 应用在某一段时间内某个 path 单个用户的流量限制

支持规则动态变更实时生效

配置化的限流规则是不够灵活的,对业务来说不能实时生效,基于此插件提供动态更新的 api

ts 复制代码
import { updateRateLimiterRules } from '@yunflyjs/yunfly-plugin-rate-limiter'
 
// 例如:EtchChange为规则变更监听函数,当规则变更时通过 updateRateLimiterRules api 实时更新限流规则
EtchChange().then((data: NeedRateLimiterOption)=>{
  updateRateLimiterRules(data)
})

限流插件使用文档请参考:https://yunke-yunfly.github.io/doc.github.io/document/secruity/rate-limiter

node 性能排查,v8profiler插件

数据库操作插件prisma

对于数据库的操作,框架提供了prisma插件,它是新一代 orm 工具, 支持 MySql SQLite SQL Server MongoDB PostgreSQL。

Redis 插件

redis 是BFF服务或服务端开发经常用到的内存数据库,框架提供了redis插件 @yunflyjs/yunfly-plugin-redis

其他插件

框架还提供了一下常用的其他插件,例如:

相关推荐
虾球xz30 分钟前
游戏引擎学习第20天
前端·学习·游戏引擎
我爱李星璇36 分钟前
HTML常用表格与标签
前端·html
疯狂的沙粒39 分钟前
如何在Vue项目中应用TypeScript?应该注意那些点?
前端·vue.js·typescript
小镇程序员1 小时前
vue2 src_Todolist全局总线事件版本
前端·javascript·vue.js
野槐1 小时前
前端图像处理(一)
前端
程序猿阿伟1 小时前
《智能指针频繁创建销毁:程序性能的“隐形杀手”》
java·开发语言·前端
疯狂的沙粒1 小时前
对 TypeScript 中函数如何更好的理解及使用?与 JavaScript 函数有哪些区别?
前端·javascript·typescript
瑞雨溪1 小时前
AJAX的基本使用
前端·javascript·ajax
力透键背1 小时前
display: none和visibility: hidden的区别
开发语言·前端·javascript
程楠楠&M1 小时前
node.js第三方Express 框架
前端·javascript·node.js·express