Yunfly 一款高效、性能优异的node.js企业级web框架
介绍
Yunfly 一款高性能 Node.js WEB 框架, 使用 Typescript 构建我们的应用。
使用 Koa2 做为 HTTP 底层框架, 使用 routing-controllers 、 typedi 来高效构建我们的 Node 应用。
Yunfly 在 Koa 框架之上提升了一个抽象级别, 但仍然支持 Koa 中间件。在此基础之上, 提供了一套强大的插件系统, 给开发者提供更强大更灵活的能力。
github地址:https://github.com/yunke-yunfly/yunflyjs
文档地址:https://yunke-yunfly.github.io/doc.github.io/document/introduction/introduce
框架技术栈
Koa2node.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
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数据
支持生成前端request代码
框架提供辅助插件openapiv3-gen-typescript, 能通过openapi 生成前端request代码

- 因此可以通过
routing-controllers-to-openapi生成openapi, 再通过openapi生成前端request代码
关于openapi生成request代码详细文档: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插件
- 实时获取 cpuprofile 插件, 用于性能瓶颈分析。
当应用出现性能瓶颈时,排查是一件比较复杂的事情,框架提供了@yunke/yunfly-plugin-v8-profiler用于cpu性能排查。

性能瓶颈插件详细使用文档:https://yunke-yunfly.github.io/doc.github.io/document/plugin/cpuprofile
数据库操作插件prisma
对于数据库的操作,框架提供了prisma插件,它是新一代 orm 工具, 支持 MySql SQLite SQL Server MongoDB PostgreSQL。
- prisma插件详细使用文档:https://yunke-yunfly.github.io/doc.github.io/document/technology/prisma
Redis 插件
redis 是BFF服务或服务端开发经常用到的内存数据库,框架提供了redis插件 @yunflyjs/yunfly-plugin-redis
- redis插件详细使用文档:https://yunke-yunfly.github.io/doc.github.io/document/technology/redis
其他插件
框架还提供了一下常用的其他插件,例如:
- socket插件:https://yunke-yunfly.github.io/doc.github.io/document/technology/socket
- prometheus插件:https://yunke-yunfly.github.io/doc.github.io/document/technology/prometheus
- jwt插件:https://yunke-yunfly.github.io/doc.github.io/document/secruity/jwt
- apollo插件:https://yunke-yunfly.github.io/doc.github.io/document/plugin/apollo
- 安全插件:https://yunke-yunfly.github.io/doc.github.io/document/plugin/secruity
- 内存检查插件:https://yunke-yunfly.github.io/doc.github.io/document/plugin/memory-check
- etcd插件: https://yunke-yunfly.github.io/doc.github.io/document/plugin/etcd
- alinode插件:https://yunke-yunfly.github.io/doc.github.io/document/plugin/alinode
- 熔断:https://yunke-yunfly.github.io/doc.github.io/document/secruity/fusing
- grpc: https://yunke-yunfly.github.io/doc.github.io/document/technology/grpc
相关文章:
Yunfly 一款高效、性能优异的node.js企业级web框架
介绍 Yunfly 一款高性能 Node.js WEB 框架, 使用 Typescript 构建我们的应用。 使用 Koa2 做为 HTTP 底层框架, 使用 routing-controllers 、 typedi 来高效构建我们的 Node 应用。 Yunfly 在 Koa 框架之上提升了一个抽象级别, 但仍然支持 Koa 中间件。在此基础之上, 提供了一…...
mac m1安装Centos9
先看结果(在mac M1 安装centos8 安装不成功的原因大部分是没有找到正确的系统) 由于Cnetos8 停服,现有mac m1 上能够按照的Centos8 并非由官方发布,因此寻找官方发布的能够在mac m1上安装的centos版本。 在YouTuBe上找到一个视频…...
深入理解mAP
0 介绍 mAP是目标检测任务最重要的评价指标。 mAP 是mean average precosion的缩写,mean 和 average都是平均的意思, 所以这个指标的计算涉及到2次平均。 mean是对所有类别的平均, 比如VOC 数据有20个类, 每个类别分别计算AP&…...
PostGis -基础、Springboot 整合、电子围栏处理
目的: 为什么要用PostgreSQL? 因为有时候我们需要存储 空间数据,如:存储一个 多边形 到数据。PostGis中 geometry、geography :基本空间数据类型,用于表达点线面等空间要素,具体类型涵盖了OGC的简单对象模…...
【Linux】多线程的补充
1 线程安全的单例模式 1.1 什么是单例模式 单例模式是一种 "经典的, 常用的, 常考的" 设计模式. 1.2 什么是设计模式 IT行业这么火, 涌入的人很多. 俗话说林子大了啥鸟都有. 大佬和菜鸡们两极分化的越来越严重. 为了让菜鸡们不太拖大佬的后腿, 于是大佬们针对一些…...
【MySQL】表的操作
今天我们来谈谈MySQL下对表的操作 目录 一、创建表 二、查看表 2.1 查看库中存有的表 2.2 查看表结构 2.3 查看表的创建语句 三、修改表 3.1 重命名表名 3.2 新增列 3.3 修改列的数据类型 3.4 删除列 3.5 重命名列 3.6 向表中插入数据 四、删除表 一、创建表 我…...
自动化测试 selenium(测试系列7)
目录 前言: 1.什么是自动化测试 2.Selenium是什么 3.Selenium原理 4.SeleniumJava环境搭建 5.Selenium常用的API使用 5.1定位元素findElement 5.1.1css选择器 5.1.2id选择器 5.1.3类选择器 5.1.4xpath选择器 5.2操作测试对象 5.2.1click点击对象 5.2.…...
小研究 - JVM 垃圾回收方式性能研究(二)
本文从几种JVM垃圾回收方式及原理出发,研究了在 SPEC jbb2015基准测试中不同垃圾回收方式对于JVM 性能的影响,并通过最终测试数据对比,给出了不同应用场景下如何选择垃圾回收策略的方法。 目录 3 几种垃圾回收器 3.1 串行回收器 3.2 并行回…...
【网络安全带你练爬虫-100练】第15练:模拟用户登录
目录 一、目标1:理清逻辑 二、目标2:将每一步用代码进行表示 三、网络安全O 一、目标1:理清逻辑 模拟登录的基本流程 1、进入入口程序 2、读取目标URL 3、请求加上线程 4、确定请求数据包 5、请求格式的确认 6、数据的处理与判断 二、目标…...
Ansible
Ansible 文章目录 Ansible一、概念1.简介2.特性 二、ansible模块1.命令行格式2.模块1.command 模块2.shell 模块3.cron 模块4.user 模块5.group 模块6.copy 模块7.file 模块8.hostname 模块9.ping 模块10.yum 模块11.service/systemd 模块12.script 模块13.mount 模块14.archiv…...
kafka:消费者从指定时间的偏移开始消费(二)
我的前一篇博客《kafka:AdminClient获取指定主题的所有消费者的消费偏移(一)》为了忽略忽略掉上线之前的所有消息,从获取指定主题的所有消费者的消费偏移并计算出最大偏移来解决此问题。 但这个方案需要使用不常用的AdminClient类,而且如果该主题如果是第…...
Spring的加载配置文件、容器和获取bean的方式
🐌个人主页: 🐌 叶落闲庭 💨我的专栏:💨 c语言 数据结构 javaweb 石可破也,而不可夺坚;丹可磨也,而不可夺赤。 Spring配置文件和容器相关 一、加载properties文件1.1加载…...
(二)利用Streamlit创建第一个app——单页面、多页面
1 单页面app Step1:创建一个新的Python脚本。我们称之为uber_pickups.py。 Step2:在您喜爱的IDE或文本编辑器中打开uber_pickups.py,然后添加以下行: import streamlit as st import pandas as pd import numpy as npStep3&…...
一条sql查询语句在mysql中的执行过程是什么
mysql的连接器 我们想要在mysql中执行一条sql查询语句,首先需要连接到mysql服务,那么客户端首先要向mysql服务端发起连接请求,我们可以在客户端用mysql -h [ip] -P [port] -u 用户名 -p 密码 命令向服务端发起连接请求,这个连接请…...
网络互联究竟是需要什么协议相同,什么协议不同?
混淆概念的几个说法: 说法1: “以太网交换机不可以实现采用不同网络层协议的互联” 原因:以太网交换机是数据链路层的设备,不懂网络层的知识 说法2: “网桥可互联不同的物理层、不同的MAC子层以及不同速率的以太网”…...
ajax axios json
目录 一、ajax概述 1. 概念 2. 实现方式 (1)原生的JS实现方式(了解) (2) JQeury实现方式 二、axios 介绍 三、axios使用 1. axios 发送get/post请求 2. axios验证用户名称是否存在 四、json 1. …...
外观模式——提供统一入口
1、简介 1.1、概述 在软件开发中,有时候为了完成一项较为复杂的功能,一个类需要和多个其他业务类交互,而这些需要交互的业务类经常会作为一个完整的整体出现,由于涉及的类比较多,导致使用时代码较为复杂。此时&#…...
Vue中导入并读取Excel数据
在工作中遇到需要前端上传excel文件获取到相应数据处理之后传给后端并且展示上传文件的数据. 一、引入依赖 npm install -S file-saver xlsxnpm install -D script-loadernpm install xlsx二、在main.js中引入 import XLSX from xlsx三、创建vue文件 <div><el-uplo…...
CUDA常用函数
cudaDeviceSynchronize cudaDeviceSynchronize是一个CUDA函数,用于同步当前设备上的所有CUDA流。它会阻塞调用它的线程,直到所有设备上的CUDA流都执行完为止。这可以确保在进行后续的CUDA操作时,先前的操作已经完成。 在CUDA程序中࿰…...
72. ElasticSearch常用命令
索引管理 1新建索引 curl -XPUT http://10.42.172.35:9200/index012 读写权限 curl -XPUT -d {"blocks.read":false} http://10.42.172.35:9200/index01/_settings3 查看索引 单个 curl -XGET http://10.42.172.35:9200/index01/_settings多个 curl -XGET http…...
智慧工地云平台源码,基于微服务架构+Java+Spring Cloud +UniApp +MySql
智慧工地管理云平台系统,智慧工地全套源码,java版智慧工地源码,支持PC端、大屏端、移动端。 智慧工地聚焦建筑行业的市场需求,提供“平台网络终端”的整体解决方案,提供劳务管理、视频管理、智能监测、绿色施工、安全管…...
【位运算】消失的两个数字(hard)
消失的两个数字(hard) 题⽬描述:解法(位运算):Java 算法代码:更简便代码 题⽬链接:⾯试题 17.19. 消失的两个数字 题⽬描述: 给定⼀个数组,包含从 1 到 N 所有…...
无法与IP建立连接,未能下载VSCode服务器
如题,在远程连接服务器的时候突然遇到了这个提示。 查阅了一圈,发现是VSCode版本自动更新惹的祸!!! 在VSCode的帮助->关于这里发现前几天VSCode自动更新了,我的版本号变成了1.100.3 才导致了远程连接出…...
STM32+rt-thread判断是否联网
一、根据NETDEV_FLAG_INTERNET_UP位判断 static bool is_conncected(void) {struct netdev *dev RT_NULL;dev netdev_get_first_by_flags(NETDEV_FLAG_INTERNET_UP);if (dev RT_NULL){printf("wait netdev internet up...");return false;}else{printf("loc…...
【第二十一章 SDIO接口(SDIO)】
第二十一章 SDIO接口 目录 第二十一章 SDIO接口(SDIO) 1 SDIO 主要功能 2 SDIO 总线拓扑 3 SDIO 功能描述 3.1 SDIO 适配器 3.2 SDIOAHB 接口 4 卡功能描述 4.1 卡识别模式 4.2 卡复位 4.3 操作电压范围确认 4.4 卡识别过程 4.5 写数据块 4.6 读数据块 4.7 数据流…...
vue3 定时器-定义全局方法 vue+ts
1.创建ts文件 路径:src/utils/timer.ts 完整代码: import { onUnmounted } from vuetype TimerCallback (...args: any[]) > voidexport function useGlobalTimer() {const timers: Map<number, NodeJS.Timeout> new Map()// 创建定时器con…...
【HTML-16】深入理解HTML中的块元素与行内元素
HTML元素根据其显示特性可以分为两大类:块元素(Block-level Elements)和行内元素(Inline Elements)。理解这两者的区别对于构建良好的网页布局至关重要。本文将全面解析这两种元素的特性、区别以及实际应用场景。 1. 块元素(Block-level Elements) 1.1 基本特性 …...
ardupilot 开发环境eclipse 中import 缺少C++
目录 文章目录 目录摘要1.修复过程摘要 本节主要解决ardupilot 开发环境eclipse 中import 缺少C++,无法导入ardupilot代码,会引起查看不方便的问题。如下图所示 1.修复过程 0.安装ubuntu 软件中自带的eclipse 1.打开eclipse—Help—install new software 2.在 Work with中…...
听写流程自动化实践,轻量级教育辅助
随着智能教育工具的发展,越来越多的传统学习方式正在被数字化、自动化所优化。听写作为语文、英语等学科中重要的基础训练形式,也迎来了更高效的解决方案。 这是一款轻量但功能强大的听写辅助工具。它是基于本地词库与可选在线语音引擎构建,…...
python报错No module named ‘tensorflow.keras‘
是由于不同版本的tensorflow下的keras所在的路径不同,结合所安装的tensorflow的目录结构修改from语句即可。 原语句: from tensorflow.keras.layers import Conv1D, MaxPooling1D, LSTM, Dense 修改后: from tensorflow.python.keras.lay…...
