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

news2024/12/27 12:55:20

功能:这里主要编写一个接口,将其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  如下图所示:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1508078.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Linux】Linux上的一些软件安装与环境配置(Centos7配置JDK、Hadoop)

文章目录 安装JDK配置环境变量1. 卸载已安装的JDK查询已安装的 jdk 列表删除已经安装的 jdk 2. 上传安装包3. 创建 /usr/local/java 文件夹4. 将 jdk 压缩包解压到 /usr/local/java 目录下5. 配置 jdk 的环境变量6. 让配置文件生效7. 校验8.拍个快照吧,免得后面哪里…

2024 年系统规划与管理师(全套资料)

2024年11月系统规划与管理师全套视频、历年真题及解析、章节分类真题及解析、论文写作及范文、教材、模拟题、答题卡等资料 1、2023年5月、2022年5月、2021年5月、2020年5月四套基础精讲视频,案例分析及论文答题套路视频讲解。 2、系统规划与管理师2017-2023年真题…

【go语言开发】redis简单使用

本文主要介绍redis安装和使用。首先安装redis依赖库,这里是v8版本;然后连接redis,完成基本配置;最后测试封装的工具类 文章目录 安装redis依赖库连接redis和配置工具类封装代码测试 欢迎大家访问个人博客网址:https://…

labview的常用小技巧

1.切换:labview中控件函数与函数选板的使用非常频繁,而使用菜单来调用他们非常不方便。最简单的调用方法是:右击前面板,弹出控件选板;右击程序框图,弹出函数选板。然后按住CtrlE组合键,即可快速…

工业数据采集网关的功能与应用-天拓四方

工业数据采集网关是一种专门用于采集、处理、传输工业现场数据的设备。它能够实时收集来自各种传感器、仪表和设备的数据,并通过网络将这些数据传输到云端或数据中心。同时,数据采集网关还具备数据清洗、转换和压缩等功能,确保数据的质量和传…

MySQL将两条记录根据相同条件合并

知识点:在MySQL中,可以使用GROUP BY子句和聚合函数如CONCAT或CONCAT_WS来将多条记录基于相同条件合并为一条记录 【主要是GROUP_CONCAT这个函数的运用】 例如将员工信息表中相同门店的员工信息合并为一条记录 MySQL语句如下: SELECT dept_…

一文读懂:公网IP地址证书

公网IP证书是一种SSL证书,用于验证和确认特定的公网IP地址是否实际属于申请者。如果验证通过,证书颁发机构将向该IP地址持有人颁发一个以IP地址为主题的SSL证书。使用公网IP证书可以有效提升IP身份的辨识度,减少网站链接被假冒的风险&#xf…

建模杂谈系列237 使用FSM进行状态管理

说明 使用FSM来对状态的变化进行管理,一方面有助于我们将问题定义的更清晰,同时也让程序设计更可靠、可读性(事后)更强。 内容 1 问题描述 假设有一笔投资用于证券交易,随着交易、市场价格变化,投资的状态也随之改变。我们需要…

巫蛊之祸——汉武帝后期的一次重大事件

引 言 “巫蛊之祸”是汉武帝在位后期发生的一次重大政治事件,也是西汉历史上最大的冤案,此案导致皇后卫子夫和太子刘据自杀,数万人头落地,几十万人被牵连。 一、巫蛊之术的由来 《汉书》记载,巫蛊之术起源自胡巫&am…

解决Iterm2升级后遇到“Stashed changes“的问题

<<<<<<< Updated upstream ...... >>>>>>> Stashed changes冲突标记符的代码如题,最近有升级Item2…

ROS的消息发布者与订阅者示例

前言 Topic话题,是节点之间信息交换的方法,在向话题发生送消息的节点叫做发布者,接收消息的节点叫做订阅者。 一个ROS程序中话题可以有很多个,一个话题中也可以有多个发布者和订阅者。一个订阅者可以订阅多个话题。同样 &#xff…

Linux 地址空间

目录 一、程序地址空间 1、虚拟地址 Makefile新写法 2、进程地址空间分布 3、栈&堆 4、static修饰局部变量 5、字符串常量不可修改 6、虚拟地址与物理地址的联系 二、CPU读取程序全过程 1、形成可执行程序 2、生成虚拟地址 3、程序的启动 4、创建进程 5、地…

MyBatis-Plus生成sql语句时怎么知道表名和表的字段名,表的主键名的

MyBatis-Plus通过反射获取实体类的信息。 实体类的类名驼峰转下划线为表名 实体类的属性名驼峰转下划线为字段名 表的主键名默认为id selectById就是基于这个id,select 查询字段 from user where id ? 自定义告诉mybatisplus数据库的表名&#xff0c…

SpringMVC10、拦截器

10、拦截器 10.1、概述 SpringMVC的处理器拦截器类似于Servlet开发中的过滤器Filter,用于对处理器进行预处理和后处理。开发者可以自己定义一些拦截器来实现特定的功能。 过滤器与拦截器的区别:拦截器是AOP思想的具体应用。 过滤器 servlet规范中的一部分&…

AWS Database Migration Service 助力数据库搬迁

在业务出海的过程中,少不了的就是云迁移,但在云迁移的过程中其中最重要的一环就是数据库。通常迁移的成功就取决于数据,如果应用成功搬迁,数据库没过来也是无用功。因此如何快速、安全的进行数据库搬迁也成为一大难题。九河云公司…

8.5 Springboot项目实战 Redis缓存热点数据

文章目录 前言一、缓存与数据库一致性二、Repository层 -- Cache Aside模式实操BookRepositoryBookRepositoryImpl2.1 查询2.2 修改2.3 删除2.4 扩展Mapper修改三、Service层调用修改四、测试前言 前两文我们讲解了如何在SpringBoot中整合Redis,接下来我们将进行

智慧水务大数据,信息化云平台建设,综合运营管理平台

一、水务信息化的建设方向 1、完善基础设施构建软件定义的数据中心 基础设施,建设新一代软件定义的数据中心;逐步整合水务和海洋资源、统一、规范化各业务系统,按照一体化、一站式的服务进行建设。 2、整合信息资源建立智慧决策体系 统一信息采集方式,…

STM32CubeIDE基础学习-STM32CubeIDE软件工程文件拷贝粘贴

STM32CubeIDE基础学习-STM32CubeIDE软件工程文件拷贝粘贴 前言 在后面开发程序时,往往不需要再重新新建工程的了,可以直接在原有的工程基础上直接复制粘贴新增功能就可以了。 具体的操作方法步骤如下介绍: 第一步:找到一个原有的…

中医中的虚是什么?虚的分类?如何治疗气虚?

目录 中医中虚的分类气虚(此处指脾气虚)症状舌象:舌头中间区域有裂痕 或者 舌胖有齿痕身体上 解决方法其它脏腑气虚的情况及解决方法 血虚津液不足阴虚阳虚 中医中虚的分类 图片来源于微信视频的名为 路广林主任 的视频。 气虚(此…

九州金榜|孩子厌学怎么引导?

孩子在成长的过程中,尤其在上学的时候,孩子出现厌学情绪这是非常常见的事情,当孩子出现厌学情绪时,家长要采取什么样的方法才能帮助孩子找回学习兴趣和动力呢?九州金榜家庭教育给出建议,首先父母不应该过于…