- 博客(129)
- 收藏
- 关注
原创 【RabbitMQ #13】 | 延迟消息
延迟消息:生产者发送消息时指定延时时间,消费者不会立刻收到消息,等待设定时间到达后才会收到消息。典型业务场景:下单后超时未支付自动取消订单、释放库存。业务流程:下单 → 保存订单 → 扣减库存 → 设置倒计时,超时自动取消订单、恢复库存。队列内消息满足下面任意条件,就会变成死信 (Dead Letter)消费者调用basic.nack消费失败,并且(不重新放回队列)消息超时 TTL,超过时间无人消费队列消息堆满,最早入队的消息被丢弃默认情况下,死信会直接丢弃。如果队列配置了。
2026-10-01 10:04:17
176
原创 【RabbitMQ #12】 | 业务幂等
幂等:同一个业务,执行一次或者执行多次,对业务最终状态产生的影响完全一致。典型场景:表单重复提交、MQ 消息重复投递,多次执行不会产生脏数据。网页表单场景:进入页面下发 token,提交时校验 token,提交成功后删除 token,利用令牌机制实现表单幂等。MQ 场景为什么会重复消费?MQ 消费者在业务处理完成前宕机,ACK 没有发送成功,MQ 会重新投递消息,造成重复消费,因此消费端必须做幂等。
2026-09-30 14:49:31
216
原创 【RabbitMQ #11】 | 消费者可靠性
消费者如何保证消息一定被消费?开启消费者确认机制为 auto,由 Spring 确认消息处理成功后返回 ack,异常时返回 nack。开启消费者失败重试机制,并设置,多次重试失败后将消息投递到异常交换机,交由人工处理。
2026-09-30 14:00:35
182
原创 【RabbitMQ #10】 | MQ可靠性
首先通过配置可以让交换机、队列、以及发送的消息都持久化。这样队列中的消息会持久化到磁盘,MQ 重启消息依然存在。RabbitMQ 在 3.6 版本引入了 LazyQueue,并且在 3.12 版本后会称为队列的默认模式。LazyQueue 会将所有消息都持久化。开启持久化和生产者确认时,RabbitMQ 只有在消息持久化完成后才会给生产者返回 ACK 回调。
2026-09-29 11:01:48
304
原创 【RabbitMQ #8】 | 支付业务改造
改造余额支付功能,不再同步调用交易服务的 OpenFeign 接口,而是采用异步 MQ 通知交易服务更新订单状态。
2026-09-29 09:22:21
213
原创 【RabbitMQ #7】 | 消息转换器
SpringAMQP 默认使用 JDK 序列化,Java 专属二进制格式,Go 无法解析,MQ 控制台是乱码二进制。推荐统一使用JSON 序列化,可读性好,天然支持跨语言(Java ↔ Go)。SpringAMQP 通过完成对象与字节的转换;Go 没有内置实现,需要手动封装 json 序列化逻辑。最佳实践:消息头带上,让消费者识别消息编码格式。
2026-09-28 09:45:21
201
原创 【RabbitMQ #6】 | 代码声明队列与交换机
刚开始学习 RabbitMQ 时,队列、交换机都是在 MQ 的 Web 控制台手动创建。但在实际开发中,业务队列数量很多,不可能每次都手动在 RabbitMQ 控制台创建交换机和队列。
2026-09-28 09:34:31
147
原创 【RabbitMQ #5】 | 三大交换机 Fanout ,Direct ,Topic
Fanout:广播,消息发给所有绑定队列,routingKey 无效。适合全局通知。Direct:定向,完全匹配 BindingKey。适合精准推送。Topic:话题,支持通配符模糊匹配,功能最强,业务中最常用。
2026-09-28 09:13:53
217
原创 【RabbitMQ #4】 | Work 任务模型
Work 模型:多个消费者绑定同一个队列,并行消费,提升处理速度。消息唯一性:一条消息只会被一个消费者消费一次。prefetch 机制:控制预取消息数量,配合手动 ACK 实现能者多劳。使用场景:消息生产速度大于单个消费者处理能力,出现消息堆积。
2026-09-28 08:26:52
196
原创 【RabbitMQ #3】 | Go 客户端 + SpringAMQP
基础抽象层:底层 RabbitMQ 具体实现amqp://账号:密码@ip:5672/幂等特性:重复调用不会报错,不存在则新建队列Simple 模型:空交换机,routingKey 直接写队列名,消息直接投递队列autoAck:自动确认,消息收到后 MQ 立刻删除消息;生产环境一般关闭,手动 ACK 保证可靠性SpringAMQP 和 Go streadway/amqp 底层都是 AMQP0-9-1,可以对照理解学习。
2026-09-26 19:58:45
195
原创 【RabbitMQ】#2 | 整体架构
消息流转顺序:生产者发送消息 → 进入交换机(in) → 交换机根据绑定规则转发消息 → 进入绑定队列(out);Fanout 交换机特性:只要队列与该交换机完成绑定,所有绑定的队列都能接收到交换机推送的同一条消息;核心前提:交换机和队列必须建立绑定关系,否则消息无法完成路由,会直接丢失。
2026-09-22 11:46:06
207
原创 【RabbitMQ】#1 | 高性能异步通讯核心原理 & 安装
MQ(消息队列),即异步通信中的消息代理 Broker,本质是存放消息的队列,遵循先入先出规则,默认消息有序。
2026-09-21 09:36:19
110
原创 【从零开始的Agent 开发】|#1:从 LLM 到大模型 Agent
LLM 全称 Large Language Model,即大语言模型,是所有 AI Agent 应用的底层基础核心。Context(上下文)是大模型单次任务中接收的所有信息总和,包含:历史对话、当前输出内容、工具列表、System Prompt 等。本质:大模型的临时记忆体。Tool(工具)本质是可调用的函数,输入参数、输出结果,为大模型提供外部能力支撑。能够自主思考、自主规划、多次迭代调用工具、自动收尾任务,直至完成用户复杂需求的智能主体,即为 Agent。
2026-09-20 20:39:14
298
原创 【Redis中间件】#4 | 进阶数据类型语法
用一个字符串模拟 bit 数组,数组下标就是偏移量,支持位运算。Redis 内存数据断电丢失,持久化就是把内存数据落盘保存,两种方案:RDB、AOF。将一台 Redis(主节点)的数据复制到其他 Redis 实例(从节点),哨兵是独立运行的进程,三大能力:监控、通知、自动故障转移。,如果 K4 类型错误执行失败,K3、K5 依然会正常写入。重启 Redis 时,重新回放 AOF 内命令恢复数据。,二进制前 4 位为 1,后 4 位为 0。从节点同步主节点全部数据,保持数据一致。支持配置多个从节点。
2026-09-17 20:38:01
121
原创 【Redis中间件】#3 | 进阶数据类型语法
Stream 是 Redis5.0 引入的数据结构,专门用作轻量消息队列,相关命令以。Geospatial 用于地理位置存储与计算,相关命令以。如果客户端订阅晚了,订阅之前的消息无法接收。Redis 提供发布订阅功能,实现消息广播。基数:集合中不重复元素的个数。HyperLogLog 是。,并非 Redis 独有。
2026-09-17 16:10:28
163
原创 【Redis中间件】#2 | 基础数据类型语法
SET key value 设置字符串键值对 GET key 获取对应键的值 DEL key 删除指定键 EXISTS key 判断键是否存在,存在返回 1,不存在返回 0 KEYS * 查看当前库所有键 FLUSHALL 清空所有数据库全部数据。EXPIRE key seconds 给已有键设置过期时间 TTL key 查看键剩余过期时间,-1 永久有效,-2 已过期 SETEX key seconds value 创建键的同时设置过期时间。SISMEMBER key value 判断元素是否在集合中。
2026-09-15 11:58:35
145
原创 【Redis中间件】#1 | 简介
Redis 是一款开源、高性能、基于内存的数据存储系统,也是目前最热门的 NoSQL 数据库之一。核心应用场景:可作为内存数据库、数据缓存、消息队列、分布式锁等中间件场景使用,广泛应用于互联网后端项目。
2026-09-15 10:33:18
241
原创 【基于GO的Web开发23】小清单项目
models:定义数据模型(结构体,gorm 映射表),只定义结构,不写业务dao:数据库连接初始化,封装基础数据库操作logic:业务逻辑,controller 调用 logic,logic 调用 dao,业务代码放这里controller:接收 gin 请求,参数绑定,返回 json,不写数据库操作routers:统一管理所有路由,路由分组,注册 controller 里的处理函数main.go:入口,初始化 mysql,加载路由,启动 web 服务。
2026-09-14 15:53:25
206
原创 【基于GO的Web开发21】GORM 更新操作
并且执行模型钩子函数 (Hooks)。如果想跳过钩子,不自动维护。普通 Update / Updates / Save 都会自动更新。,不管字段是否修改,会把结构体所有字段全部更新到数据库。,直接把表达式交给数据库执行,不在 Go 代码做运算。,不会自动更新 UpdatedAt。在钩子函数内部修改数据库列,使用。时间,触发钩子 Hooks。,常用于密码加密等场景。
2026-08-31 17:06:30
209
原创 【基于GO的Web开发20】GORM 查询操作
查询不到数据时,才使用 Attrs 里面的值初始化结构体;把查询结果扫描到结构体,复用查询逻辑,不一定绑定 model。Map 会把所有 key-value 全部作为查询条件,可以把条件不断拼接,最后调用立即执行方法执行 SQL。无论是否查询到数据,都会把参数赋值给结构体变量。抽取通用查询逻辑,封装成函数,实现查询逻辑复用。,会查询单条记录,需要传入模型指针接收结果。,直接提取到切片,不需要完整模型结构体。链式调用中,如果写多个立即执行方法,只查询需要的列,避免查询全部字段。直接传入主键切片,等价于。
2026-08-31 16:30:38
236
原创 【基于GO的Web开发19】GORM 创建记录与字段默认值
❌不要使用,废弃;u.Id == 0default标签只是数据库层面默认值,Go 结构体初始化不会自动给字段赋值,只有插入数据库之后才回写回来。零值(""0)会被 GORM 过滤,SQL 不携带该字段,数据库触发默认值。指针类型Scanner、Valuer 自定义接口。
2026-08-31 15:43:42
244
原创 【基于GO的Web开发18】GORM Model定义
ID intgorm.ModelRole string `gorm:"size:255"` // 设置字段大小为255not null"` // 设置会员号唯一并且不为空Num int `gorm:"AUTO_INCREMENT"` // 设置 num 为自增类型Address string `gorm:"index:addr"` // 给address字段创建名为addr的索引IgnoreMe int `gorm:"-"` // 忽略本字段,不映射数据库// 根据模型自动建表表格。
2026-08-30 17:36:03
216
原创 【基于GO的Web开发17】GORM连接本地 MySQL
GORM 是 Go 语言非常流行的 ORM 库,本课学习复用原生*sql.DB连接句柄的方式连接 MySQL 数据库,完成数据库连通 + 简单单表查询,适合新手入门复习。test。
2026-08-30 16:38:39
182
原创 【基于GO的Web开发16】gin中间件
Gin 中间件允许开发者在请求处理流程中注入钩子函数。中间件适合处理项目中公共业务逻辑,不用在每一个接口重复编写代码。
2026-08-28 18:06:10
282
原创 【基于GO的Web开发15】gin路由和路由组
路由是 Web 服务的基础,负责将客户端的请求 URL 分发到对应的处理函数。本篇笔记讲解 Gin 普通路由、Any匹配全部请求、404 自定义、路由分组Group,附带完整代码案例与复习要点。当访问的路由没有匹配到任何处理函数时,默认返回 404。NoRoute用来统一捕获 404 请求,自定义返回内容。// 需要提前加载html模板文件})路由组等价于给一批接口添加统一 URL 前缀,适合归类同一模块下的多个接口。类比于 Flask 中的蓝图,用来实现接口模块化管理。
2026-08-27 17:02:45
253
原创 【基于GO的Web开发14】gin请求重定向
💡踩坑提醒:301 永久重定向一旦访问成功,浏览器就会缓存跳转关系。即使后端代码修改跳转地址,浏览器依旧会跳转到旧地址!,属于服务器内部转发,不会向浏览器返回 301/302 响应。原理:修改当前请求的 URI 路径,再调用。,可以跳转到项目以外的网址,支持 http/https 外链。如果目标网站开启了 HTTPS,代码填写。,让 Gin 继续匹配新路由,完成内部转发。就有可能跳转失败、运营商网关返回 404。📌踩坑实战:跳转外链时必须注意协议头。Gin 的重定向分为。
2026-08-27 15:45:05
193
原创 【基于GO的Web开发13】gin文件上传
文件上传是 Web 开发非常常见的需求,本篇笔记讲解 Gin 框架实现单文件上传、多文件上传两种方案,附带前端表单代码、后端完整示例代码、核心参数说明与易错点总结,适合复习查阅。
2026-08-27 15:14:38
222
原创 【基于GO的Web开发12】gin参数绑定
参数绑定:把 HTTP 请求携带的参数(Query、Form 表单、JSON 等)自动映射绑定到后端结构体变量,不用手动一个个取值。ShouldBindURL 查询参数、form 表单、JSON 请求体,自动完成绑定⚠️必传指针&结构体变量,否则绑定失效结构体字段首字母大写 + 配置 tag 标签,缺一不可返回值err用来判断参数校验、绑定是否失败拓展区分:ShouldBind 与 Bind 的区别:Bind 遇到错误会直接终止请求,ShouldBind 不会,开发者自己手动处理错误。
2026-08-26 16:29:10
250
原创 【基于GO的Web开发11】gin获取URL‑Path 路径参数
路径参数(也叫 URL 路径参数、占位符参数),参数直接放在 URL 路径中,使用进行分割,不是放在?后面。/blog:固定路由前缀2026:year 路径参数08:month 路径参数适用场景:博客文章年月、用户 id、资源详情页等 REST 风格接口。使用:参数名作为占位符}):year:month就是路径占位符参数放在 URL 路径,由分割,不带?返回值固定为字符串 string路径参数必填,不能省略,少一段路径就直接 404路由前缀不一样,多条带占位符路由不会冲突。
2026-08-26 15:37:24
249
原创 【基于GO的Web开发10】gin获取HTML-Form表单提交参数
表格方法返回值获取不到参数的结果使用场景value返回空字符串 ""参数必填,不需要默认值c.DefaultPostForm ("key","默认值")value返回设置的默认值可选参数,兜底填充默认值(value,ok)ok=false需要校验参数是否传递,推荐用于登录校验。
2026-08-26 15:15:40
257
原创 【基于GO的Web开发9】gin获取querystring参数
前端与后端进行 HTTP 交互的时候,经常需要向后端传递参数。GET 请求会把参数拼接在URL 中?的后面,这一部分参数就叫做。key=value键值对形式多个参数之间使用符号分隔示例query=张三&age=20场景举例:搜索引擎搜索关键词,搜索词就是通过 QueryString 发送给后端,后端拿到关键词查询数据库,最后返回搜索结果。GET 请求参数放在 URL?之后,叫做 QueryString 参数参数格式为key=value,多个参数用?a=1&b=2。
2026-08-25 19:23:43
258
原创 【基于GO的Web开发9】gin框架返回json
在 Gin Web 开发中,前后端交互最常返回 JSON 格式数据,这个过程称为JSON 渲染。c.JSON(http状态码, 返回的数据):适合数据少、结构灵活、字段不固定的场景结构体:适合数据字段固定,项目大、规范严格的场景,代码可读性更高。
2026-08-24 11:33:54
174
原创 【基于GO的Web开发7】html/template 模板补充
当你使用又希望渲染原生 HTML(可点击链接、标签)时,就需要自定义函数,返回类型关闭转义。
2026-08-23 19:16:04
233
原创 【基于GO的Web开发5】html/template 模板语嵌套
Go html/template、text/template 自带一些预定义函数,但实际业务中不够用。我们可以自定义函数注册到模板引擎,然后在.tmpl文件中直接调用。先注册函数.Funcs(),再解析模板文件,顺序错了会报错。自定义函数顺序错误:Funcs 必须写在 ParseFiles 前面嵌套模板漏解析文件:外部被嵌套的文件(ul.tmpl)必须加到 ParseFiles 参数列表,否则报找不到模板define定义的模板片段名字不能重复如果想把子页面也拿到数据,记得后面加传递上下文。
2026-08-21 15:30:25
206
原创 【数据结构与算法】#2_ 链表
go运行// ElemType 自定义元素类型,可以替换为int、string等// LNode 单链表结点// LinkList 链表头指针类型别名,等价于 *LNodego运行// DNode 双链表结点prior *DNode // 前驱指针next *DNode // 后继指针// DLinkList 双链表头指针,等价于 *DNode表格链表类型结点指针域特点优点缺点单链表只有 next 后继指针结构简单,占用内存少无法直接获取前驱结点双向链表。
2026-08-20 17:50:00
230
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅