快速掌握 GO 之 RabbitMQ 结合 gin+gorm 案例
更多个人笔记见:
(注意点击“继续”,而不是“发现新项目”)
github个人笔记仓库 https://github.com/ZHLOVEYY/IT_note
gitee 个人笔记仓库 https://gitee.com/harryhack/it_note
个人学习,学习过程中还会不断补充~ (后续会更新在github上)
文章目录
- gin+gorm框架例子
- 服务端生产者
- 数据库存储
- 客户端消费者
- 访问测试
gin+gorm框架例子
post-platform/
├── main.go # Gin 服务(生产者)
├── rabbitmq.go # RabbitMQ 操作
├── models/
│ └── post.go # 帖子模型
├── db/
│ └── db.go # 数据库连接和操作
├── consumer/
│ └── main.go # 消费者(存储到 MySQL)
├── go.mod
└── go.sum
服务端生产者
- 定义 post.go
package modelstype Post struct {Title string `json:"title"`Content string `json:"content"`
}
gin 框架:"go get github.com/gin-gonic/gin"
- main.go:
package mainimport ("encoding/json""log""net/http""github.com/gin-gonic/gin""github.com/streadway/amqp"
)func failOnError(err error, msg string) {if err != nil {log.Fatalf("%s: %s", msg, err)}
}func main() {// 连接 RabbitMQconn, err := amqp.Dial("amqp://guest:guest@localhost:5672/")failOnError(err, "Failed to connect to RabbitMQ")defer conn.Close()ch, err := conn.Channel()failOnError(err, "Failed to open a channel")defer ch.Close()q, err := ch.QueueDeclare("post_queue", false, false, false, false, nil)failOnError(err, "Failed to declare a queue")// 初始化 Ginr := gin.Default()// 提交帖子接口r.POST("/posts", func(c *gin.Context) {var post struct {Title string `json:"title" binding:"required"`Content string `json:"content" binding:"required"`}if err := c.ShouldBindJSON(&post); err != nil {c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})return}// 序列化帖子为 JSONpostData, err := json.Marshal(post)if err != nil {c.JSON(http.StatusInternalServerError, gin.H{"error": "Failed to serialize post"})return}// 发送到 RabbitMQerr = ch.Publish("", // 交换机q.Name, // 队列名称false, // 强制false, // 立即amqp.Publishing{ContentType: "application/json",Body: postData,})if err != nil {c.JSON(http.StatusInternalServerError, gin.H{"error": "Failed to publish to RabbitMQ"})return}c.JSON(http.StatusOK, gin.H{"message": "Post submitted successfully"})})r.Run(":8081")
}
数据库存储
gorm 框架,需要 go get:
"gorm.io/driver/mysql""gorm.io/gorm"
- db.go
package dbimport ("log""test/model""gorm.io/driver/mysql""gorm.io/gorm"
)func InitDB() *gorm.DB {dsn := "root:password@tcp(localhost:3306)/dbname?charset=utf8mb4&parseTime=True&loc=Local"//根据情况填写password 和 dbname(具体的数据库和密码),这里用的本地 sqldb, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})if err != nil {log.Fatalf("Failed to connect to database: %v", err)}// 自动迁移,创建 posts 表err = db.AutoMigrate(&model.Post{})if err != nil {log.Fatalf("Failed to migrate database: %v", err)}return db
}
客户端消费者
- consumer.go
package mainimport ("encoding/json""log""test/db""github.com/streadway/amqp"
)func failOnError(err error, msg string) {if err != nil {log.Fatalf("%s: %s", msg, err)}
}type Post struct {Title string `json:"title"`Content string `json:"content"`
}func main() {conn, err := amqp.Dial("amqp://guest:guest@localhost:5672/")failOnError(err, "Failed to connect to RabbitMQ")defer conn.Close()ch, err := conn.Channel()failOnError(err, "Failed to open a channel")defer ch.Close()q, err := ch.QueueDeclare("post_queue", false, false, false, false, nil)failOnError(err, "Failed to declare a queue")// 初始化数据库db := db.InitDB()//消费消息msgs, err := ch.Consume(q.Name, "", true, false, false, false, nil)failOnError(err, "Failed to register a consumer")forever := make(chan bool)go func() {for d := range msgs {var posts Postif err := json.Unmarshal(d.Body, &posts); err != nil {log.Printf("Failed to unmarshal post: %v", err)continue}// 存储到数据库if err := db.Create(&posts).Error; err != nil {log.Printf("Failed to save post to database: %v", err)continue}log.Printf("Received post: Title=%s, Content=%s", posts.Title, posts.Content)// TODO: 存储到数据库(如 MySQL)}}()log.Printf(" [*] Waiting for posts. To exit press CTRL+C")<-forever // 等待程序退出,防止主线程退出,主动阻塞
}
gorm 中的 Create 是只要结构体的名字一样就会找对应的表,所以结构体命名为 Post/Posts都可以,虽然和 model 中的不一样,但是如果名字不一样,Create 函数就“找不到”
访问测试
分别终端运行程序后:
地址:http://localhost:8081/posts
发送内容:
{"title": "My First Post","content": "Hello, world!"
}
可以发现能正确送达,同时能存储到数据库中
相关文章:
快速掌握 GO 之 RabbitMQ 结合 gin+gorm 案例
更多个人笔记见: (注意点击“继续”,而不是“发现新项目”) github个人笔记仓库 https://github.com/ZHLOVEYY/IT_note gitee 个人笔记仓库 https://gitee.com/harryhack/it_note 个人学习,学习过程中还会不断补充&…...
JVM——SubstrateVM:AOT编译框架
引入 在现代软件开发领域,应用程序的启动性能和内存开销一直是影响用户体验的关键因素。对于 Java 应用程序而言,传统的即时编译(JIT)模式虽然能够在运行时对热点代码进行优化,提高程序的执行效率,但却无法…...
【HarmonyOS 5】鸿蒙Taro跨端框架
Taro跨端框架 支持React语法开发鸿蒙应用,架构分为三层: ArkVM层运行业务代码和React核心TaroElement树处理节点创建和属性绑定TaroRenderNode虚拟节点树与上屏节点一一对应 import { Component } from tarojs/taro export default class MyCompon…...

数据库原理 试卷
以下是某高校教学管理系统的毕业论文指导ER图,数据信息:一名教师指导多名学生,一名学生只能选择一名教师,试分析完成以下各题,如用SQL命令完成的,在SQL Server2008验证后把答案写在题目的下方。 图1 毕业论…...

【Qt开发】对话框
目录 1,对话框的介绍 2,Qt内置对话框 2-1,消息对话框QMessageBox 2-2,颜色对话框QColorDialog 2-3,文件对话框QFileDialog 2-4,字体对话框QFontDialog 2-5,输入对话框QInputDialog 1&…...
Ubuntu上进行VS Code的配置
1. 安装VS code sudo snap install code --classic 2. 安装GCC sudo apt install build-essential 3. 安装VS Code中文包 打开 VS Code 点击左侧活动栏中的扩展图标(或按Ctrl+Shift+X) 在搜索框中输入:Chinese (Simplified) 选择由 Microsoft 提供的 中文(简体)语言包…...
阴盘奇门 api数据接口
阴盘奇门,又称"道家阴盘遁甲"或"法术奇门",与阳盘奇门(奇门排盘)并称"奇门双雄"。由王凤麟教授整合道家三式(奇门、六壬、太乙)精髓创立,独创行为风水与立体全息预测技术,广…...

2025年渗透测试面试题总结-匿名[校招]攻防研究员(应用安全)(题目+回答)
安全领域各种资源,学习文档,以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具,欢迎关注。 目录 匿名[校招]攻防研究员(应用安全) 基础部分 1. HTTP状态码 2. HTTP请求方法及作用 3. 网络分层及协议 OW…...

碰一碰发视频系统--基于H5场景开发
#碰一碰发视频# 旨在构建一个基于移动网页(H5)的视频“碰传”交互系统,提供类似华为/苹果设备 NFC 轻碰分享的便捷体验。其核心技术依赖于移动端可用的近场通信(NFC 或 H5 相关 API)和可靠的媒体数据传输方案。实现细节…...

MagicAnimate 论文解读:引入时间一致性的视频人物动画生成方法
1. 前言/动机 问题:现有动画生成方法缺乏对时间信息的建模,常常出现时间一致性差的问题 描述: 现有的动画生成方法通常采用帧变形(frame-warping)技术,将参考图像变形以匹配目标动作。尽管这类方法能生成较…...
QT使用说明
QT环境准备 推荐Ubuntu平台上使用,配置简单,坑少。 Ubuntu 20.04 安装 sudo apt-get install qt5-default -y sudo apt-get install qtcreator -y sudo apt-get install -y libclang-common-8-dev启动 qtcreatorHelloWorld 打开 Qt Creator。选择 …...

数据结构:递归(Recursion)
目录 示例1:先打印,再递归 示例2:先递归,再打印 递归的两个阶段 递归是如何使用栈内存 复杂度分析 递归中的静态变量 内存结构图解 递归:函数调用自己 必须有判断条件来使递归继续或停止 我们现在通过这两个示…...

Cesium快速入门到精通系列教程一:打造第一个Cesium应用
一、打造第一个Cesium应用 1、官方渠道下载Cesium(可选择历史版本) GitHub Releases页面:https://github.com/CesiumGS/cesium/releases 访问 Cesium GitHub Releases,此处列出了所有正式发布的版本。 通过标签&#…...

力扣题解106:从中序与后序遍历序列构造二叉树
一、题目内容 题目要求根据二叉树的中序遍历序列和后序遍历序列来重建二叉树。具体来说,我们需要利用中序遍历序列和后序遍历序列的特点,通过递归的方法逐步构建出完整的二叉树。 中序遍历序列的特点是:左子树 -> 根节点 -> 右子树。后…...
Vue传参Props还是Pinia
Pinia 适用场景 全局状态管理 多个不相关组件需要共享数据需要跨页面/路由共享状态 复杂状态逻辑 包含多个相互关联的状态有复杂的状态修改逻辑 持久化需求 需要将状态保存到localStorage/sessionStorage页面刷新后需要恢复状态(恢复最后一次修改的状态࿰…...

学习STC51单片机25(芯片为STC89C52RCRC)
每日一言 生活就像弹簧,你弱它就强,你强它就弱,别轻易认输。 ESP8266作为路由器模式(AP模式)也就是在局域网内可以有服务器的作用 那么我们需要将pc作为设备进行连接ESP的发射出来的WIFE 叫做这个AI啥的 也有可能叫做…...

宁夏农业科技:创新引领,赋能现代农业新篇章
在广袤的宁夏大地上,农业科技如同一股强劲的春风,吹拂着每一寸土地,为宁夏的农业发展注入了新的活力与希望。近年来,宁夏农业科技以其独特的创新力和实践力,不断推动着现代农业的转型升级,让这片古老的土地…...

Accelerate 2025北亚巡展正式启航!AI智御全球·引领安全新时代
近日,网络安全行业年度盛会Accelerate 2025北亚巡展正式在深圳启航!智库专家、产业领袖及Fortinet高管、产品技术团队和300余位行业客户齐聚一堂,围绕“AI智御全球引领安全新时代”主题,共同探讨AI时代网络安全新范式。大会聚焦三…...

005学生心理咨询评估系统技术解析:搭建科学心理评估平台
学生心理咨询评估系统技术解析:搭建科学心理评估平台 在心理健康教育日益受重视的当下,学生心理咨询评估系统成为了解学生心理状态的重要工具。该系统涵盖试卷管理、试题管理等核心模块,面向管理员和用户两类角色,通过前台展示与…...
azure devops 系列 - 常用的task
任务在管道中执行操作。例如,任务可以构建应用、与 Azure 资源交互、安装工具或运行测试。任务是定义管道中自动化的构建基块。 运行作业时,所有任务都会按顺序依次运行。要在多个代理上并行运行同一组任务,或者在不使用代理的情况下运行某些任务,使用job。 Build Task …...

贪心算法应用:多重背包启发式问题详解
贪心算法应用:多重背包启发式问题详解 多重背包问题是经典的组合优化问题,也是贪心算法的重要应用场景。本文将全面深入地探讨Java中如何利用贪心算法解决多重背包问题。 多重背包问题定义 **多重背包问题(Multiple Knapsack Problem)**是背包问题的变…...

【保姆级教程】PDF批量转图文笔记
如果你有一个PDF文档,然后你想把它发成图文笔记emmm,最好再加个水印,你会怎么做? 其实也不麻烦,打开PDF文档,挨个截图,然后打开PS一张一张图片拖进去,再把水印图片拖进去࿰…...
Pytest Fixture 是什么?
Fixture 是什么? Fixture 是 Pytest 测试框架的核心功能之一,用于为测试函数提供所需的依赖资源或环境。它的核心目标是: ✅ 提供测试数据(如模拟对象、数据库记录) ✅ 初始化系统状态(如配置、临时文件&a…...
Spring Boot 基础知识全面解析:快速构建企业级应用的核心指南
一、Spring Boot 概述:重新定义 Java 开发 1.1 什么是 Spring Boot? Spring Boot 是基于 Spring 框架的快速开发框架,旨在简化 Spring 应用的初始搭建及开发过程。它通过 「约定优于配置」(Convention Over Configuration&#…...

数据库系统概论(十一)SQL 集合查询 超详细讲解(附带例题表格对比带你一步步掌握)
数据库系统概论(十一)SQL 集合查询 超详细讲解(附带例题表格对比带你一步步掌握) 前言一、什么是集合查询?二、集合操作的三种类型1. 并操作2. 交操作3. 差操作 三、使用集合查询的前提条件四、常见问题与注意事项五、…...
[mcu]系统频率
系统主频的选择直接影响性能、功耗和成本,不同厂商的芯片会根据应用场景设计不同的运行频率。 低频段80MHZ~160MHz 典型频率: 80MHz、120MHz、160MHz 特点: 低功耗,适合电池供电设备 处理能力有限,通常仅支持 单天线…...

clickhouse如何查看操作记录,从日志来查看写入是否成功
背景 插入表数据后,因为原本表中就有数据,一时间没想到怎么查看插入是否成功,因为对数据源没有很多的了解,这时候就想怎么查看下插入是否成功呢,于是就有了以下方法 具体方法 根据操作类型查找,比如inse…...

5G-A:开启通信与行业变革的新时代
最近,不少细心的用户发现手机信号标识悄然发生了变化,从熟悉的 “5G” 变成了 “5G-A”。这一小小的改变,却蕴含着通信技术领域的重大升级,预示着一个全新的通信时代正在向我们走来。今天,就让我们深入了解一下 5G-A&a…...
鸿蒙OS在UniApp中集成Three.js:打造跨平台3D可视化应用#三方框架 #Uniapp
在UniApp中集成Three.js:打造跨平台3D可视化应用 引言 在最近的一个项目中,我们需要在UniApp应用中展示3D模型,并实现实时交互功能。经过技术选型和实践,我们选择了Three.js作为3D渲染引擎。本文将分享我们在UniApp中集成Three.…...
Vue 3 组件化设计实践:构建可扩展、高内聚的前端体系
Vue 3 自发布以来,其引入的 Composition API 与改进的组件模型,为前端架构提供了更强的可组合性、复用性与模块化能力。本文将系统性探讨 Vue 3 如何通过组件化设计,实现复杂应用的解耦、扩展与维护,并结合实际工程经验提供最佳实…...