07 目标: 站在巨人肩膀,你的理想框架到底长什么样?

news/2024/4/16 18:14:04/文章来源:https://blog.csdn.net/Zerore/article/details/129274976

理想框架到底是什么样子的?这个终极问题,闭门造车是无法得到答案的,所以今天,我想让你先从埋头搭建 Web 框架的视角中暂时跳出来,站在更高的角度来纵观全局。

开源框架怎么比较

有如下几个参数:

标准说明
核心模块服务启动方式,路由分发机制
上下文ctx封装性、中间件机制的设计
功能完备性是否提供日志模块、命令行工具、缓存机制等
框架扩展性扩展某个功能时,改动是否较大,是否支持功能实现的可插拔
框架性能每秒支持多少请求,是否有性能问题
文档完备度/社区活跃度是否有完善文档支持,社区是否足够活跃

核心模块

核心模块就是之前讲的:HTTP 服务的启动方式、路由、Context、中间件、重启方式,它们的实现非常关键,往往影响到整个框架的表现,也能直接体现出框架作者的开发水平。

框架的核心模块就好像是汽车的引擎,一旦核心模块出了问题,或者有隐性的缺陷,后果往往是无法弥补的。理想的核心模块必须要有设计感,有自己的思想,代码质量、性能都不能出问题。

功能完备性

框架最好能尽可能多地提供功能或者规范,比如有自己的日志模块、脚手架、命令行工具,甚至自己的 ORM、缓存等等。

要知道,框架的本质还是在于提高开发效率,在团队中,我们希望不同水平的同学能写出基本一样的代码,那就要靠框架这个顶层设计来规范了。试想一下,如果框架中提供了很方便的参数验证规范,那在开发应用的时候,还有谁愿意走解析和正则匹配来验证参数呢?

在功能完备性的选择上,我们往往会根据之后是否希望自定义需求来确定。这里说的自定义需求,指的是定制自己的日志、ORM 等模块的需求。

框架扩展性

理想的框架,它的扩展性一定要好。框架要做的事情应该是定义模块与模块之间的交互标准,而不应该直接定义模块的具体实现方式。我可以在这个标准上扩展出我需要的功能,这样整个框架才会比较灵活。

Web 领域的技术边界在不断扩展,谁也无法保证框架中所用的库,哪怕是最基本的日志库,能永远满足需求。当框架使用者想为应用增加一个功能,或者替换某个第三方库的时候,如果改动的地方非常多,要大动干戈,甚至根本就无法支持替换和增加,那这个框架的扩展性就比较弱了。

框架性能

虽然大部分框架都是封装 net/http,但是封装程度不同以及具体的实现选择不同(使用的路由匹配、上下文机制等),就会有不同的性能表现。

我们选择框架之后,最终是要在框架上运行代码的,如果运行效率有指数级别的差距,是不能接受的。

其实对框架性能来说,大部分场景里,我们是不会有极致性能需求的。所以看各种框架的性能评估,我们不应该把各个框架孤立出来看,应该将差不多量级的性能归为一组。不要去比较单个框架的性能差异,而应该去比较不同量级组之间的性能差异,因为在相同量级下,其实框架和框架之间的性能差别并不是很大。

文档完备度及社区活跃度

开源不仅仅是将代码分享出去,同时分享的还有使用文档,官方必须提供足够的介绍资料,包括文档、视频、demo 等。

文档和社区是需要不断运营的,因为在使用的过程中,我们一定会遇到各种各样的问题,官方的回复以及一个活跃的社区是保障问题能得到解决的必要条件。

所以当我们选择一个框架的时候,官网、GitHub 的 star、issue 都是很好的衡量标准。当选择框架之后,不妨每天花一点时间在这个项目的官网、GitHub 或者邮件组上,你会得到很多真实信息。

比较开源框架

Beego

  • 启动方式:多种,支持HTTP/HTTPS、CGI、Graceful
  • 路由原理:字典树,特色的自动匹配路由和注解路由
  • Ctx设计:隐藏在controller 结构中,不作为函数第一个参数
  • 功能完备性:提供了很多周边的功能。比如 Beego 提供了一个原生的 ORM 框架、自定义的 Logger 库、参数验证 Validate 库,甚至还默认提供了管理 GC、Goroutine 等管理接口。

总体来说,使用 Beego 的最大感受就是“全”。这是一个很全的框架,开发 Web 应用所需要的所有组件基本都能在这里找到,如果选择它做业务开发,功能完备性是最重要的因素。所以在从零开始,希望快速开发的场景中,我们会尽量选择使用这个框架。

Echo

  • 路由:字典树,但不是为每个http方法建立一个树,而是只整体建立一个树。这样每个叶子节点都存放了不同了http方法的handler。

Echo 的使用者更看中扩展性和框架性能。和定位一样,它是一种高性能、可扩展、轻量级的 Web 框架,但麻雀虽小,五脏俱全。目前看起来,它的社区活跃度比 Gin 框架稍差一些(从两者的中间件贡献数可以看出)。所以我感觉,Echo 框架更适合个人开发者,而且需要有一定的扩展框架能力。

Gin

  • 路由: 字典树,但节点不是按斜杠分隔的请求路由,而是相同的字符串部分,这样使用索引来加速子树的查询效率。这部分路由是使用的第三方的 httprouter 包。
  • Ctx设计:实现了标准库的Context接口
  • 中间件:定义了Middleware函数,可自己具体实现

总体来说,Gin 比较适合企业级团队使用。它的社区活跃度较高,社区贡献的功能模块较多,能很好补充其功能完备性;同时 Gin 的扩展性也很好,我们可以在社区贡献模块和自研模块中做出很好的取舍。

理想的框架是什么样的

其实从刚才的分析也可以看出来,这个问题是见仁见智的,和你的工作经验、技术阅历、甚至技术的理念都有关系。有的人追求的是世界上运行速度最快的框架;有的人追求的是灵活性最高的框架;有的人追求的是功能最全的框架。

具体你要根据自己的应用场景来选择,包括你 Web 应用的业务场景、并发需求、团队规模、工期等等。回看刚才提出的五个选择维度,以我们聊过的三个 Web 框架为例。

在保证框架的核心模块能满足要求的情况下,我们一般在功能完备性和框架扩展性之间取舍。

如果你开发一个运营管理后台,并发量基本在 100 以下,单机使用,开发的团队规模可能就 1~2 个人,那你最应该考虑功能完备性,明显使用 Beego 的收益会远远大于使用 Gin 和 Echo。因为如果你选择 Gin 和 Echo 之后,还会遇到比如应该选用哪种 ORM、应该选用哪种缓存等一系列问题,而这些在功能组件相当全面的 Beego 中早就被定义好了。

如果你有一定的团队规模,有比较高的并发量,而且你感觉后续对框架的改动需求或者扩展需求会很高,比如你希望自己开发一个适合团队使用的缓存方法。那么这个时候,你应该把框架扩展性放在最高级,可能 Gin 和 Echo 更适合你。如果你要更多的灵活性,你可能会考虑直接从 net/http 标准库开始,不使用任何的开源 Web 框架。

所以,选择框架信奉一个原则:只选最适合的,不选最贵的。如果你在几个框架中犹豫不定,除了可以用五个维度比较框架之外,你更应该多花时间内省思考清楚你的真正需求。

【小结】:

  1. 大而全:Beego,封装很多,不用自己再开发。
  2. 便于扩展和改动:Gin、Echo。

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

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

相关文章

【图像处理】数字图像处理基础(分辨率,像素,显示...)

Table of Contents1.数字图像处理基础1.1 图像表示1.1.1 图像成像模型1.1.2 数字图像的表示a.图像采样b.图像灰度的量化c.算比特数1.2 分辨率1.2.1 空间分辨率1.2.2 灰度分辨率1.3 像素间的关系1.3.1 像素邻域a.4邻域b.4对角邻域c.8邻域1.3.2 像素邻接1.3.3 像素连通1.3.4 像素…

“速通“ 老生常谈的HashMap [实现原理源码解读]

👳我亲爱的各位大佬们好😘😘😘 ♨️本篇文章记录的为 HashMap 实现原理&&源码解读 相关内容,适合在学Java的小白,帮助新手快速上手,也适合复习中,面试中的大佬🙉🙉&#x1f…

【Leedcode】栈和队列必备的面试题(第二期)

【Leedcode】栈和队列必备的面试题(第二期) 文章目录【Leedcode】栈和队列必备的面试题(第二期)一、题目(用两个队列实现栈)二、思路图解1.定义两个队列2.初始化两个队列3.往两个队列中放入数据4.两个队列出…

对账平台设计

背景 随着公司业务的蓬勃发展,交易履约清结算业务的复杂性也在不断的增高,资金以及各种数据的一致性和准确性也变得越发重要。 以交易链路为例,存在着如下一些潜在的不一致场景: 订单支付成功了,但是订单状态却还是“…

JVM方法区详解有这篇就够了

1、方法区在哪里《Java虚拟机规范》中明确说明:“尽管所有的方法区在逻辑上是属于堆的一部分,但一些简单的实现可能不会选择去进行垃圾收集或者进行压缩。”但对于HotSpotJVM而言,方法区还有一个别名叫做Non-Heap(非堆&#xff09…

机械键盘不只有轴体的区别!键帽高度也有些学问

键盘键帽的学问有很多,上篇文章中,笔者和大家聊了键帽的材质和耐油污的问题。 除此之外,键帽的高度和字符的印刷方式也有不同,对于多数机械键盘来说,会发现每一列键帽的倾斜角度都略有不同,使用起来可以减少…

Android TV UI开发常用知识

导入依赖 Google官方为Android TV的UI开发提供了一系列的规范组件,在leanback的依赖库中,这里介绍一些常用的组件,使用前需要导入leanback库。 implementation androidx.leanback:leanback:$version常用的页面 这些Fragment有设计好的样式&…

3.ffmpeg命令行环境搭建、ffmpeg命令行初步了解

在上章,我们讲过: ffmpeg.exe: 主要用于转码或者剪切的应用程序, 也可以从url/现场音频/视频源抓取输入源ffplay.exe: 主要用于播放视频的应用程序,该应用程序源码是开源的,我们后面章节会去源码分析ffprobe.exe: 主要用于分析视频码流的应用程序, 可以获取媒体文件的详细信息,…

【Azure 架构师学习笔记】-Azure Data Factory (4)-触发器详解-事件触发器

本文属于【Azure 架构师学习笔记】系列。 本文属于【Azure Data Factory】系列。 接上文【Azure 架构师学习笔记】-Azure Data Factory (3)-触发器详解-翻转窗口 前言 事件触发指的是存储事件,所以在新版的ADF 中,已经明确了是“存储事件”,…

【C语言】结构体进阶

一、结构体 1. 结构体的声明 (1) 结构的基础知识 结构是一些值的集合,这些值称为成员变量。结构的每个成员可以是不同类型的变量。(2)结构的声明 struct tag {member-list; }variable-list;例如描述一个学生&#x…

【SPSS】两配对样本T检验分析详细操作教程(附案例实战)

🤵‍♂️ 个人主页:艾派森的个人主页 ✍🏻作者简介:Python学习者 🐋 希望大家多多支持,我们一起进步!😄 如果文章对你有帮助的话, 欢迎评论 💬点赞&#x1f4…

RocketMQ的一些使用理解

1.RocketMQ的生产者生产负载策略(3种) (1)SelectMessageQueueByHash (一致性hash) (2)SelectMessageQueueByMachineRoom (机器随机) (3)SelectMessageQueueByRandom (随机) 第1种一…

VBA之正则表达式(41)-- 快速标记两个星号之后的字符

实例需求:工作表中的数据保存在A列~G列,现需要识别D列中包含超过两个星号的内容,并将第3个星号及其之后的字符设置为红色字体,如图所示。 示例代码如下。 Sub Demo1()Dim objRegExp As ObjectDim objMatch As ObjectDim strMatch…

08 自研or借力(上):集成Gin替换已有核心

我们的框架和这些顶级的框架相比,差了什么呢?如何才能快速地把我们的框架可用性,和这些框架提升到同一个级别?我们做这个框架除了演示每个实现细节,它的优势是什么呢? 不妨带着这些问题,把我们…

ClickHouse的架构与基本概念

一、ClickHouse的定义 ClickHouse是一个完全的列式分布式数据库管理系统(DBMS),允许在运行时创建表和数据库,加载数据和运行查询,而无需重新配置和重新启动服务器,支持线性扩展,简单方便,高可靠性&#xf…

C++学习笔记-内存空间

考虑这样一种情况,当我们使用相同的名称,叫Zara的两个人在同一个班级。我们需要明确区分它们将不得不使用一些额外的信息,如他们的名字,如他们生活在不同的区域或母亲或父亲的名字等等。 同样的情况也出现在C应用程序中。例如&am…

iphone系统崩溃数据能恢复吗?教你三招方法

最近有些苹果用户反应自己手机的屏幕无法滑动,桌面上APP也无法点开,想要关机重启下试试,可是,连关机都关不了,甚至连Siri都罢工了。苹果手机系统崩溃,出现黑屏、白屏、无限重启之类的故障,导致手…

大数据处理学习笔记1.6 Scala数据结构

文章目录零、本讲学习目标一、数组 (Array)(一)定长数组1、数组定义(1)定义数组时初始化数据(2)定义时指定数组长度,后赋值2、数组遍历(1)传统for循环方式(2&…

Databend 开源周报 第 82 期

Databend 是一款现代云数仓。专为弹性和高效设计,为您的大规模分析需求保驾护航。自由且开源。即刻体验云服务:https://app.databend.com 。Whats New探索 Databend 本周新进展,遇到更贴近你心意的 Databend 。Features & Improvements :…

【沐风老师】3dmax一键窗户生成器插件使用方法详解

3dmax一键窗户生成器插件教程 3dMax一键窗户生成器是一个在3dMax中自动创建3D窗户模型的脚本。它有28种风格的窗户样式,可以在Archviz项目中灵活应用,同时为3D艺术家节省大量时间。 【适用版本】 适用3dMax 2018.2及更高版本 【安装方法】 1.解压缩包&…