使用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.mzph.cn/news/736809.shtml

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

相关文章

当金蝶遇上BI,马上就能看到数据可视化效果

最近整理咨询内容时发现,很多企业用户在咨询时都会问是否有行业案例,究其原因时他们没用过BI数据分析,不知道BI可以做什么,能做到什么地步。其实,要知道这些东西还不简单,只需要注册奥威BI软件,…

TransNeXt:ViT的鲁棒Foveal视觉感知

文章目录 摘要1、引言2、相关工作3、方法3.1、聚合像素焦点注意力3.1.1、像素焦点注意力3.1.2、在单个混合器中聚合不同的注意力3.1.3、克服多尺度图像输入3.1.4、特征分析3.2、卷积门控单元(Convolutional GLU)3.2.1、动机3.2.2、重新思考通道混合器设计3.3、TransNeXt的架构…

CleanMyMac X 4.14.1中文版功能介绍及激活入口

细心的用户发现苹果Mac电脑越用越慢,其实这种情况是正常的,mac电脑用久了会产生很多的缓存文件,如果不及时清理会影响运行速度。macbook就会产生各种各样的垃圾文件,比如说残留的注册表或者无效的注册表,系统碎片以及毫无用处的文件等,这些的…

防御保护--第七次作业

题目 要求 在FW5和FW3之间建立一条IPSEC通道,保证10.0.2.0/24网段可以正常访问到192.168.1.0/24 过程 FW5 FW3

Cesium--基于材质旋转图片

材质部分的代码如下 // 自定义材质const customMaterial new Cesium.Material({translucent: true,fabric: {uniforms: {image:circle_img,speed:30.0,},source: czm_material czm_getMaterial(czm_materialInput materialInput){czm_material material czm_getDefaultMateri…

Oracle Foreign key 无索引导致的死锁 deadlock 或者hang

---------------lock 死锁通常发生在主表和子表更新主外键上。更新主表的主键,那么子表的外键会被锁住 如果删除主表的行,那么子表会被锁住。 create table p(x int primary key); create table c( x references p); insert into p values(1); insert …

Flink读取iceberg表

1. 添加依赖包 这里使用的版本时1.14.6&#xff0c;scala版本是2.12. <dependency><groupId>org.apache.iceberg</groupId><artifactId>iceberg-flink-runtime-1.14</artifactId></dependency><dependency><groupId>org.apac…

Python之Web开发中级教程----搭建Web框架一

准备环境&#xff1a;ubuntu,Python3.6.9 一、Web应用程序的原理 接收并解析HTTP请求&#xff0c;获取客户的请求信息->处理完成请求的业务逻辑->返回处理结果HTTP响应。 Web框架的架构是这样的&#xff1a; 基于python的web框架&#xff0c;如tornado、flask、webpy都是…

谈软件的模块间依赖关系

一、什么是软件的模块间依赖关系 1.1、定义 软件的模块间依赖关系指的是在软件系统中&#xff0c;各个模块或组件之间的相互依赖和关联。这种依赖关系可以是直接的&#xff0c;也可以是间接的。具体来说&#xff0c;当一个模块需要调用另一个模块的功能、使用其数据或与其进行…

matlab去除图片上的噪声

本问题来自CSDN-问答板块,题主提问。 如何利用matlab去除图片上的噪声? 一、运行效果图 左边是原图,右边是去掉噪音后的图片。 二、中文说明 中值滤波是一种常见的图像处理技术,用于去除图像中的噪声。其原理如下: 1. 滤波器移动:中值滤波器是一个小的窗口,在图像上移…

SpringBoot中事务

SpringBoot中事务 需要的依赖 <dependencies><!--spring jdbc Spring 持久化层支持jar包--><dependency><groupId>org.springframework</groupId><artifactId>spring-jdbc</artifactId><version>6.0.2</version><…

python处理csv文件

1.使用 csv_writer.writerow # 导入CSV安装包 import csv# 1. 创建文件对象 f open(文件名.csv,a,encodingutf-8)# 2. 基于文件对象构建 csv写入对象 csv_writer csv.writer(f)# 3. 构建列表头 csv_writer.writerow(["问题","答案"])list_name[] # 4. 写…

Android中View对象的实例化方式

Android中View对象的实例化&#xff0c;主要有以下四种方式&#xff1a; &#xff08;1&#xff09;使用findViewById根据resId实例化View或者ViewGroup对象。 这种方式在根据xml生成View或ViewGroup对象时被普遍使用。不过&#xff0c;这种方式也存在较大限制&#xff0c;要求…

raid0、raid1、raid5、raid10选哪个?一文给你答案!

下午好&#xff0c;我的网工朋友。 关于磁盘阵列的用法&#xff0c;总有朋友对其用途与功能一知半解&#xff0c;很容易弄混。 而我们在做监控项目存储时&#xff0c;经常会用到磁盘阵列。 什么是磁盘阵列&#xff1f;为什么要做磁盘阵列&#xff1f;用什么样的磁盘阵列合适…

Buildroot 之一 详解源码及架构

在之前的博文中,我们学习了直接通过 Makefile 手动来进行构建 U-Boot 和 Linux Kernel 等,其实,目前存在多种嵌入式 Linux 环境的构建工具,其中,Buildroot 就是被广泛应用的一种。今天就来详细学习一个 Buildroot 这个自动化构建工具。 Buildroot Buildroot 是一个运行于…

Jenkins Pipeline实现Golang项目的CI/CD

Jenkins Pipeline实现Golang项目的CI/CD 背景 最近新增了一个Golang实现的项目&#xff0c;需要接入到现有的流水线架构中。 流程图 这边流程和之前我写过的一篇《基于Jenkins实现的CI/CD方案》差不多&#xff0c;不一样的是构建现在是手动触发的&#xff0c;没有配置webho…

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

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

Window10数据库崩溃启动失败,MySQL8.0.30通过data文件夹恢复数据库到Docker

背景&#xff1a; 昨天关机前还在使用mysql&#xff0c;一切正常&#xff0c;但今天打开电脑&#xff0c;发现mysql启动不起来了&#xff0c;老是提示端口占用&#xff0c;但是系统也没有新安装什么软件&#xff0c;而且通过查询nat命令也没发现3306端口占用。而且修改成3307等…

组态软件的概念

一、前言 组态软件是一种用于设计、配置和管理自动化系统的软件。它可以帮助用户快速地创建和修改自动化系统的界面、逻辑和通信功能&#xff0c;从而提高生产效率和质量。 二、组态软件的定义 组态软件是一种集成开发环境&#xff0c;用于设计、配置和管理自动化系统。它通…

ReentrantReadWriteLock学习

简介 ReentrantReadWriteLock 是 Java 并发包&#xff08;java.util.concurrent.locks&#xff09;中的一个类&#xff0c;它实现了一个可重入的读写锁。读写锁允许多个线程同时读取共享资源&#xff0c;但在写入共享资源时只允许一个线程进行。这种锁机制特别适用于读多写少的…