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

news2025/1/18 6:41:58

介绍

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 日志插件 参考文档

与社区框架差异

能力yunflyeggjsnestjs
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备注
yunfly6400使用 koa 为底层库
eggjs3950使用 koa 为底层库
nestjs2900使用 express 为底层库
nestjs7200使用 fastify 为底层库

1000 个路由场景

web框架qps备注
yunfly6100使用 koa 为底层库
eggjs1680使用 koa 为底层库
nestjs2050使用 express为底层库
nestjs6550使用 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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/793720.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

不同薪资阶段的Android 对“binder 的理解”

转载地址:https://zhuanlan.zhihu.com/p/420660511 面试官提了一个问题,我们来看看三位应聘者的表现如何吧 自认为无所不知,水平已达应用开发天花板,目前月薪 10k 面试官️:谈谈你对 binder 的理解 A:bind…

5-linux中的定时任务调度

定时任务调度 crond 任务调度概述基本语法常用选项快速入门应用实例crond 相关指令 at 定时任务基本介绍at 命令格式at 命令选项at 时间的定义其他指令 crond 任务调度 crontab 进行 定时任务调度 概述 任务调度:是指系统在某个时间执行的特定的命令或程序 任务…

CISP-PTE和CISP-PTS哪个更适合?

CISP-PTE和CISP-PTS是两个与网络安全渗透测试相关的认证,虽然它们有相似之处,但也存在一些区别。 CISP-PTE:证书持有人员主要从事信息安全技术领域网站渗透测试工作,具有规划测试方案、编写项目测试计划、编写测试用例、测试报告…

【C++ 异步任务 】`std::future`

1.基础知识 std::future 是 C 标准库中的一个类模板&#xff0c;定义在 <future> 头文件中。它提供了一种异步操作的机制&#xff0c;用于获取异步任务的结果。 std::future 类模板表示一个未来可能会获得的值。你可以将一个异步任务交给 std::future 来管理&#xff0…

苍穹外卖-day08 java实现 微信支付

苍穹外卖-day08 课程内容 导入地址簿功能代码用户下单订单支付 功能实现&#xff1a;用户下单、订单支付 用户下单效果图&#xff1a; 订单支付效果图&#xff1a; 1. 导入地址簿功能代码 1.1 需求分析和设计 1.1.1 产品原型 地址簿&#xff0c;指的是消费者用户的地址信息&…

Django学习笔记-视图(views)的使用

Django中可以使用views进行管理&#xff0c;类似于WPF的MVVM的ViewModel层&#xff0c;也相当于MVC架构的模Controller层。 一、基于函数的视图FBV&#xff08;Function-Based View&#xff09; 通过定义一个函数&#xff0c;包含HttpRequest对象作为参数&#xff0c;用来接受…

运维高级--shell脚本完成分库分表

为什么要进行分库分表 随着系统的运行&#xff0c;存储的数据量会越来越大&#xff0c;系统的访问的压力也会随之增大&#xff0c;如果一个库中的表数据超过了一定的数量&#xff0c;比如说MySQL中的表数据达到千万级别&#xff0c;就需要考虑进行分库分表&#xff1b; 其…

分享几个电脑录制GIF图片的小工具(附下载链接)

GIF工具 1.GIF1232.ScreentoGif3.gifcam4.LICECAP5.recordit 1.GIF123 点击下载: GIF123 介绍 GIF123&#xff1a;是单文件的绿色软件&#xff0c;无任何外部依赖项&#xff0c;体积仅755KB&#xff0c;支持windows所有版本操作简单&#xff01;&#xff01; 2.ScreentoGif …

梯度提升树的参数

目录 1. 迭代过程 1.1 初始预测结果的设置 1.2 使用回归器完成分类任务 ① 二分类情况 ② 多分类情况 1.3 GBDT的8种损失函数 ① 分类器中的loss a. 二分类交叉熵损失 b. 多分类交叉熵损失 c. 二分类指数损失 d. 多分类指数损失 ② 回归树中的loss a. 平方误差 b…

JPA连接达梦数据库导致auto-ddl失效问题解决

现象&#xff1a; 项目使用了JPA&#xff0c;并且auto-ddl设置的为update&#xff0c;在连接达梦数据库的时候&#xff0c;第一次启动没有问题&#xff0c;但是后面重启就会报错&#xff0c;发现错误为重复建表&#xff0c;也就是说已经建好的表没有检测到&#xff0c;…

spring 的循环依赖以及spring为什么要用三级缓存解决循环依赖

知识铺垫 bean的生命周期 这里简单过一下 class ->无参构造 ->普通对象 ->依赖注入&#xff08;对加了autowire等的属性赋值&#xff09; ->初始化前->初始化 ->初始化后&#xff08;aop&#xff09; ->放入单例池的map&#xff08;一级缓存&#xff09;…

第二次作业 运维高级 MySQL主从复制

1.理解MySQL主从复制原理 1、master&#xff08;binlog dump thread&#xff09;主要负责Master库中有数据更新的时候&#xff0c;会按照binlog格式&#xff0c;将更新的事件类型写入到主库的binlog文件中。 2、I/O thread线程在Slave中创建&#xff0c;该线程用于请求Master&…

有些能力,是工作中学不来的,看看这篇超过90%同行

俗话说:360行&#xff0c;行行转IT。 在就业形势压力巨大的今天&#xff0c;不仅仅是计算机专业的毕业生&#xff0c;很多其他专业的大学生都选择转行从事计算机行业。 尤其是软件测试行业&#xff0c;远远超出其他行业的薪水和广阔的就业前景&#xff0c;吸引了大批应届毕业…

PostgreSQL——Windows上安装PostgreSQL

下载地址&#xff1a;PostgreSQL下载网址 因为某些问题我自己安装的是postgresql-11.2-1-windows-x64 根据下图顺序安装即可&#xff0c;不同版本可能顺序有点区别但每部分目的都是一样的。 首先右键以管理员身份运行&#xff0c;可以弹出安装界面

多通道振动信号经小波变换成多通道信息融合的图像(Python编程)

1.数据集介绍&#xff1a;凯斯西楚大学轴承数据集&#xff08;12KHZ采样频率下&#xff0c;四种不同负载数据集&#xff09; 2.这里以0HP文件夹为例&#xff0c;进行展示&#xff0c;有内圈故障&#xff0c;正常&#xff0c;外圈故障和滚动体故障四个文件夹 内圈故障文件夹下有…

【2023周报】week23 eBPF学习

week23 eBPF学习 如何调试eBPF程序&#xff1f; bpf SystemCall [bpf(2) - Linux manual page (man7.org)](https://man7.org/linux/man-pages/man2/bpf.2.html) [bpf-helpers(7) - Linux manual page (man7.org)](https://man7.org/linux/man-pages/man7/bpf-helpers.7.htm…

Python基本语法之符号使用

好久没有和小伙伴们更新python了&#xff0c;我对于此感到抱歉以后有时间尽量多更新 目录 一. 标识符 A.定义&#xff1a; B.使用特点 C.Python标识符&#xff0c;进一步探讨以下几个方面的详细内容&#xff1a; 1. 规则和约定&#xff1a; 2. 有效的标识符示例&#xff1…

【LeetCode每日一题】——剑指 Offer II 027.回文链表

文章目录 一【题目类别】二【题目难度】三【题目编号】四【题目描述】五【题目示例】六【题目提示】七【题目进阶】八【题目注意】九【解题思路】十【时间频度】十一【代码实现】十二【提交结果】 一【题目类别】 栈 二【题目难度】 简单 三【题目编号】 剑指 Offer II 02…

3.1flex布局

参考链接 MDN 核心组成 容器 容器指定元素item的布局方式 元素 元素自定义自身的宽度大小

高数笔记02:导数、微分、中值定理

图源&#xff1a;文心一言 本文是我学习高等数学第二、三章导数、微分、中值定理的一些笔记和心得&#xff0c;希望可以与考研路上的小伙伴一起努力上岸~~&#x1f95d;&#x1f95d; 第1版&#xff1a;查资料、画导图、归纳题型~&#x1f9e9;&#x1f9e9; 参考用书1&…