introducir
Yunfly
Un marco WEB Node.js de alto rendimiento, que se utiliza para Typescript
construir nuestra aplicación. Úselo Koa2
como el marco HTTP subyacente y utilícelo routing-controllers
para typedi
construir de manera eficiente nuestras aplicaciones Node.
Yunfly eleva un nivel de abstracción por encima del marco Koa, pero aún admite el middleware Koa. Sobre esta base, se proporciona un potente sistema de complementos para proporcionar a los desarrolladores capacidades más potentes y flexibles.
dirección de github: github.com/yunke-yunfl ...
Dirección del documento: yunke-yunfly.github.io/doc.github.…
Experiencia en línea del código Sandbox: codesandbox.io/p/sandbox/e…
Pila de tecnología de marco
Koa2
node.js http framework, async espera documento de referencia de programación asíncronafind-my-way
Un documento de referencia de enrutador http de alto rendimientotypescript
Un lenguaje de programación gratuito y de código abierto desarrollado por Microsoft que es un superconjunto de JavaScript con escritura estática opcional y documentación de referencia de programación orientada a objetos basada en clases añadidarouting-controllers
Documentos de referencia de desarrollo para enrutamiento usando decoradorestypedi
: Documentación de referencia de la herramienta del complemento de inyección de dependenciagrpc
: Un documento de referencia del marco RPC de alto rendimiento, de código abierto y de propósito generalwinston
: Documentación de referencia del complemento de registro de JavaScript
Diferencias con el marco comunitario
capacidad | yunfly | huevo | transportado |
---|---|---|---|
Mecanografiado | ✅ | ❌[El soporte no es lo suficientemente amigable] | ✅ |
grupo | ✅ | ✅ | ❌ |
abran fuego | ✅ | ❌ | ✅ |
框架约束 | 部分约束 | 约束 | 自由 |
扩展模型 | 插件 | 插件 | 模块 |
性能
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代码在线体验: codesandbox.io/p/sandbox/e…
编写一个简单的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地址: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)
})
限流插件使用文档请参考:yunke-yunfly.github.io/doc.github.…
node 性能排查,v8profiler插件
- 实时获取 cpuprofile 插件, 用于性能瓶颈分析。 当应用出现性能瓶颈时,排查是一件比较复杂的事情,框架提供了
@yunke/yunfly-plugin-v8-profiler
用于cpu性能排查。 性能瓶颈插件详细使用文档:yunke-yunfly.github.io/doc.github.…
数据库操作插件prisma
对于数据库的操作,框架提供了prisma插件,它是新一代 orm 工具, 支持 MySql SQLite SQL Server MongoDB PostgreSQL。
- prisma插件详细使用文档:yunke-yunfly.github.io/doc.github.…
Redis 插件
redis 是BFF服务或服务端开发经常用到的内存数据库,框架提供了redis插件 @yunflyjs/yunfly-plugin-redis
- redis插件详细使用文档:yunke-yunfly.github.io/doc.github.…
其他插件
框架还提供了以下常用的其他插件,例如:
- socket插件:yunke-yunfly.github.io/doc.github.…
- prometheus插件:yunke-yunfly.github.io/doc.github.…
- Complemento jwt: yunke-yunfly.github.io/doc.github.…
- complemento de apolo: yunke-yunfly.github.io/doc.github . …
- Complemento de seguridad: yunke-yunfly.github.io/doc.github.…
- Complemento de verificación de memoria: yunke-yunfly.github.io/doc.github . …
- complemento etcd: yunke-yunfly.github.io/doc.github.…
- complemento de alinode: yunke-yunfly.github.io/doc.github . …
- Fusible: yunke-yunfly.github.io/doc.github . …
- grpc: yunke-yunfly.github.io/doc.github.…
Se siguen desarrollando más capacidades...