- 博客(149)
- 收藏
- 关注
原创 Gin + JWT 认证机制详解:构建安全的Go Web应用
在现代Web开发中,用户身份认证是几乎所有应用的核心功能。随着前后端分离架构的普及,基于Token的认证机制(如JWT)因其无状态可扩展性强等特点,逐渐成为主流。本文将详细介绍如何在Go语言的Gin框架中集成JWT(JSON Web Token)实现安全的用户认证。JWT(JSON Web Token)是一种开放标准(RFC 7519),用于在各方之间安全地传输信息作为JSON对象。它通常用于身份验证和信息交换。Header(头部):包含令牌类型和使用的签名算法(如HS256)。
2025-09-25 20:00:13
838
原创 Gin 集成 Redis:从连接到实战
Redis作为一款高性能的内存数据结构存储系统,常被用作缓存、消息队列和数据库。Redis 集成到项目中合理利用,可以极大地提升 Web 应用的性能和响应速度。通过以上步骤,我们成功地将 Redis 集成到了 Gin 框架中。我们学习了如何建立连接、使用各种数据类型、利用管道和事务提升性能,并通过一个实际的缓存示例展示了其价值。合理使用 Redis 可以显著提升 Web 应用的性能和用户体验。记得在生产环境中妥善管理连接、处理错误并考虑缓存失效策略。
2025-09-18 19:44:37
666
原创 Gin + Gorm:完整 CRUD API 与关系操作指南
GORM 是 Go 语言中最流行、功能最强大的 ORM(对象关系映射)框架之一。它为开发者提供了简洁、直观的 API 来操作数据库,极大地简化了数据库交互的复杂性。以下是对 GORM 的全面深入介绍。在 models/models.go 中定义我们的核心模型。我们将创建一个博客系统,包含用户(User)、文章(Post)和标签(Tag)。import ("time"// User 用户模型BaseModelPassword string `json:"-"` // JSON序列化时忽略。
2025-09-16 19:39:31
536
原创 Gin + Zap 日志:构建高性能、结构化的应用日志系统
在项目开发和运维过程中,日志记录是不可或缺的一环,它帮助我们追踪请求、排查问题和监控系统状态。Gin 框架本身提供了两个非常实用的默认中间件:gin.Logger() 和 gin.Recovery()。理解它们的功能是构建更强大日志系统的基础。本文会先介绍这两个中间件,并演示如何将 Gin 与功能强大的日志库 Zap 集成,以实现高性能、结构化的日志输出。
2025-09-09 17:25:04
715
原创 Gin + Viper 实现配置读取与热加载
在现代 Go 应用开发中,配置管理是构建灵活、可维护服务的基础。Viper 是 Go 生态中最流行的配置管理库之一,它支持多种格式(JSON, YAML, TOML, env, flags 等)、环境变量覆盖、远程配置(etcd/Consul)以及配置热加载。灵活的配置读取:支持多格式、多环境、环境变量覆盖。配置热加载:监听文件变更,动态更新应用配置。结构化管理:使用 Go struct 组织配置,类型安全。热加载是强大功能,但需谨慎使用。
2025-09-05 17:17:30
1114
原创 Gin Validator 错误信息翻译与自定义校验规则详解
在使用 Go 语言的 Gin 框架开发 Web 应用时,数据校验是保障接口数据完整性和安全性的关键环节。Gin 集成了 go-playground/validator/v10 作为其默认的校验引擎,提供了强大且灵活的结构体字段验证能力。然而,其默认的英文错误信息对中文用户不够友好,且内置规则无法覆盖所有业务场景。本文将深入探讨 Gin Validator 的两大核心功能:错误信息的翻译(国际化) 和 自定义校验规则的实现,帮助你构建更健壮、更用户友好的 API 接口。
2025-08-28 14:58:39
950
原创 Go语言的gRPC教程-超时控制
通过使用,我们可以精细化的控制gRPC中服务端、客户端两端的建连,调用,以及在拦截器中的超时时间。同时gRPC还提供了超时传递的能力,让超时的请求不继续在链路中往下传递,提高链路整体的性能。
2025-08-08 11:53:46
1041
原创 Go语言的gRPC教程-错误处理
我们先介绍了gRPC最基本的错误处理方式:返回error。Status,它包含codemessagedetails等信息,通过Status与error的互相转换,利用error来传输错误。
2025-08-05 11:10:37
932
原创 Go语言的gRPC教程-拦截器
gRPC的拦截器和其他框架的拦截器(也称middleware)作用是一样的。利用拦截器我们可以在不侵入业务逻辑的前提下修改或者记录服务端或客户端的请求与响应,利用拦截器我们可以实现诸如日志记录权限认证限流等诸多功能上一篇提到gRPC的通信模式分为unary和streaming和,两种拦截器可以分别应用在服务端和客户端,所以gRPC总共为我们提供了四种拦截器。它们已经被定义成了go中的接口,我们创建的拦截器只要实现这些接口即可。
2025-08-01 18:02:01
1127
原创 Go语言的gRPC教程-通信模式
✨ 前文提到过protobuf协议是平台无关的。演示的客户端和服务端都是 golang 的,即使客户端和服务端不同语言也是类似的可以通信的✨ 对于上面介绍的的这种类似于http1.x的模式:客户端发送请求,服务端响应请求,一问一答的模式在 gRPC 里叫做Simple RPC(也称Unary RPC 一元RPCgRPC 同时也支持其他类型的交互方式。streaming";// 服务端流模式:客户端发送一次请求,服务端持续返回数据// 1 是字段编号,用于在消息定义中标识字段,不是值。
2025-07-31 10:09:30
893
原创 go语言的gRPC教程-protobuf基础
gRPC是谷歌开源的一款高性能序列化协议。gRPC使用protobuf,首先使用protobuf定义服务,然后使用这个文件来生成客户端和服务端的代码。因为pb是跨语言的,因此即使服务端和客户端语言并不一致也是可以互相序列化和反序列化的网络传输层。gRPC使用http2.0协议,http2.0相比于HTTP 1.x,大幅度的提升了 web 性能。protobuf里最基本的类型就是message,每一个messgae都会有一个或者多个字段(field),其中字段包含如下元素类型:类型不仅可以是标量类型(int。
2025-07-29 10:45:30
479
原创 轻松管理多个Go版本:g工具安装与使用
Golang 的版本控制工具 g是一个用于方便地管理和切换 Go 语言版本的命令行工具。它让用户可以轻松地安装、卸载和切换不同版本的 Go,从而更好地适应不同项目的需求。类似于Python的pyenv或Node.js的nvm,是专为Go设计的轻量级版本管理工具。同时支持windows、linux、mac三个系统。通过本文的详细介绍,我们了解到 g 是一个非常强大的工具,能够极大地简化 Go 语言版本管理的过程。安装方式自动化安装:适用于希望快速上手且不需要自定义配置的用户。只需执行简单的命令即可完成安装。
2025-07-15 19:52:44
1859
原创 Golang实战:使用 Goroutine 实现数字与字母的交叉打印
在 Go 语言中,goroutine 是轻量级的并发执行单元,它使得我们能够非常方便地实现并发编程。本文将通过一个经典的案例 —— 使用两个 goroutine 交替打印数字和字母,来演示如何利用 channel 控制 goroutine 的执行顺序,并加深对 Go 并发模型的理解。技术点应用场景说明Goroutine并发执行多个任务Channel协调 goroutine 之间的执行顺序主 goroutine 等待确保程序不会提前退出。
2025-07-12 19:58:41
482
原创 浏览器工作原理41 [#] 性能分析工具:如何分析Performance中的Main指标?
本文主要的目的是让学会如何分析 Main 指标。通过页面加载过程的分析,就能掌握一套标准的分析 Main 指标的方法,在该方法中,我将加载过程划分为三个阶段:导航阶段;解析 HTML 文件阶段;生成位图阶段。在导航流程中,主要是处理响应头的数据,并执行一些老页面退出之前的清理操作。在解析 HTML 数据阶段,主要是解析 HTML 数据、解析 CSS 数据、执行 JavaScript 来生成 DOM 和 CSSOM。
2025-07-07 19:40:43
953
原创 浏览器工作原理40 [#]页面性能工具:如何使用Performance?
首先介绍了如何去配置 Performance 并生成报告页,然后将焦点放在了如何解读报告页上。之后介绍了报告页面主要分为三个部分,概览面板、性能面板和详情面板。可以通过概览面板来定位问题的时间节点,然后再使用性能面板分析该时间节点内的性能数据。不过在分析数据时,需要弄明白性能面板内各项数据指标的含义,要了解这些,需要了解浏览器渲染流水线、浏览器的进程架构等知识点,因此结合这些知识点,接下来分析了性能面板的各项指标的含义。
2025-07-06 13:25:48
1002
原创 浏览器工作原理 39 [#] 加载阶段性能:使用 Lighthouse 来优化 Web 性能
Lighthouse 是前端性能优化的强大工具,通过全面的分析和详细的优化建议,开发者可以发现网页性能问题并进行改进。
2025-07-04 10:36:26
814
原创 浏览器工作原理 38 [#]任务调度:有了setTimeOut,为什么还要使用 requestAnimationFrame
要想利用 JavaScript 实现高性能的动画,那就得使用这个 API,简称 rAF,那么为什么都推荐使用 rAF 而不是 setTimeOut 呢?要解释清楚这个问题,就要从渲染进程的任务调度系统讲起,理解了渲染进程任务调度系统,你自然就明白了 rAF 和 setTimeOut 的区别。其次,如果你理解任务调度系统,那么你就能将渲染流水线和浏览器系统架构等知识串起来,理解了这些概念也有助于你理解 Performance 标签是如何工作的。
2025-07-03 19:45:10
807
原创 浏览器工作原理37 [#] 浏览上下文组:如何计算Chrome中渲染进程的个数?
在默认情况下,如果打开一个标签页,那么浏览器会默认为其创建一个渲染进程。如果从一个标签页中打开了另一个新标签页,当新标签页和当前标签页属于同一站点(相同协议、相同根域名)的话,那么新标签页会复用当前标签页的渲染进程。多个标签页运行在同一个渲染进程:从标签页中打开新的标签页多个标签页运行在不同的渲染进程中:新建一个标签页打开简而言之,noreferrer 标记在单击链接时隐藏引用者信息。如果有人从使用此标记的链接到达您的网站,您的分析将不会显示谁提到该链接。
2025-07-02 10:04:20
414
原创 浏览器工作原理32 [#]同源策略:为什么XMLHttpRequst不能跨域请求资源
要了解什么是同源策略,先来看看什么是同源。如果两个 URL 的协议域名和端口都相同,就称这两个 URL 同源。比如下面这两个 URL,它们具有相同的协议 HTTPS、相同的域名 time.geekbang.org,以及相同的端口 443,所以就说这两个 URL 是同源的。category=1category=0浏览器默认两个相同的源之间是可以相互访问资源和操作 DOM 的。两个不同的源之间若想要相互访问资源或者操作 DOM,那么会有一套基础的安全策略的制约,这称为同源策略。
2025-07-01 17:25:27
1052
原创 浏览器工作原理31 [#] HTTP3:甩掉TCP、TCL包袱 构建高效网络
首先分析了 HTTP/2 中所存在的一些问题,主要包括了 TCP 的队头阻塞、建立 TCP 连接的延时、TCP 协议僵化等问题。这些问题都是 TCP 的内部问题,因此要解决这些问题就要优化 TCP 或者“另起炉灶”创造新的协议。由于优化 TCP 协议存在着诸多挑战,所以官方选择了创建新的 QUIC 协议。HTTP/3 正是基于 QUIC 协议的,你可以把 QUIC 看成是集成了“TCP+HTTP/2 的多路复用 +TLS 等功能”的一套协议。
2025-06-30 15:57:09
620
原创 浏览器工作原理30 [#]HTTP2:如何提升网络速度
首先分析了影响 HTTP/1.1 效率的三个主要因素:TCP 的慢启动、多条 TCP 连接竞争带宽和队头阻塞。接下来分析了 HTTP/2 是如何采用多路复用机制来解决这些问题的。多路复用是通过在协议栈中添加二进制分帧层来实现的,有了二进制分帧层还能够实现请求的优先级、服务器推送、头部压缩等特性,从而大大提升了文件传输效率。HTTP/2 协议规范于 2015 年 5 月正式发布,在那之后,该协议已在互联网和万维网上得到了广泛的实现和部署。
2025-06-29 20:00:00
778
原创 浏览器工作原理29 [#] HTTP1:HTTP性能优化
本文重点强调了 HTTP 是浏览器和服务器的通信语言,然后从需求演变的角度追溯了 HTTP 的发展史,在诞生之初的 HTTP/0.9 因为需求简单,所以和服务器之间的通信过程也相对简单。由于万维网的快速崛起,带来了大量新的需求,其中最核心的一个就是需要支持多种类型的文件下载, 为此 HTTP/1.0 中引入了请求头和响应头。在支持多种类型文件下载的基础之上,HTTP/1.0 还提供了 Cache 机制、用户代理、状态码等一些基础信息。
2025-06-29 15:02:26
898
原创 浏览器工作原理28 [#] webComponent:像搭积木一样构建web应用
首先,介绍了组件化开发是程序员的刚需,所谓组件化就是功能模块要实现高内聚、低耦合的特性。不过由于 DOM 和 CSSOM 都是全局的,所以它们是影响了前端组件化的主要元素。基于这个原因,就出现 WebComponent,它包含自定义元素、影子 DOM 和 HTML 模板三种技术,使得开发者可以隔离 CSS 和 DOM。在此基础上,还重点介绍了影子 DOM 到底是怎么实现的。
2025-06-27 21:15:00
1714
原创 浏览器工作原理27 [#]PWA:解决了web应用哪些问题
先来看看 Service Worker 是怎么解决离线存储和消息推送的问题。其实在 Service Worker 之前,WHATWG 小组就推出过用 App Cache 标准来缓存页面,不过在使用过程中 App Cache 所暴露的问题比较多,遭到多方吐槽,所以这个标准最终也只能被废弃了,可见一个成功的标准是需要经历实践考量的。所以在 2014 年的时候,标准委员会就提出了 Service Worker 的概念,它的主要思想是在页面和网络之间增加一个拦截器,用来缓存和拦截请求。
2025-06-27 16:57:54
893
原创 浏览器工作原理26 [#]虚拟DOM:虚拟DOM和实际DOM有何不同
在谈论什么是虚拟 DOM 之前,先来看看虚拟 DOM 到底要解决哪些事情。将页面改变的内容应用到虚拟 DOM 上,而不是直接应用到 DOM 上。变化被应用到虚拟 DOM 上时,虚拟 DOM 并不急着去渲染页面,而仅仅是调整虚拟 DOM 的内部状态,这样操作虚拟 DOM 的代价就变得非常轻了。在虚拟 DOM 收集到足够的改变时,再把这些变化一次性应用到真实的 DOM 上。基于以上三点,再来看看什么是虚拟 DOM。
2025-06-26 17:57:44
902
原创 浏览器工作原理25 [#]页面性能:如何系统优化页面
主要讲解了如何系统优化加载阶段和交互阶段的页面。在加载阶段,核心的优化原则是:优化关键资源的加载速度,减少关键资源的个数,降低关键资源的 RTT 次数。在交互阶段,核心的优化原则是:尽量减少一帧的生成时间。可以通过减少单次 JavaScript 的执行时间、避免强制同步布局、避免布局抖动、尽量采用 CSS 的合成动画、避免频繁的垃圾回收等方式来减少一帧生成的时长。
2025-06-25 17:53:11
891
原创 TypeScript — d.ts 类型声明文件
生成tsconfig.json文件这个文件是通过tsc --init命令生成的配置详解"compilerOptions": { "incremental": true, // TS编译器在第一次编译之后会生成一个存储编译信息的文件,第二次编译会在第一次的基础上进行增量编译,可以提高编译的速度 "tsBuildInfoFile": "./buildFile", // 增量编译文件的存储位置 "diagnostics": true, // 打印诊断信息 "target": "E.
2025-06-24 19:20:16
1047
原创 浏览器工作原理24 [#]分层和合成机制:为什么css动画比JavaScript高效
本文主要讲解渲染引擎的分层和合成机制,因为分层和合成机制代表了浏览器最为先进的合成技术,Chrome 团队为了做到这一点,做了大量的优化工作。了解其工作原理,有助于拓宽你的视野,而且也有助于你更加深刻地理解 CSS 动画和 JavaScript 底层工作机制。每个显示器都有固定的刷新频率,通常是 60HZ,也就是每秒更新 60 张图片,更新的图片都来自于显卡中一个叫前缓冲区的地方,显示器所做的任务很简单,就是每秒固定读取 60 次前缓冲区中的图像,并将读取的图像显示到显示器上。那么这里显卡做什么呢?显卡的职
2025-06-24 15:57:29
993
原创 浏览器工作原理23 [#]渲染流水线:CSS如何影响首次加载时的白屏时间?
首先介绍了 CSS 在渲染流水线中的位置,以及 CSS 是如何影响到渲染流程的;接下来通过渲染流水线分析了从发出请求到页面首次绘制的三个阶段;最后重点介绍了第二个白屏阶段以及优化该阶段的一些策略。通过今天的内容可以知道虽然 JavaScript 和 CSS 给我们带来了极大的便利,不过也对页面的渲染带来了很多的限制,所以要关注资源加载速度,需要小心翼翼地处理各种资源之间的关联关系。
2025-06-23 16:59:12
663
原创 浏览器工作原理22 [#]DOM树:JavaScript是如何影响DOM树构建的
从网络传给渲染引擎的 HTML 文件字节流是无法直接被渲染引擎理解的,所以要将其转化为渲染引擎能够理解的内部结构,这个结构就是 DOM。DOM 提供了对 HTML 文档结构化的表述。在渲染引擎中,DOM 有三个层面的作用从页面的视角来看,DOM 是生成页面的基础数据结构。从 JavaScript 脚本视角来看,DOM 提供给 JavaScript 脚本操作的接口,通过这套接口,JavaScript 可以对 DOM 结构进行访问,从而改变文档的结构、样式和内容。
2025-06-21 09:16:08
711
原创 浏览器工作原理21 [#]页面性能分析:利用chrome做web性能分析
首先我们简单介绍了 Chrome 开发者工具 10 个基础的面板信息;然后重点剖析了网络面板,再结合之前介绍的网络请求流程来重点分析了网络面板中时间线的各个指标的含义;最后我们还简要分析了时间线中各项指标出现异常的可能原因,并给出了一些优化方案。其实通过今天的分析,我们可以得出这样一个结论:如果你要去做一些实践性的项目优化,理解其背后的理论至关重要。因为理论就是一条“线”,它会把各种实践的内容“串”在一起,然后你可以围绕着这条“线”来排查问题。
2025-06-18 17:59:36
706
原创 浏览器工作原理20 [#] async await使用同步方式写异步代码
Promise 的编程模型依然充斥着大量的 then 方法,虽然解决了回调地狱的问题,但是在语义方面依然存在缺陷,代码中充斥着大量的 then 函数,这就是 async/await 出现的原因。使用 async/await 可以实现用同步代码的风格来编写异步代码,这是因为 async/await 的基础技术使用了生成器和 Promise,生成器是协程的实现,利用生成器能实现生成器函数的暂停和恢复。
2025-06-17 11:20:36
696
原创 浏览器工作原理19 [#]使用Promise告别回调函数
首先,我们回顾了 Web 页面是单线程架构模型,这种模型决定了我们编写代码的形式——异步编程。基于异步编程模型写出来的代码会把一些关键的逻辑点打乱,所以这种风格的代码不符合人的线性思维方式。接下来我们试着把一些不必要的回调接口封装起来,简单封装取得了一定的效果,不过,在稍微复制点的场景下依然存在着回调地狱的问题。多层嵌套的问题;每种任务的处理结果存在两种可能性(成功或失败),那么需要在每种任务执行结束后分别处理这两种可能性。
2025-06-15 14:30:42
934
原创 浏览器工作原理18 [#] 宏任务和微任务:不是所有的任务都是一个待遇
首先我们回顾了宏任务,然后在宏任务的基础之上,我们分析了异步回调函数的两种形式,其中最后一种回调的方式就是通过微任务来实现的。接下来我们详细分析了浏览器是如何实现微任务的,包括微任务队列、检查点等概念。最后我们介绍了监听 DOM 变化技术方案的演化史,从轮询到 Mutation Event 再到最新使用的 MutationObserver。MutationObserver 方案的核心就是采用了微任务机制,有效地权衡了实时性和执行效率的问题。
2025-06-13 15:40:44
882
原创 浏览器工作原理17 [#]Webapi:XMLHttpRequest是怎么实现的
首先我们介绍了回调函数和系统调用栈;接下来我们站在循环系统的视角,分析了 XMLHttpRequest 是怎么工作的;最后又说明了由于一些安全因素的限制,在使用 XMLHttpRequest 的过程中会遇到跨域问题和混合内容的问题。本篇文章跨度比较大,不是单纯地讲一个问题,而是将回调类型、循环系统、网络请求和安全问题“串联”起来了。
2025-06-13 15:06:10
1010
原创 浏览器工作原理16 [#]Webapi:setTimeout是怎么实现的?
首先,为了支持定时器的实现,浏览器增加了延时队列。其次,由于消息队列排队和一些系统级别的限制,通过 setTimeout 设置的回调任务并非总是可以实时地被执行,这样就不能满足一些实时性要求较高的需求了。最后,在定时器中使用过程中,还存在一些陷阱,需要你多加注意。通过分析和讲解,你会发现函数 setTimeout 在时效性上面有很多先天的不足,所以对于一些时间精度要求比较高的需求,应该有针对性地采取一些其他的方案。
2025-06-13 11:14:18
1185
原创 浏览器工作原理15 [#]消息队列和事件循环:页面是怎么活起来的
如果有一些确定好的任务,可以使用一个单线程来按照顺序处理这些任务,这是第一版线程模型。要在线程执行过程中接收并处理新的任务,就需要引入循环语句和事件系统,这是第二版线程模型。如果要接收其他线程发送过来的任务,就需要引入消息队列,这是第三版线程模型。如果其他进程想要发送任务给页面主线程,那么先通过 IPC 把任务发送给渲染进程的 IO 线程,IO 线程再把任务发送给页面主线程。消息队列机制并不是太灵活,为了适应效率和实时性,引入了微任务。
2025-06-12 14:54:33
894
原创 浏览器工作原理14 [#]编译器和解析器:V8如何执行一段JavaScript代码的
首先我们介绍了编译器和解释器的区别。紧接着又详细分析了 V8 是如何执行一段 JavaScript 代码的:V8 依据 JavaScript 代码生成 AST 和执行上下文,再基于 AST 生成字节码,然后通过解释器执行字节码,通过编译器来优化编译字节码。基于字节码和编译器,我们又介绍了 JIT 技术。最后我们延伸说明了下优化 JavaScript 性能的一些策略。编译器和解释器的相关概念和理论对于程序员来说至关重要,向上能让你充分理解一些前端应用的本质,向下能打开计算机编译原理的大门。
2025-06-11 17:39:42
731
原创 浏览器工作原理13 [#]垃圾回收:垃圾数据如何自动回收
首先我们介绍了不同语言的垃圾回收策略,然后又说明了栈中的数据是如何回收的,最后重点讲解了 JavaScript 中的垃圾回收器是如何工作的。从上面的分析你也能看出来,无论是垃圾回收的策略,还是处理全停顿的策略,往往都没有一个完美的解决方案,你需要花一些时间来做权衡,而这需要牺牲当前某几方面的指标来换取其他几个指标的提升。其实站在工程师的视角,我们经常需要在满足需求的前提下,权衡各个指标的得失,把系统设计得尽可能适应最核心的需求。生活中处理事情的原则也与之类似,古人很早就说过“
2025-06-11 15:20:33
558
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅