使用gin实现简单的消息队列以及curl调试方法 | 青训营

286 阅读2分钟

消息队列的实现方法有很多

常见如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可以解决此类问题