消息队列的实现方法有很多
常见如go-redis实现
kafka或者rockemq
但是本期我们使用gin框架实现简单的消息队列
环境:
操作系统windows
终端 cmd
golang 1.20.7
Gin 1.9.1
curl 8.2.1
package main
import (
"fmt"
"sync"
"github.com/gin-gonic/gin"
)
var (
msgList []string // 消息列表
mutex sync.Mutex
)
func main() {
// 设置路由
router := gin.Default()
router.POST("/message", func(c *gin.Context) {
// 读取消息内容
message, exists := c.GetPostForm("message")
if !exists {
c.JSON(400, gin.H{"msg": "message is required"})
return
}
// 将消息加入到消息列表
fmt.Println("信息的内容是", message)
mutex.Lock()
msgList = append(msgList, message)
mutex.Unlock()
c.JSON(200, gin.H{"msg": "message added"})
})
router.GET("/message", func(c *gin.Context) {
// 从消息列表中取出消息
mutex.Lock()
if len(msgList) == 0 {
c.JSON(200, gin.H{"msg": "no message"})
mutex.Unlock()
return
}
// 取出最早加入的一条消息
message := msgList[0]
msgList = msgList[1:]
mutex.Unlock()
c.JSON(200, gin.H{"msg": message})
})
// 启动服务
router.Run(":8080")
}
当服务启动完之后我们使用curl对消息队列的POST和GET功能进行调测
curl http://localhost:8080/message
这个用于验证消息队列的get功能 结果应当是
{"msg":"no message"}
之后我们往消息队列里添加消息
curl -d"message=msg1" http://localhost:8080/message
注意消息添加完之后应该显示
{"msg":"message added"}
同理,我们继续往消息队列中插入3条消息
curl -d"message=msg2" http://localhost:8080/message
curl -d"message=msg3" http://localhost:8080/message
之后我们使用get功能从消息队列中弹出消息
curl http://localhost:8080/message
//结果
{"msg":"msg1"}
curl http://localhost:8080/message
//结果
{"msg":"msg2"}
curl http://localhost:8080/message
//结果
{"msg":"msg3"}
这样一个先进先出的消息队列就实现完成了
注意,curl的安装和调试在windows下可能出现错误
原因在于windows下有一个工具已经将curl的名称占用,如果将curl配到环境变量中在powershell中使用可能会发生冲突,将切换到cmd可以解决此类问题