码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 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

    框架技术栈

    • Koa2 node.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种快速上手模式

    • 使用框架提供的脚手架快速初始化 详细参考文档
    • 使用手动模式逐步搭建 详细参考文档

    小提示:此处提供了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得到的接口文档案例

    • 接口列表信息

    image.png

    • 接口详情

    image.png

    • 也可以导入 Swagger 中进行接口文档展示

    image.png

    • Swagger在线demo地址:https://editor.swagger.io/

    支持生成前端request代码

    框架提供辅助插件openapiv3-gen-typescript, 能通过openapi 生成前端request代码

    request-gen.gif

    • 因此可以通过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。

    • 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
  • 相关阅读:
    Java岗:字节面经分享+Java面试必考题
    【Unity】TimeLine系列教程——编排剧情!
    AQS实战-自定义同步组件TwinsLock
    2023计算机毕业设计SSM最新选题之java企业物资管理系统h3109
    Android 13 全局监听播放器暂停与播放 (包含系统层和第三方app)
    跑得“快”还要走得“稳”,看头部车企数字化实践怎么做
    MySQL——读写分离
    python+django中小学课外知识在线学习网站pycharm
    力扣学习记录(每日更新)
    LeetCode 热题 HOT 100 第八十一天 647. 回文子串 用python3求解
  • 原文地址:https://www.cnblogs.com/wangweianger/p/17592977.html
  • 最新文章
  • 沪漂五周年了:我越来越迷茫了
    Agentic Skill Routing 实战:别再把所有 Skill 塞进 AI Agent 上下文
    MySQL-Seconds_behind_master的精度误差
    [MAF预定义ChatClient中间件-03]CachingChatClient——利用缓存省钱省时间
    AI的至暗历史:从万众期待到被政府撤资,AI的两次死亡徘徊
    Agent OS :五种驯服不确定性的范式
    PortSwigger SQL注入LAB11
    数据库即时编译JIT
    [Begin]AI Learn Data Day 0
    深度学习进阶(二十七)现代 LLM 的核心架构设计其二:SwiGLU
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
小工具 小游戏
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1

京公网安备 11010502049817号