使用gin框架,编写一个接收数据的api接口

本文详细描述了一个使用Go语言(Go1.22)开发的Web服务,通过Gin框架处理POST和GET请求,将JSON数据存入Redis队列,并统计每日每小时的请求数。同时,涉及到配置文件管理、数据库连接和并发控制。
摘要由CSDN通过智能技术生成

功能:这里主要编写一个接口,将其json 数据存入对应的redis队列中,并统计每天的每小时请求数量

环境:

go

version go1.22.0 linux/amd64

 平台  linux X64

步骤一  新建目录  命令如下:

mkdir FormData

步骤二 新增配置文件config.yaml   内容如下:

#开启的端口
server:
    port: 8082

# 存储数据数据
redis_mq:
    host: 127.0.0.1
    port: 6379
    password:
    db: 2
    queue_key_name: data_list

redis_count:
    host: 127.0.0.1
    port: 6379
    password:
    db: 2

步骤三 编写主要逻辑  main.go 内容如下:

package main

import (
        "fmt"
        "github.com/gin-gonic/gin"
        "github.com/go-redis/redis"
        "gopkg.in/yaml.v3"
        "io/ioutil"
        "log"
        "strconv"
        "sync"
        "time"
)

var (
        redisClient      *redis.Client
        redisCountClient *redis.Client
        mutex            sync.Mutex
        wg               sync.WaitGroup
)

func main() {
        // 初始化 Redis 连接
        config, err := loadConfig("config.yaml")
        if err != nil {
                log.Fatal(err)
        }
        //      fmt.Printf("%v", config)
        //}
        dbnum, err := strconv.Atoi(config["redis_mq"]["db"])
        if err != nil {
                fmt.Println("转换失败:", err)
                return
        }
        redisClient = redis.NewClient(&redis.Options{
                Addr:     config["redis_mq"]["host"] + ":" + config["redis_mq"]["port"],
                Password: config["redis_mq"]["password"],
                DB:       dbnum,
                PoolSize: 50,
        })
        countdbnum, err := strconv.Atoi(config["redis_count"]["db"])
        if err != nil {
                fmt.Println("转换失败:", err)
                return
        }
        redisCountClient = redis.NewClient(&redis.Options{
                Addr:     config["redis_count"]["host"] + ":" + config["redis_count"]["port"],
                Password: config["redis_count"]["password"],
                DB:       countdbnum,
                PoolSize: 50,
        })

        // 初始化 Gin 框架
        router := gin.Default()

        // 定义接口路由
        router.POST("/pushData", func(c *gin.Context) {
                pushData(c, config)
        })
        router.GET("/pushData", func(c *gin.Context) {
                pushData(c, config)
        })

        // 启动服务
        router.Run(fmt.Sprintf(":%s", config["server"]["port"]))
}

func pushData(c *gin.Context, config map[string]map[string]string) {
        //defer wg.Done()
        // 获取请求参数
        // 计数器逻辑
        paramsJson, err := c.GetRawData()
        if err != nil {
                log.Println("读取数据错误:", err)
                c.JSON(500, gin.H{"status": 500, "message": "error_data"})
                return
        }
        wg.Add(1)
        go pushtoredis(string(paramsJson), config)
        //mutex.Lock()
        // 存储到 Redis

        //mutex.Unlock()
        // 返回成功响应
        c.JSON(200, gin.H{"Status": 200, "Message": "成功", "Data": map[string]string{"ShotPendingSize": ""}})
}

func pushtoredis(paramsJson string, config map[string]map[string]string) error {
        defer wg.Done()
        now := time.Now()
        month := now.Month()
        day := now.Day()
        hour := now.Hour()
        err := redisClient.LPush(config["redis_mq"]["queue_key_name"], paramsJson).Err()
        if err != nil {
                log.Println("推入redis错误:", err)
                return err
        }
        countKey := fmt.Sprintf("from_data_%d_%d_%d", month, day, hour)
        err = redisCountClient.Incr(countKey).Err()
        if err != nil {
                log.Println("计数器错误:", err)
                // 处理计数器错误情况
                return err
        }
        return nil
}

func loadConfig(filename string) (map[string]map[string]string, error) {
        // 读取配置文件
        data, err := ioutil.ReadFile(filename)
        if err != nil {
                return nil, fmt.Errorf("无法读取配置文件: %s", err)
        }

        // 解析配置文件
        var config map[string]map[string]string
        err = yaml.Unmarshal(data, &config)
        if err != nil {
                return nil, fmt.Errorf("配置文件解析失败: %s", err)
        }

        return config, nil
}

步骤四 项目初始化 进行依赖 命令如下:

go mod init FormData

步骤五  项目所需要的依赖添加到go.mod  命令如下:

 go mod tidy

步骤六 先运行一下  如果不报错 在进行编译

 go run main.go

go build -o for_data # 这里重命名了

步骤七 运行  这里需要主要 端口和redis 相关配置 可以根据实际情况 修改config.yaml 。修改后重新运行即可,无需重新编译。命令如下:

直接在shell 中 运行命令

 ./form_data

 若执行不了  请注意相关权限

chmod + form_data

步骤八 请求接口,验证接口处理是否正常。

打开postman  

请求地址 http://127.0.0.1:8082/pushData

 可以观察go的后台输出 如下图所示:

关注redis  如下图所示:

  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值