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
sandbox代码在线体验: https://codesandbox.io/p/sandbox/elated-frog-rt4w4v?file=%2Fsrc%2Fcontroller%2FHomeController.ts%3A7%2C25
框架技术栈
与社区框架差异
| 能力 | 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 中进行接口文档展示
- Swagger在线demo地址:https://editor.swagger.io/
支持生成前端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插件
- 实时获取 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。
Redis 插件
redis 是BFF服务或服务端开发经常用到的内存数据库,框架提供了redis插件 @yunflyjs/yunfly-plugin-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 框架的更多相关文章
- Koa – 更加强大的下一代 Node.js Web 框架
Koa 是 Express 的开发团队设计的下一代 Web 框架,其目的是为 Web 应用程序提供更小,更具表现力,更坚实的基础.Koa 没有核捆绑任何中间件,并提供了一套优雅的方法,使服务器端开 ...
- 强大的 Node.js Web 框架 - Daze.js
去年年初对 Node.js 比较感兴趣,也用了很多 Node.js 的框架,但是开发体验不是特别好,我之前也是后端转前端,然后再接触 Node.js ,所以用过挺多的服务端框架,相对js而言,设计一款 ...
- Node.js Web框架收集
原文地址:http://geek.csdn.net/news/detail/4020 框架列表: http://nodeframework.com/ 与其他很多语言一样,Node.js也有很多Web框 ...
- 全端开发必备!10个最好的 Node.js MVC 框架
Node.js 是最流行的 JavaScript 服务端平台,它允许建立可扩展的 Web 应用程序.Node.js 包含不同类型的框架,如 MVC 框架.全栈框架.REST API 以及大量的服 ...
- 十款最佳Node.js MVC框架
十款最佳Node.js MVC框架摘要:Node.js是JavaScript中最为流行的框架之一,易于创建可扩展的Web应用.本文分享十款最佳的JavaScript框架. Node.js是JavaSc ...
- 私人定制,十款最佳Node.js MVC框架
Node.js是JavaScript中最为流行的框架之一,易于创建可扩展的Web应用.本文分享十款最佳的JavaScript框架. Node.js是JavaScript中最为流行的框架之一,易于创建可 ...
- 【360开源】thinkjs:基于Promise的Node.js MVC框架 (转)
thinkjs是360奇舞团开源的一款Node.js MVC框架,该框架底层基于Promise来实现,很好的解决了Node.js里异步回调的问题.360奇舞团(奇虎75Team),是奇虎360公司We ...
- 《Node.js入门》CentOS 6.5下Node.js Web开发环境搭建笔记
近期想尝试一下英特尔的基于WebRTC协同通信开发套件,所以须要在本地搭建Node.js Web的开发測试环境. 这里讲的是CentOS 下的搭建方法.使用Windows的小伙伴请參考: <No ...
- Windows 7下Node.js Web开发环境搭建笔记
Node.js是什么? 我们看看百科里怎么说的?JavaScript是一种运行在浏览器的脚本,它简单,轻巧,易于编辑,这种脚本通常用于浏览器的前端编程,但是一位开发者Ryan有一天发现这种前端式的脚本 ...
- Node.js日志框架选型比較:Winston
日志对于问题定位.调试,系统性能调优至关重要,尤其是系统复杂以及在线执行的情况下. 好的开发框架都会有一个可开启关闭/可配置记录级别的日志系统.我们从下面几个方面来做选型: 1. 每行日志都须要有准确 ...
随机推荐
- Prism Sample 8 ViewModelLocator
这一例只是说明ViewModelLocator的使用,没有难度,跳过.
- 2021-11-08:扁平化嵌套列表迭代器。给你一个嵌套的整数列表 nestedList 。每个元素要么是一个整数,要么是一个列表;该列表的元素也可能是整数或者是其他列表。请你实现一个迭代器将其扁平化
2021-11-08:扁平化嵌套列表迭代器.给你一个嵌套的整数列表 nestedList .每个元素要么是一个整数,要么是一个列表:该列表的元素也可能是整数或者是其他列表.请你实现一个迭代器将其扁平化 ...
- 2021-09-06:给表达式添加运算符。给定一个仅包含数字 0-9 的字符串 num 和一个目标值整数 target ,在 num 的数字之间添加 二元 运算符(不是一元)+、- 或 * ,返回所有
2021-09-06:给表达式添加运算符.给定一个仅包含数字 0-9 的字符串 num 和一个目标值整数 target ,在 num 的数字之间添加 二元 运算符(不是一元)+.- 或 * ,返回所有 ...
- Django4全栈进阶之路16 项目实战(用户管理):user_list.html用户列表画面设计
首先在template模板文件夹中新建account子文件夹,用于存放用户管理相关模块页面. 下面开始正式的设计: 1.模块代码设计 {% extends 'base.html' %} {% bloc ...
- vue全家桶进阶之路4:NPM包
NPM(Node Package Manager)是 Node.js 的包管理工具,用来安装各种 Node.js 的扩展. NPM是 JavaScript 的包管理工具,也是世界上最大的软件注册表.有 ...
- 【GiraKoo】C++中static关键字的作用
C++中static关键字的作用 在程序中良好的使用static,const,private等关键字,对于代码的健壮性有很大的帮助. 本文介绍的就是C++中static关键字的一些常见用法与区别.适合 ...
- 使用ONE.Abp快速开发微服务,再也不用加班了
项目背景 公司采用项目制工作方式,因此在不同项目上可能存在多个团队开发独立的代码库,但通用的基础设施却是相同的,这可能导致每个项目都需要编写相同的代码,并重复造轮子.更严重的是,每个项目都有自己的用户 ...
- Pyhton F字符串引起的invalid syntax
事发现场 偶然运行到之前写的爬虫,发现运行不了,报错invalid syntax,于是来找bug 报错截图: 原因: 这样用法称之为 f-string f-string,亦称为格式化字符串常量(for ...
- Python基础 - 运算符优先级
以下表格列出了从最高到最低优先级的所有运算符: 运算符 描述 ** 指数 (最高优先级) ~ + - 按位翻转, 一元加号和减号 (最后两个的方法名为 +@ 和 -@) * / % // 乘,除,取模 ...
- rest framwork 4 分页功能
分页功能: 常遇到问题,当数据记录超过1000万条,如何进行分页显示问题,这时就考虑分页功能, restframework 分页实现有三种 第一种:看n页,每页显示n条数据: PageNumberPa ...