介绍

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

sandbox代码在线体验: https://codesandbox.io/p/sandbox/elated-frog-rt4w4v?file=%2Fsrc%2Fcontroller%2FHomeController.ts%3A7%2C25

框架技术栈

  • 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种快速上手模式

小提示:此处提供了sandbox代码在线体验: https://codesandbox.io/p/sandbox/elated-frog-rt4w4v?file=%2Fsrc%2Fcontroller%2FHomeController.ts%3A7%2C25

编写一个简单的Controller

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';
}
}
  • 访问
http://127.0.0.1:3000/example/simple/get?name=xxx

列举一些当前支持的能力

支持多进程模型

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

Cluster 配置

// src/config/config.default.ts
/**
* cluster config
*/
config.cluster = {
enable: true,
};
  • 自定义启动进程数
// 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数据

以下案例是通过生成的openapi得到的接口文档案例

  • 接口列表信息

  • 接口详情

  • 也可以导入 Swagger 中进行接口文档展示

支持生成前端request代码

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

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

限流插件

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

限流规则

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

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

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

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

其他插件

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

Yunfly 一款高效、性能优异的 node.js web 框架的更多相关文章

  1. Koa – 更加强大的下一代 Node.js Web 框架

    Koa 是 Express 的开发团队设计的下一代 Web 框架,其目的是为 Web 应用程序提供更小,更具表现力,更坚实的基础.Koa 没有核捆绑任何中间件,并提供了一​​套优雅的方法,使服务器端开 ...

  2. 强大的 Node.js Web 框架 - Daze.js

    去年年初对 Node.js 比较感兴趣,也用了很多 Node.js 的框架,但是开发体验不是特别好,我之前也是后端转前端,然后再接触 Node.js ,所以用过挺多的服务端框架,相对js而言,设计一款 ...

  3. Node.js Web框架收集

    原文地址:http://geek.csdn.net/news/detail/4020 框架列表: http://nodeframework.com/ 与其他很多语言一样,Node.js也有很多Web框 ...

  4. 全端开发必备!10个最好的 Node.js MVC 框架

      Node.js 是最流行的 JavaScript 服务端平台,它允许建立可扩展的 Web 应用程序.Node.js 包含不同类型的框架,如 MVC 框架.全栈框架.REST API  以及大量的服 ...

  5. 十款最佳Node.js MVC框架

    十款最佳Node.js MVC框架摘要:Node.js是JavaScript中最为流行的框架之一,易于创建可扩展的Web应用.本文分享十款最佳的JavaScript框架. Node.js是JavaSc ...

  6. 私人定制,十款最佳Node.js MVC框架

    Node.js是JavaScript中最为流行的框架之一,易于创建可扩展的Web应用.本文分享十款最佳的JavaScript框架. Node.js是JavaScript中最为流行的框架之一,易于创建可 ...

  7. 【360开源】thinkjs:基于Promise的Node.js MVC框架 (转)

    thinkjs是360奇舞团开源的一款Node.js MVC框架,该框架底层基于Promise来实现,很好的解决了Node.js里异步回调的问题.360奇舞团(奇虎75Team),是奇虎360公司We ...

  8. 《Node.js入门》CentOS 6.5下Node.js Web开发环境搭建笔记

    近期想尝试一下英特尔的基于WebRTC协同通信开发套件,所以须要在本地搭建Node.js Web的开发測试环境. 这里讲的是CentOS 下的搭建方法.使用Windows的小伙伴请參考: <No ...

  9. Windows 7下Node.js Web开发环境搭建笔记

    Node.js是什么? 我们看看百科里怎么说的?JavaScript是一种运行在浏览器的脚本,它简单,轻巧,易于编辑,这种脚本通常用于浏览器的前端编程,但是一位开发者Ryan有一天发现这种前端式的脚本 ...

  10. Node.js日志框架选型比較:Winston

    日志对于问题定位.调试,系统性能调优至关重要,尤其是系统复杂以及在线执行的情况下. 好的开发框架都会有一个可开启关闭/可配置记录级别的日志系统.我们从下面几个方面来做选型: 1. 每行日志都须要有准确 ...

随机推荐

  1. 数据结构(DataStructure)-01

    数据结构-01 **数据结构与算法** **算法概述** **时间复杂度概述** **时间复杂度 - 计算规则** **数据结构概述** **抽象数据类型** **线性表 - 顺序表** **线性表 ...

  2. 计算机网络之MAC和IP地址

    MAC地址 在局域网中,硬件地址,又称为物理地址或MAC地址. 目前现在的局域网中实际上使用的都是6字节的MAC地址,所以每一个以太网设备都具有唯一的MAC地址. MAC地址的格式 假设传输使用的是I ...

  3. NC19427 换个角度思考

    题目链接 题目 题目描述 给定一个序列,有多次询问,每次查询区间里小于等于某个数的元素的个数 即对于询问 \((l,r,x)\) ,你需要输出 \(\sum_{i=l}^{r}[a_i \le x]\ ...

  4. EasyExcel设置单元格边框

    /** * 单元格边框 * @return {@link HorizontalCellStyleStrategy} * @date 2021/10/26 13:22 * @author <a h ...

  5. 在docker容器里,ffmpeg给视频文件内嵌字幕文件,不生效,如何解决?

    用ffmpeg命令,发现执行成功,但视频文件就是没有字幕.看不出问题出现在什么地方.后来直接用ffmpeg添加水印命令测试,发现是缺少字体文件,如下图所示: 报Fontconfig error: Ca ...

  6. 2022-09-11:arr是一个可能包含重复元素的整数数组,我们将这个数组分割成几个“块”, 并将这些块分别进行排序。之后再连接起来,使得连接的结果和按升序排序后的原数组相同。 我们最多能将数组分成

    2022-09-11:arr是一个可能包含重复元素的整数数组,我们将这个数组分割成几个"块", 并将这些块分别进行排序.之后再连接起来,使得连接的结果和按升序排序后的原数组相同. ...

  7. 2021-03-18:给定一个字符串str,只由‘X’和‘.’两种字符构成。‘X’表示墙,不能放灯,也不需要点亮,‘.’表示居民点,可以放灯,需要点亮。如果灯放在i位置,可以让i-1,i和i+1三个位置被点亮。返回如果点亮str中所有需要点亮的位置,至少需要几盏灯。

    2021-03-18:给定一个字符串str,只由'X'和'.'两种字符构成.'X'表示墙,不能放灯,也不需要点亮,'.'表示居民点,可以放灯,需要点亮.如果灯放在i位置,可以让i-1,i和i+1三个位 ...

  8. Django-1:安装、更新、查看版本

    安装: pip install Django 更新: pip3 install -U Django 或者 python -m pip install -U Django 查看: python -m d ...

  9. springboot 自动装配的原理

    自动装配原理 问题就是为什么我们直接导入依赖就可以使用了,甚至不用配置web.xml,tomcat等,springboot内部是如何实现的? 主启动类上的注解@SpringBootApplicatio ...

  10. npm run serve/build 背后的真实操作

    vue CLI 用起来的确很舒服,方便省事,但他经过层层封装很难明白,执行完那个npm run serve/build 后他都干了些什么,甚至不知道整个项目是怎么跑起来的,今天自己抽时间就去瞅瞅,为加 ...