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

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

环境:

go

version go1.22.0 linux/amd64

 平台  linux X64

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

mkdir FormData

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

#开启的端口
server:port: 8082# 存储数据数据
redis_mq:host: 127.0.0.1port: 6379password:db: 2queue_key_name: data_listredis_count:host: 127.0.0.1port: 6379password:db: 2

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

package mainimport ("fmt""github.com/gin-gonic/gin""github.com/go-redis/redis""gopkg.in/yaml.v3""io/ioutil""log""strconv""sync""time"
)var (redisClient      *redis.ClientredisCountClient *redis.Clientmutex            sync.Mutexwg               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]stringerr = 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.gogo 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.hqwc.cn/news/529543.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Websocket在Asp.net webApi(.net framework)上的应用

之前在写看板部分的web api的时候,都是通过Ajax在规定时间内轮询调用web api,这样简单省事,但是当看板多了(并发量上来)以后,比较消耗服务器的性能,所以最近研究了websocket,希望使用…

【数据结构】哈希

在一个数据序列中查找某一个数据元素,是数据管理时经常涉及的,通常以比较的方式来完成,典型的案例有无序序列的暴力查找(O(N))、有序序列的二分查找(O(logN))、平衡搜索树(O(logN)&a…

IOT的发展历程及其优势——青创智通

工业互联网-物联网-设备改造-IOT-青创智通 ​随着科技的不断发展,物联网(IoT)已经逐渐成为了我们生活中不可或缺的一部分。IoT是指通过互联网将各种物理设备连接起来,实现设备之间的数据交换和智能化控制。IoT的发展不仅改变了我们…

信息系统三级等保安全解决方案(46页Word)

1、系统定级与安全域 2、实施方案设计 3、安全防护体系建设规划 软件开发全系资料分享下载:软件项目开发全套文档下载_软件开发文档下载-CSDN博客

使用python将数据输出为图表图片

数据示例(数组或其他): hourly_data {00:00: 10,01:00: 15,02:00: 20,03:00: 25,04:00: 30,# 添加更多数据... }示例输出(图片): python代码: 下面代码中使用了matplotlib库,如果…

【CSP】2022-03-3 计算资源调度器 stl大模拟使用map优化索引 完整思路+完整的写代码过程(遇到的问题)+完整代码

2022-03-3 计算资源调度器 stl大模拟使用map优化索引 2022-03-3 计算资源调度器 stl大模拟使用map优化索引思路写代码的过程(遇到的问题)完整代码 2022-03-3 计算资源调度器 stl大模拟使用map优化索引 在联系了之前那么多道stl大模拟题后,终…

案例分析篇05:数据库设计相关28个考点(9~16)(2024年软考高级系统架构设计师冲刺知识点总结系列文章)

专栏系列文章推荐: 2024高级系统架构设计师备考资料(高频考点&真题&经验)https://blog.csdn.net/seeker1994/category_12601310.html 【历年案例分析真题考点汇总】与【专栏文章案例分析高频考点目录】(2024年软考高级系统架构设计师冲刺知识点总结-案例分析篇-…

【组合递归回溯】【StringBuilder】Leetcode 17. 电话号码的字母组合

【组合递归回溯】【StringBuilde】Leetcode 17. 电话号码的字母组合 StringBulider常用方法!!!!!!!!!!!!!!17…

Python3虚拟环境之virtualenv

virtualenv 在开发Python应用程序的时候,系统安装的Python3只有一个版本:3.7。所有第三方的包都会被pip安装到Python3的site-packages目录下。 如果要同时开发多个应用程序,这些应用程序都会共用一个Python,就是安装在系统的Pyt…

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

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

ORACLE RAC数据库压力测试(swingbench)

------------------------------------------------------------------- 欢迎关注作者 墨天伦:潇湘秦的个人主页 - 墨天轮 CSDN:潇湘秦-CSDN博客 公众号:潇湘秦的DBA之路 ------------------------------------------------------------------- 为了验证跑在虚拟机上的or…

Day31-计算机基础1

Day31-计算机基础1 1. 网络基础介绍1.1 什么是网络?1.2 为什么要有网络?1.3 运维人员需要学习哪些网络知识?1.4 按作用范围对网络分类 2.网络设备知识2.1 网络传输介质及传输信号2.2 网卡设备2.3 中继器(RP repeater)2…