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

介绍

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.mzph.cn/news/8848.shtml

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

相关文章

【Redis深度专题】「核心技术提升」探究Redis服务启动的过程机制的技术原理和流程分析的指南(集群功能分析)

探究Redis服务启动的过程机制的技术原理和流程分析的指南(集群功能分析) Redis集群的出现背景提升性能扩展性 Redis集群概述Redis Cluster特性分布Redis Cluster的Failover机制Redis集群节点宕机集群如何判断节点是否挂掉集群进入失败状态的必要条件 Fai…

jmeter随记2:压测

jmeter随记1:压测 简述一、压测步骤二、观察cpu和内存占用情况三、查看磁盘占用情况 简述 关于压测,jmeter更直观的作用是用来编写压测脚本【请求和压测策略】,然后在linux服务器上执行,也可以在本地执行,压测执行脚本在启动jmet…

Linux:入门学习知识及常见指令

文章目录 入门介绍操作系统的概念Linux机器的使用Linux上的指令 对文件知识的补充文件的定义和一些含义文件和目录的存储绝对路径和相对路径 ls指令pwd指令cd指令touch指令mkdir指令rmdir指令rm指令man指令cp指令mv指令cat指令more指令echo指令输出重定向 less指令find指令grep…

5、joern安装

文章目录 一、安装环境二、安装步骤1、joern地址2、安装中可能出现的问题 一、安装环境 1. java 8   2. gradle 2.0.0(按照官网步骤安装)   3. Graphviz (sudo apt install graphviz-dev)   4. python > 3.5 二、安装步骤 1、joern地址 joern地址 2、安装中可能出…

Docker配置阿里云容器镜像加速

天行健,君子以自强不息;地势坤,君子以厚德载物。 每个人都有惰性,但不断学习是好好生活的根本,共勉! 文章均为学习整理笔记,分享记录为主,如有错误请指正,共同学习进步。…

白话机器学习笔记(三)评估已建立的模型

模型评估 在进行回归和分类时,为了进行预测,我们定义了函数 f θ ( x ) f_\theta(x) fθ​(x),然后根据训练数据求出了函数的参数 θ \theta θ。 如何预测函数 f θ ( x ) f_\theta(x) fθ​(x)的精度?看它能否很好的拟合训练数…

【玩转Linux】标准io缓冲区的操作

(꒪ꇴ꒪ ),hello我是祐言博客主页:C语言基础,Linux基础,软件配置领域博主🌍快上🚘,一起学习!送给读者的一句鸡汤🤔:集中起来的意志可以击穿顽石!作者水平很有限,如果发现错误&#x…

[Golang] Viper原理以及详细使用案例

文章目录 什么是 Viper?基础配置引入依赖:动态监听原理分析:监听原理分析 Config.yaml文件配置Viper文件配置 什么是 Viper? 介绍:用于处理配置文件中解析和读取配置文件 优点:支持多种配置格式&#xff0…

新老联手,火花四溅?大众汽车与小鹏汽车达成长期合作框架协议

7 月 26 日资讯,大众汽车宣布与小鹏汽车达成长期合作框架协议,并在官网中正式宣布,大众是老牌油车领军代表,小鹏则是新势力中的佼佼者,新老强强联手,又会碰撞出怎样的火花呢? 现阶段大众计划与…

Postman学习之常用断言

什么是断言? 断言——就是结果中的特定属性或值与预期做对比,如果一致,则用例通过,如果不一致,断言失败,用例失败。断言,是一个完整测试用例所不可或缺的一部分,没有断言的测试用例…

leetcode每日一练-第98题- 验证二叉搜索树

一、思路 因为要验证多个节点是否是二叉搜索树,因此使用递归 二、解题方法 设计一个递归函数 helper(root, lower, upper) 来递归判断,函数表示考虑以 root 为根的子树,判断子树中所有节点的值是否都在 (l,r)的范围内(注意是开区间&#x…

git配置

git查看配置:git config --global --list git配置: git config --global user.name "yumlu" git config --global user.email "yumlucisco.com" git config --global core.editorvim git权限,添加密钥: …

工厂方法模式——多态工厂的实现

1、简介 1.1、概述 在工厂方法模式中,不再提供一个统一的工厂类来创建所有的产品对象,而是针对不同的产品提供不同的工厂,系统提供一个与产品等级结构对应的工厂等级结构。 1.2、定义 工厂方法模式(Factory Method Pattern&am…

Filebeat学习笔记

Filebeat基本概念 简介 Filebeat是一种轻量级日志采集器,内置有多种模块(auditd、Apache、Nginx、System、MySQL等),针对常见格式的日志大大简化收集、解析和可视化过程,只需一条命令即可。之所以能实现这一点&#…

设计模式原则

1、设计模式七大原则 1.1 设计模式的目的 编写软件过程中,程序员面临着来自 耦合性,内聚性以及可维护性,可扩展性,重用性,灵活性 等多方面的挑战,设计模式是为了让程序(软件),具有更好 代码重…

Mkdocs中利用Js实现大小圈鼠标拖动样式

在docs/javascripts/extra.js下复制粘贴: var CURSOR;Math.lerp (a, b, n) > (1 - n) * a n * b;const getStyle (el, attr) > {try {return window.getComputedStyle? window.getComputedStyle(el)[attr]: el.currentStyle[attr];} catch (e) {}return …

k8s核心概念

一、集群架构与组件 1,相关组件 【1】 master node三个组件 k8s的控制节点,对集群进行调度管理,接受集群外用户去集群操作请求master node 组成(四个组件):控制面 API Server:通信kube-Sche…

大模型的淘金时代,HPE给出了一份智能经济“奇点”攻略

进入2023年,ChatGPT引发了一个新的AI时代——大模型时代。陆奇说:“我已经跟不上大模型时代的狂飙速度了!”大模型引发了AI产业整体升级换代,各种大模型层出不穷,科技公司纷纷入局,AI创业公司再次雨后春笋般…

【LeetCode】79.单词搜索

题目 给定一个 m x n 二维字符网格 board 和一个字符串单词 word 。如果 word 存在于网格中,返回 true ;否则,返回 false 。 单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或…

LabVIEW开发环境试验箱控制器

LabVIEW开发环境试验箱控制器 环境或气候试验箱是一种外壳,用于模拟各种材料(包括工业产品、生物物质、复合材料、电子设备和航空航天部件)的特定环境条件,并评估调节对这些材料的影响。 环境试验箱(ETC)…