Web 开发中 route 和 router 有什么区别?

什么是路由?

在 Web 开发中,会经常和路由打交道,可能有的同学并没有仔细思考过到底什么是路由。路由是根据用户请求的 URL 来确定返回给用户的内容或页面的技术,即将 HTTP 请求映射到相应的处理代码,使得用户能够通过访问不同的 URL 来获取正确的页面或功能。在 Web 应用程序中,有很多不同的页面和功能需要通过不同的 URL 进行访问,这就需要通过路由来将 HTTP 请求映射到相应的处理代码上。借助路由,开发者可以创建出更加灵活和可维护的 Web 应用程序,提高应用程序的质量和安全性。

route 与 router 的基本区别

在日常开发中,在表示路由的时候,想必很多同学都纠结过到底使用 route 还是 router。 这两个词虽然看起来和听起来都很相似,但代表着不同的概念。

route 通常指的是应用程序中的一个路由规则,定义了 URL 模式与应用程序中的特定行为之间的映射。简单来说,是一个 URL 路径与处理这个路径请求的代码之间的关系。当用户访问特定的 URL 时,route 决定了应该呈现哪个视图或组件,或者执行哪个控制器的哪个动作。例如,在一个博客应用中,可能会有一个 route 将 /post/list 映射到显示所有博客的动作。route 通常包含了路径模式、处理函数(如控制器动作)、中间件等。可以是静态的(如/about)或动态的(如 /post/:id,其中 :id 是一个变量)。

router 是一种机制,通常是一个对象或一个库,负责监听浏览器地址的变化,解析 URL,并根据定义好的 route 规则分发请求到相应的处理逻辑。router 决定了应用程序如何响应用户的请求,管理着所有的 route 规则,并在用户访问某个 URL 时,决定使用哪个 route 规则来处理这个请求。router 通常提供了定义 route 的接口、导航控制(如前进、后退、重定向)、路由守卫(如权限验证)、路由嵌套等高级功能。在现代前端框架中,router 还负责处理浏览器历史记录和状态管理。

以 Gin 框架看 route 和 router

接下来以 Golang 框架 Gin 为例,来理解下 route 和 router的不同。

从上文我们已经知道 route 是指 URL 路径和用来处理该路径请求的函数之间的映射关系。在Gin中,一个路由由 HTTP 请求方式、路径和处理该路径请求的处理函数组成。例如,以定义一个处理 GET 请求的 /login 路径的路由,代码如下:

package mainimport ("github.com/gin-gonic/gin""net/http"
)func main() {r := gin.Default()r.GET("/login", loginHandler)r.Run(":80")
}func loginHandler(c *gin.Context) {c.JSON(http.StatusOK, gin.H{"message": "login seuccess"})
}

其中第10行的 r.GET 定义了一个路由,/login 是路径,而 loginHandler 是处理该路径请求的函数,这部分就是一个典型的 route。

router 在 Gin 中指的是路由处理系统,是一个更高层次的实体,负责管理所有的路由,并根据客户端发来的请求找到并执行对应的处理函数。Gin的 router 还负责中间件的管理和请求的分发。当创建一个 Gin 实例时,实际上就是在创建一个 router。例如上面示例代码的第9行 r := gin.Default(),在这个实例 r 中,可以注册多个路由,定义中间件,创建路由组等。router 是 Gin 框架的核心,背后使用了高效的 HTTP 路由库来处理路由匹配。

route 与 router 的性能考量

在使用 Web 框架时,route 和 router 的性能考量通常涉及以下几个方面:

  • 路由匹配的效率:router 的实现算法对性能至关重要,Gin 使用了基于 trie 的算法来进行路由匹配,这种算法在查找路由时非常高效,尤其是对于大量路由的情况。简洁且明确的路由规则可以提高匹配速度。例如,避免过多的通配符和正则表达式可以减少匹配时的计算量。
  • 中间件的使用:中间件虽然提供了方便的扩展点,但每个中间件都会增加请求处理的时间。因此,应当仅使用必要的中间件,并确保没有性能问题。中间件的执行顺序也会影响性能,应当合理安排轻量级或者优先级高的中间件先执行。
  • 路由设计:合理的路由层级设计可以减少框架在匹配路由时的查找深度,例如,使用路由组来组织相关的路由。对于参数化的路由(如 /user/:id),应当注意参数解析的性能影响,并在可能的情况下优化。
  • 服务器和硬件资源:router 的性能也受服务器硬件资源的限制,包括CPU、内存和网络带宽。在高负载环境下,使用负载均衡可以分散请求,减少单个服务器的压力。
  • 缓存策略:对于重复的请求,可以通过缓存请求结果来提高响应速度,减少路由处理的负担。对于静态文件的路由,使用合适的缓存策略和 CDN 服务可以显著提高性能。
  • 代码优化:路由的处理函数应当高效执行,避免在热路径上进行复杂的计算或者阻塞操作。对于可以异步执行的操作,应当避免阻塞主线程,以提高吞吐量。
  • 测试和监控:定期进行性能测试,识别和优化潜在的瓶颈。实时监控应用的性能,以便快速响应任何性能下降的情况。

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

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

相关文章

DataBinding原理

1、MainActivity首先使用DataBindingUtil.setContentView设置布局文件activity_main.xml。 2、随后,经过一系列函数调用,ActivityMainBindingImpl对象最终会实例化,并与activity_main.xml进行绑定。 3、实例化后的ActivityMainBindingImpl对象…

基于深度学习的单帧图像超分辨率重建综述

论文标题:基于深度学习的单帧图像超分辨率重建综述作者: 吴 靖,叶晓晶,黄 峰,陈丽琼,王志锋,刘文犀发表日期:2022 年9 月阅读日期 :2023.11.18研究背景: 图像…

微信小程序配置企业微信的在线客服

配置企业微信后台 代码实现 <button tap"openCustomerServiceChat">打开企业微信客服</button>methods: {openCustomerServiceChat(){wx.openCustomerServiceChat({extInfo: {url: 你刚才的客服地址},corpId: 企业微信的id,showMessageCard: true,});} …

深度学习之基于YoloV5-Pose的人体姿态检测可视化系统

欢迎大家点赞、收藏、关注、评论啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代码。 文章目录 一项目简介 深度学习之基于 YOLOv5-Pose 的人体姿态检测可视化系统介绍YOLOv5-Pose 简介系统特点系统架构使用方法 二、功能三、系统四. 总结 一项目简介 深度学习之基…

vue3之echarts区域折线图

vue3之echarts区域折线图 效果&#xff1a; 核心代码&#xff1a; <template><div class"abnormal"><div class"per">单位&#xff1a;{{ obj.data?.unit }}</div><div class"chart" ref"chartsRef"&g…

CSDN每日一题学习训练——Python版(N皇后 II、买卖股票的最佳时机 II、编程通过键盘输入每一位运动员)

版本说明 当前版本号[20231120]。 版本修改说明20231120初版 目录 文章目录 版本说明目录N皇后 II题目解题思路代码思路参考代码 买卖股票的最佳时机 II题目解题思路代码思路参考代码 编程通过键盘输入每一位运动员题目解题思路代码思路参考代码 N皇后 II 题目 n 皇后问题…

达索系统3DEXPERIENCE云端设计新体验

云是现代生活中必不可少的工具&#xff0c;在云端进行数据传输避免了传统的文件传输方式&#xff0c;更加方便快捷&#xff0c;节约了工作时间。 01 云端平台升级 在日常工作中有什么独特优势 在我们的生活工作中&#xff0c;云越来越多被提起&#xff0c;比如云计算、云服务…

卷积神经网络(CNN)多种图片分类的实现

文章目录 前期工作1. 设置GPU&#xff08;如果使用的是CPU可以忽略这步&#xff09;我的环境&#xff1a; 2. 导入数据3.归一化4.可视化 二、构建CNN网络模型三、编译模型四、训练模型五、预测六、模型评估 前期工作 1. 设置GPU&#xff08;如果使用的是CPU可以忽略这步&#…

从多表连接视图对比人大金仓和Oracle

KING BASE 信息时代&#xff0c;数据是驱动业务决策和创新的核心资源。然而&#xff0c;随着数据量的不断增加&#xff0c;有效地处理和整合数据的过程变得愈发复杂。这时&#xff0c;多表连接视图悄然走进数据库世界&#xff0c;不仅能够将多个表中的数据整合在一起&#xff0…

香港公司如何开户 香港公司开户流程 香港公司开户注意事项

香港公司成为越来越多企业的优选注册地&#xff0c;由于其更加开 放的经济政策和国际化的金融市场&#xff0c;吸引了大量的投资者。然而&#xff0c;对于众多企业来说&#xff0c;香港公司的开户过程可能会有一些复杂和繁琐的环节。 香港公司开户流程 开立香港公司账户通常需…

es为什么这么快

es为什么这么快的方式 es的基于Lucene开源搜索引擎&#xff0c;负责文件存储和搜索&#xff0c;支持http请求&#xff0c;以json形式展示 这样介绍你有可能有点迷糊我们详细解释 es 使用的倒排索引的方式&#xff0c;进行数据存储方式&#xff0c;给每一个字段创建索引&…

管家婆订货易在线商城任意文件上传漏洞复现

0x01 产品简介 管家婆订货易&#xff0c;帮助传统企业构建专属的订货平台&#xff0c;PC微信APP小程序h5商城5网合一&#xff0c;无缝对接线下的管家婆ERP系统&#xff0c;让用户订货更高效。支持业务员代客下单&#xff0c;支持多级推客分销&#xff0c;以客带客&#xff0c;拓…

【C/C++】递归算法

信封 某人写了n封信和n个信封&#xff0c;如果所有的信都装错了信封。求所有的信都装错信封共有多少种不同情况 #include <iostream> using namespace std; const int N 30; int n; long f[N];int main() {scanf("%d", &n);f[1] 0, f[2] 1;for (int …

力扣labuladong——一刷day43

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、力扣257. 二叉树的所有路径二、力扣129. 求根节点到叶节点数字之和三、力扣199. 二叉树的右视图四、力扣662. 二叉树最大宽度 前言 一般来说&#xff0c;如…

「Verilog学习笔记」ROM的简单实现

专栏前言 本专栏的内容主要是记录本人学习Verilog过程中的一些知识点&#xff0c;刷题网站用的是牛客网 分析 要实现ROM&#xff0c;首先要声明数据的存储空间&#xff0c;例如&#xff1a;[3:0] rom [7:0]&#xff1b;变量名称rom之前的[3:0]表示每个数据具有多少位&#xff0…

HLS基础issue

hls 是一个用C/c 来开发PL &#xff0c;产生rtl的工具 hls是按照rtl code来运行的 &#xff0c; 但是rtl会在不同器件调用不同的源语&#xff1b; 可能产生的ip使用在vivado另外一个器件的话 会存在问题&#xff1b; Hls &#xff1a; vivado ip &#xff0c; vitis kernel 是…

认识前端包常用包管理工具(npm、cnpm、pnpm、nvm、yarn)

随着前端的快速发展,前端的框架越来越趋向于工程化,所以对于包的使用也越来越多,为了优化性能和后期的维护更新,对于前端包的管理也尤为重要,本文主要阐述对node中包管理工具的理解和简单的使用方法。也欢迎各位大佬和同行们多多指教。😁😁😁 👉1. npm 安装npm 通…

Java之反射获取和赋值字段

在Java中&#xff0c;反射能够使得代码更加通用&#xff0c;往往用于工具类中。 但常常我们在获取或者赋值反射的属性时&#xff0c;会出现没有赋值成功的结果&#xff0c;往往是由于这个属性在父级中而导致的&#xff0c;这个时候我们就不能用getDeclaredField方法单独获取字段…

自定义类使用ArrayList中的remove

Java中ArrayList对基础类型和字符串类型的删除操作&#xff0c;直接用remove方法即可。但是对于自定义的类来说&#xff0c;用remove方法删除不了&#xff0c;因为没有办法确定是否是要删除的对象。 ArrayList中remove源码是&#xff1a; public boolean remove(Object o) {if…

【linux】补充:高效处理文本的命令学习(tr、uniq、sort、cut)

目录 一、tr——转换、压缩、删除 1、tr -s “分隔符” &#xff08;指定压缩连续的内容&#xff09; 2、tr -d 想要删除的东西 ​编辑 3、tr -t 内容1 内容2 将内容1全部转换为内容2&#xff08;字符数需要一一对应&#xff09; 二、cut——快速剪裁命令 三、uniq——去…