当前位置: 首页 > news >正文

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 服务可以显著提高性能。
  • 代码优化:路由的处理函数应当高效执行,避免在热路径上进行复杂的计算或者阻塞操作。对于可以异步执行的操作,应当避免阻塞主线程,以提高吞吐量。
  • 测试和监控:定期进行性能测试,识别和优化潜在的瓶颈。实时监控应用的性能,以便快速响应任何性能下降的情况。

相关文章:

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

什么是路由? 在 Web 开发中,会经常和路由打交道,可能有的同学并没有仔细思考过到底什么是路由。路由是根据用户请求的 URL 来确定返回给用户的内容或页面的技术,即将 HTTP 请求映射到相应的处理代码,使得用户能够通过…...

VBA技术资料MF83:将Word文档批量另存为PDF文件

我给VBA的定义:VBA是个人小型自动化处理的有效工具。利用好了,可以大大提高自己的工作效率,而且可以提高数据的准确度。我的教程一共九套,分为初级、中级、高级三大部分。是对VBA的系统讲解,从简单的入门,到…...

通信原理板块——脉冲编码调制(PCM)

微信公众号上线,搜索公众号小灰灰的FPGA,关注可获取相关源码,定期更新有关FPGA的项目以及开源项目源码,包括但不限于各类检测芯片驱动、低速接口驱动、高速接口驱动、数据信号处理、图像处理以及AXI总线等 1、脉冲编码调制PCM原理 将模拟信号…...

绕过类安全问题分析方法

什么是绕过 逻辑漏洞是指程序设计中逻辑不严密,使攻击者能篡改、绕过或中断程序,令其偏离开发人员预期的执行。 常见表现形式 1、接口(功能类)绕过:即接口或功能中通过某参数,绕过程序校验 2、流程类绕…...

基于STC12C5A60S2系列1T 8051单片的IIC总线器件数模芯片PCF8591实现数模转换应用

基于STC12C5A60S2系列1T 8051单片的IIC总线器件数模芯片PCF8591实现数模转换应用 STC12C5A60S2系列1T 8051单片机管脚图STC12C5A60S2系列1T 8051单片机I/O口各种不同工作模式及配置STC12C5A60S2系列1T 8051单片机I/O口各种不同工作模式介绍IIC总线器件数模芯片PCF8591介绍通过按…...

2023年中国骨质疏松治疗仪发展趋势分析:小型且智能将成为产品优化方向[图]

骨质疏松治疗仪利用磁场镇静止痛、消肿消炎的治疗作用迅速缓解患者腰背疼痛等骨质疏松临床症状。同时利用磁场的磁-电效应产生的感生电势和感生电流,改善骨的代谢和骨重建,通过抑制破骨细胞、促进成骨细胞的活性来阻止骨量丢失、提高骨密度。 骨质疏松治…...

并发编程之生产者消费者模型

什么是生产者消费者模型 生产者消费者模型是多线程中一个比较典型的模型。 打个比方:你是一个客户,你去超市里买火腿肠。 这段话中的 "你"就是消费者, 那么给超市提供火腿肠的供货商就是生产者。超市呢?超市是不是被…...

Java要将字符串转换为Map

Java要将字符串转换为Map,可以使用以下方法: import com.google.gson.Gson; import com.google.gson.reflect.TypeToken; import java.lang.reflect...

2760. 最长奇偶子数组 --力扣 --JAVA

题目 给你一个下标从 0 开始的整数数组 nums 和一个整数 threshold 。 请你从 nums 的子数组中找出以下标 l 开头、下标 r 结尾 (0 < l < r < nums.length) 且满足以下条件的 最长子数组 &#xff1a; nums[l] % 2 0 对于范围 [l, r - 1] 内的所有下标 i &#xff0c…...

JVM——运行时数据区(程序计数器+栈)

目录 1.程序计数器2.栈Java虚拟机栈 - 栈帧的组成1.Java虚拟机栈-局部变量表3.Java虚拟机栈-操作数栈3.Java虚拟机栈-帧数据 3.Java虚拟机栈-栈内存溢出4.本地方法栈 ⚫ Java虚拟机在运行Java程序过程中管理的内存区域&#xff0c;称之为运行时数据区。 ⚫ 《Java虚拟机规范》中…...

【C++】数组中出现次数超过一半的数字

代码&#xff1a; class Solution { public:/*** 代码中的类名、方法名、参数名已经指定&#xff0c;请勿修改&#xff0c;直接返回方法规定的值即可** * param numbers int整型vector * return int整型*/int MoreThanHalfNum_Solution(vector<int>& numbers) {int …...

3GPP协议解读(一)_23.501_23.502_PDU Session_SMF与UDP的交互

UE发起计算服务申请后&#xff0c;网络侧处理的流程 UE发起服务的流程&#xff1a;service request网络侧处理服务涉及的通信数据通过PDU Session进行传输&#xff0c;涉及到SMF与UPF的交互。PDU Session的建立、管理全部由SMF&#xff08;Session Management Function&#x…...

天池2023智能驾驶汽车虚拟仿真视频数据理解--baseline

baseline 代码 代码 百度飞浆一键运行 import paddle from PIL import Image from clip import tokenize, load_model import glob, json, os import cv2 from PIL import Image from tqdm import tqdm_notebook import numpy as np from sklearn.preprocessing import norma…...

C++入门(1)—命名空间、缺省参数

目录 一、什么是C 1、C关键字(C98) 2、C兼容C 二、C程序预处理指令 三、命名空间 1、命名冲突 第一种&#xff1a; 第二种&#xff1a; 2、域作用限定符 3、实现命名空间 4、命名空间冲突 5、访问命名空间 6、命名空间“std” 四、输入输出 1、定义 2、自动识…...

以程序员的身份使用curl获取速卖通详情

作为一名程序员&#xff0c;我们经常需要和各种API接口打交道。在电商领域&#xff0c;速卖通是一个非常受欢迎的平台。本文将介绍如何使用curl工具通过速卖通的API接口获取商品详情。 一、准备工作 在开始之前&#xff0c;请确保您已完成以下准备工作&#xff1a; 注册速卖…...

Java设计模式-结构型模式-装饰模式

装饰模式 装饰模式角色案例装饰模式与静态代理的区别 装饰模式 允许向一个现有的对象动态地添加新的功能&#xff0c;同时不改变其结构。它是继承的一种替代方案&#xff0c;可以动态地扩展对象。有点像静态代理 角色 装饰者模式有四种角色 抽象被装饰者&#xff0c;被装饰者…...

这7个“小毛病”项目经理必须克服

大家好&#xff0c;我是老原。 项目经理干项目可能不在行&#xff0c;但“踩坑”、“背锅”一定在行。 当上项目经理不容易&#xff0c;当好项目经理更不容易&#xff0c;有永远填不完的坑和背不完的锅。 如果要问项目经理都踩过哪些坑&#xff0c;那真的是太多了&#xff0…...

一言成文大模型:大模型实践之路

元宇宙_一言成文大模型...

【VSCode】配置C/C++开发环境教程(Windows系统)

下载和配置MinGW编译器 首先&#xff0c;我们需要下载并配置MinGW编译器。 下载MinGW编译器&#xff0c;并将其放置在一个不含空格和中文字符的目录下。 配置环境变量PATH 打开控制面板。可以通过在Windows搜索栏中输入"控制面板"来找到它。 在控制面板中&#xf…...

算法实战:亲自写红黑树之四 插入insert的平衡

本文承接自&#xff1a; 算法实战&#xff1a;亲自写红黑树之一-CSDN博客 算法实战&#xff1a;亲自写红黑树之二 完整代码-CSDN博客 算法实战&#xff1a;亲自写红黑树之三 算法详解-CSDN博客 目录 一、入口 二、普通二叉树插入 三、插入后的平衡 四、算法解惑 一、入口 入…...

React hook之useRef

React useRef 详解 useRef 是 React 提供的一个 Hook&#xff0c;用于在函数组件中创建可变的引用对象。它在 React 开发中有多种重要用途&#xff0c;下面我将全面详细地介绍它的特性和用法。 基本概念 1. 创建 ref const refContainer useRef(initialValue);initialValu…...

DAY 47

三、通道注意力 3.1 通道注意力的定义 # 新增&#xff1a;通道注意力模块&#xff08;SE模块&#xff09; class ChannelAttention(nn.Module):"""通道注意力模块(Squeeze-and-Excitation)"""def __init__(self, in_channels, reduction_rat…...

学校招生小程序源码介绍

基于ThinkPHPFastAdminUniApp开发的学校招生小程序源码&#xff0c;专为学校招生场景量身打造&#xff0c;功能实用且操作便捷。 从技术架构来看&#xff0c;ThinkPHP提供稳定可靠的后台服务&#xff0c;FastAdmin加速开发流程&#xff0c;UniApp则保障小程序在多端有良好的兼…...

五年级数学知识边界总结思考-下册

目录 一、背景二、过程1.观察物体小学五年级下册“观察物体”知识点详解&#xff1a;由来、作用与意义**一、知识点核心内容****二、知识点的由来&#xff1a;从生活实践到数学抽象****三、知识的作用&#xff1a;解决实际问题的工具****四、学习的意义&#xff1a;培养核心素养…...

CRMEB 框架中 PHP 上传扩展开发:涵盖本地上传及阿里云 OSS、腾讯云 COS、七牛云

目前已有本地上传、阿里云OSS上传、腾讯云COS上传、七牛云上传扩展 扩展入口文件 文件目录 crmeb\services\upload\Upload.php namespace crmeb\services\upload;use crmeb\basic\BaseManager; use think\facade\Config;/*** Class Upload* package crmeb\services\upload* …...

ABAP设计模式之---“简单设计原则(Simple Design)”

“Simple Design”&#xff08;简单设计&#xff09;是软件开发中的一个重要理念&#xff0c;倡导以最简单的方式实现软件功能&#xff0c;以确保代码清晰易懂、易维护&#xff0c;并在项目需求变化时能够快速适应。 其核心目标是避免复杂和过度设计&#xff0c;遵循“让事情保…...

Docker 本地安装 mysql 数据库

Docker: Accelerated Container Application Development 下载对应操作系统版本的 docker &#xff1b;并安装。 基础操作不再赘述。 打开 macOS 终端&#xff0c;开始 docker 安装mysql之旅 第一步 docker search mysql 》〉docker search mysql NAME DE…...

七、数据库的完整性

七、数据库的完整性 主要内容 7.1 数据库的完整性概述 7.2 实体完整性 7.3 参照完整性 7.4 用户定义的完整性 7.5 触发器 7.6 SQL Server中数据库完整性的实现 7.7 小结 7.1 数据库的完整性概述 数据库完整性的含义 正确性 指数据的合法性 有效性 指数据是否属于所定…...

HubSpot推出与ChatGPT的深度集成引发兴奋与担忧

上周三&#xff0c;HubSpot宣布已构建与ChatGPT的深度集成&#xff0c;这一消息在HubSpot用户和营销技术观察者中引发了极大的兴奋&#xff0c;但同时也存在一些关于数据安全的担忧。 许多网络声音声称&#xff0c;这对SaaS应用程序和人工智能而言是一场范式转变。 但向任何技…...

C++_哈希表

本篇文章是对C学习的哈希表部分的学习分享 相信一定会对你有所帮助~ 那咱们废话不多说&#xff0c;直接开始吧&#xff01; 一、基础概念 1. 哈希核心思想&#xff1a; 哈希函数的作用&#xff1a;通过此函数建立一个Key与存储位置之间的映射关系。理想目标&#xff1a;实现…...