Gone v2 Gin 组件,在gin中使用依赖注入

项目地址:https://github.com/gone-io/gone

原文地址:https://github.com/gone-io/goner/blob/main/gin/README.md

Gone v2 Gin 组件,在gin中使用依赖注入

文章目录

  • Gone v2 Gin 组件,在gin中使用依赖注入
    • 功能特性
    • 安装
    • 快速开始
      • 1. 基础路由
      • 2. HTTP 参数注入
      • 3.直接返回数据,不需要调用`context.Success`
    • 中间件使用
      • 1. 系统中间件
      • 2. 自定义中间件
    • SSE(Server-Sent Events)
    • 配置说明
      • 服务器基础配置
      • 日志配置
      • 限流配置
      • 健康检查与追踪配置
      • 代理与响应配置
    • 最佳实践

gone-gin 是一个基于 gin-gonic/gin 的 Web 框架封装,为 Gone 框架提供 HTTP 服务支持。它提供了路由管理、中间件处理、HTTP 注入、SSE(Server-Sent Events)等功能,使得在 Gone 框架中开发 Web 应用更加便捷。

功能特性

  • 完整的路由管理
  • 灵活的中间件支持
  • HTTP 参数注入
  • SSE(Server-Sent Events)支持
  • 统一的错误处理
  • 请求限流
  • 健康检查
  • 请求/响应日志记录
  • 分布式追踪支持

安装

go get github.com/gone-io/goner/gin

快速开始

1. 基础路由

package mainimport ("github.com/gone-io/gone/v2""github.com/gone-io/goner""github.com/gone-io/goner/gin"
)type HelloController struct {gone.Flaggin.IRouter `gone:"*"` // 注入路由器
}// Mount 实现 gin.Controller 接口
func (h *HelloController) Mount() gin.MountError {h.GET("/hello", h.hello) // 注册路由return nil
}func (h *HelloController) hello() (string, error) {return "Hello, Gone!", nil
}func main() {gone.Load(&HelloController{}).Loads(goner.GinLoad).Serve()
}

2. HTTP 参数注入

详细说明请参考 HTTP 注入说明

type UserRequest struct {ID        int64  `http:"param=id"` // 路径参数Name      string `http:"query=name"` // 查询参数Token     string `http:"header=token"` // 请求头SessionID string `http:"cookie=session-id"` // CookieData      User   `http:"body"` // 请求体
}type UserController struct {gone.Flaggin.IRouter `gone:"*"`http.HttInjector `gone:"http"`
}func (u *UserController) Mount() gin.MountError {u.POST("/users/:id", u.createUser)return nil
}func (u *UserController) createUser(req UserRequest) error {// req 中的字段会自动从 HTTP 请求中注入return nil
}

3.直接返回数据,不需要调用context.Success

中间件使用

1. 系统中间件

系统已内置了一些常用中间件,包括:

  • 请求日志记录
  • 限流
  • 健康检查
  • 分布式追踪

2. 自定义中间件

type CustomMiddleware struct {gone.Flag
}func (m *CustomMiddleware) Process(ctx *gin.Context) {// 前置处理ctx.Next()// 后置处理
}

SSE(Server-Sent Events)

支持服务器发送事件:

// SSEController 是一个示例控制器,展示如何使用channel返回SSE流
type SSEController struct {gone.Flaggone.Logger `gone:"gone-logger"`router gin.IRouter `gone:"*"`
}// Mount 实现Controller接口,挂载路由
func (c *SSEController) Mount() gin.GinMountError {// 注册路由c.router.GET("/api/sse/events", c.streamEvents)return nil
}// streamEvents 返回一个channel,系统会自动将其转换为SSE流
func (c *SSEController) streamEvents() (<-chan any, error) {// 创建一个channel用于发送事件ch := make(chan any)// 启动一个goroutine来发送事件go func() {defer close(ch) // 确保在函数结束时关闭channel// 发送10个事件for i := 1; i <= 10; i++ {// 创建事件数据eventData := map[string]any{"id":      i,"message": fmt.Sprintf("这是第%d个事件", i),"time":    time.Now().Format(time.RFC3339),}// 发送事件到channelch <- eventData// 每秒发送一个事件time.Sleep(1 * time.Second)}// 发送一个错误事件示例ch <- gone.NewParameterError("这是一个错误事件示例")// 等待一秒后结束time.Sleep(1 * time.Second)}()return ch, nil
}

配置说明

服务器基础配置

# 服务器基本配置
server.port=8080                     # 服务器端口,默认8080
server.host=0.0.0.0                  # 服务器主机地址,默认0.0.0.0
server.mode=release                  # 服务器模式,可选:debug, release, test,默认release
server.max-wait-before-stop=5s       # 服务器关闭前最大等待时间,默认5秒
server.network=tcp                   # 服务器网络类型,默认tcp
server.address=                      # 服务器地址,格式为host:port,如果设置了此项,则忽略host和port
server.html-tpl-pattern=             # HTML模板文件匹配模式,用于加载HTML模板

日志配置

# 日志配置
server.log.format=console                # 日志格式,默认console
server.log.show-request-time=true        # 是否显示请求时间,默认true
server.log.show-request-log=true         # 是否显示请求日志,默认true
server.log.data-max-length=0             # 日志数据最大长度,0表示不限制,默认0
server.log.request-id=true               # 是否记录请求ID,默认true
server.log.remote-ip=true                # 是否记录远程IP,默认true
server.log.request-body=true             # 是否记录请求体,默认true
server.log.user-agent=true               # 是否记录User-Agent,默认true
server.log.referer=true                  # 是否记录Referer,默认true
server.log.show-response-log=true        # 是否显示响应日志,默认true# 请求体日志内容类型配置
server.log.show-request-body-for-content-types=application/json;application/xml;application/x-www-form-urlencoded# 响应体日志内容类型配置
server.log.show-response-body-for-content-types=application/json;application/xml;application/x-www-form-urlencoded

限流配置

# 限流配置
server.req.enable-limit=false        # 是否启用请求限流,默认false
server.req.limit=100                 # 每秒请求限制数,默认100
server.req.limit-burst=300           # 突发请求限制数,默认300
server.req.x-request-id-key=X-Request-Id  # 请求ID的Header键名
server.req.x-trace-id-key=X-Trace-Id      # 追踪ID的Header键名

健康检查与追踪配置

# 健康检查
server.health-check=/health          # 健康检查路径,默认为/health# 追踪配置
server.use-tracer=true               # 是否使用追踪,默认true
server.is-after-proxy=false          # 是否在代理后面,默认false

代理与响应配置

# 代理统计
server.proxy.stat=false              # 是否启用代理统计,默认false# 响应包装
server.return.wrapped-data=true      # 是否包装响应数据,默认true

最佳实践

  1. 路由管理

    • 按业务模块划分控制器
    • 使用路由分组管理相关接口
    • 合理使用 HTTP 方法(GET、POST、PUT、DELETE 等)
  2. 参数注入

    • 合理使用 HTTP 注入标签(param、query、header、cookie、body)
    • 一个请求只能注入一次 body
    • 为注入的参数添加验证规则
  3. 错误处理

    • 使用 gone.Error 统一处理错误
    • 在中间件中统一处理异常
    • 为不同类型的错误定义清晰的错误码
  4. 性能优化

    • 合理配置限流参数
    • 适当配置日志级别
    • 使用连接池管理资源

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

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

相关文章

JVM内存结构笔记03-方法区

文章目录 方法区1.定义2.组成方法区与永久代和元空间的关系为什么要将永久代 (PermGen) 替换为元空间 (MetaSpace) 呢? 3.方法区常用参数4.运行时常量池常量池运行时常量池定义查看class文件 方法区 1.定义 方法区属于是 JVM 运行时数据区域的一块逻辑区域&#xff0c;是各个…

数据库语句

环境变量path下的目录是系统目录。 #include <iostream> #include <mysql.h> #pragma comment(lib,"libmysql.lib")//链接libmysql.dll动态库的中间桥 // MYSQL* conn;//数据库句柄。后面还有网络句柄&#xff08;用来网络收发数据&#xff09; bool co…

Word 小黑第15套

对应大猫16 修改样式集 导航 -查找 第一章标题不显示 再选中文字 点击标题一 修改标题格式 格式 -段落 -换行和分页 勾选与下段同页 添加脚注 &#xff08;脚注默认位于底部 &#xff09;在脚注插入文档属性&#xff1a; -插入 -文档部件 -域 类别选择文档信息&#xff0c;域…

【从零开始学习计算机科学】编译原理(七)运行时刻环境

【从零开始学习计算机科学】编译原理(七)运行时刻环境 运行时刻环境存储组织空间的栈式分配活动树活动记录和控制栈简单栈式存贮分配C语言的过程调用和过程返回时的存贮管理堆式存储分配堆式存储分配的功能垃圾回收基于跟踪的垃圾回收短停顿垃圾回收运行时刻环境 存储组织 …

一维下料之 *贪心算法* —— CAD c#二次开发

一维下料之贪心算法&#xff0c;需求如下 已知条件 我们有一批长度为 380 米 的原材料&#xff08;例如钢管、木材等&#xff09;。 切割需求 需要从这些原材料中切割出以下长度的小段&#xff1a;42 米&#xff1a;需要 13 段 140米&#xff1a;需要 23 段 130 米&#xff1a…

刷leetcode hot100--动态规划3.12

第一题乘积max子数组[1h] emmmm感觉看不懂题解 线性dp【计划学一下acwing&#xff0c;挨个做一下】 线性动态规划 相似题解析 最长上升子序列 最大上升子序列和 最大连续子段和 乘积最大子数组_哔哩哔哩_bilibili 比较奇怪的就是有正负数和0&#xff0c;如何处理&#xff1f…

Linux安装升级docker

Linux 安装升级docker Linux 安装升级docker背景升级停止docker服务备份原docker数据目录移除旧版本docker安装docker ce恢复数据目录启动docker参考 安装找到docker官网找到docker文档删除旧版本docker配置docker yum源参考官网继续安装docker设置开机自启配置加速测试 Linux …

pycharm + anaconda + yolo11(ultralytics) 的视频流实时检测,保存推流简单实现

目录 背景pycharm安装配置代码实现创建本地视频配置 和 推流配置视频帧的处理和检测框绘制主要流程遇到的一些问题 背景 首先这个基于完整安装配置了anaconda和yolo11的环境&#xff0c;如果需要配置开始的话&#xff0c;先看下专栏里另一个文章。 这次的目的是实现拉取视频流…

LLM:了解大语言模型

大型语言模型&#xff08;Large language models&#xff0c;LLMs&#xff09;&#xff0c;如 OpenAI 的 ChatGPT &#xff0c;或者 DeepSeek 等&#xff0c;是过去几年中开发出来的深度神经网络模型。它们为自然语言处理&#xff08;natural language processing&#xff0c;N…

Linux多进程学习

一、什么是多进程 1.多任务程序能够同时做多件事情&#xff0c;如QQ同时聊天和上传下载。 2.多任务程序在应用开发中非常普遍&#xff0c;是必须掌握的基本概念。 二、进程的创建与资源分配 1.操作系统在创建进程时会分配内存资源、CPU资源和时间片。 2.进程的内容包括代码、…

「Unity3D」UGUI将元素固定在,距离屏幕边缘的某个比例,以及保持元素自身比例

在不同分辨率的屏幕下&#xff0c;UI元素按照自身像素大小&#xff0c;会发生位置与比例的变化&#xff0c;本文仅利用锚点&#xff08;Anchors&#xff09;使用&#xff0c;来实现UI元素&#xff0c;固定在某个比例距离的屏幕边缘。 首先&#xff0c;将元素的锚点设置为中心&…

STM32 内置的通讯协议

数据是以帧为单位发的 USART和UART的区别就是有没有同步功能 同步是两端设备有时钟连接&#xff0c;异步是没时钟连接&#xff0c;靠约定号的频率&#xff08;波特率&#xff09;接收发送数据 RTS和CTS是用来给外界发送已“可接收”或“可发送”信号的&#xff0c;一般用不到…

C语言实现队列数据结构:思路与代码详解

目录 一、引言 二、整体思路 三、代码模块分析 &#xff08;一&#xff09;头文件包含与宏定义 &#xff08;二&#xff09;数据类型定义 &#xff08;三&#xff09;队列操作函数 1. 队列初始化 2. 队列销毁 3. 入队操作 4. 出队操作 5. 获取队头元素 6…

商业智能BI的未来,如何看待AI+BI这种模式?

昨天在和一位朋友线上聊天的时候&#xff0c;提了一个问题&#xff0c;你是如何看待AI&#xff08;人工智能&#xff09;BI&#xff08;商业智能&#xff09;这种模式和方向的&#xff0c;我大概来说一下我个人的看法。 以我在商业智能BI项目中接触到的行业和企业&#xff0c;…

如何制作Windows系统盘、启动盘?(MediaCreationTool_22H2)

文章目录 每日一句正能量前言一、准备工作二、制作启动盘后记 每日一句正能量 每个在你生命里出现的人&#xff0c;都有原因。喜欢你的人给你温暖关心。你喜欢的人让你学会爱和付出&#xff0c;不喜欢你的人让你自省成长。你不喜欢的人教会你宽容尊重&#xff0c;没有人是偶然出…

DataWhale 大语言模型 - 语言模型发展历程

大语言模型 LLMBook 项目背景 本课程围绕中国人民大学高瓴人工智能学院赵鑫教授团队出品的《大语言模型》书籍展开&#xff0c;覆盖大语言模型训练与使用的全流程&#xff0c;从预训练到微调与对齐&#xff0c;从使用技术到评测应用&#xff0c;帮助学员全面掌握大语言模型的…

C#带有设备仿真功能串口调试助手

本文档介绍一种方法,可以用来仿真串口设备。这样调试PLC程序时可以在没有仪器时用于测试程序的运行。详细代码见: https://download.csdn.net/download/qq_34047402/90477066 C#带有设备仿真功能串口调试助手资源-CSDN文库 步骤如下: 1.把串口设备接收和发送仿真数据放到一…

本地部署 OpenManus 保姆级教程(Windows 版)

一、环境搭建 我的电脑是Windows 10版本&#xff0c;其他的没尝试&#xff0c;如果大家系统和我的不一致&#xff0c;请自行判断&#xff0c;基本上没什么大的出入啊。 openManus的Git地址&#xff1a;https://github.com/mannaandpoem/OpenManus 根据官网的两种安装推荐方式如…

01 | Go 项目开发极速入门课介绍

提示&#xff1a; 所有体系课见专栏&#xff1a;Go 项目开发极速入门实战课。 你好&#xff0c;欢迎学习本课程。本课程是一个 Go 项目开发极速入门课程。旨在帮助刚学习完 Go 基础语法的 Go 开发者&#xff0c;快速掌握如何开发一个功能相对全面的 Go 项目。 根据课程设计目标…

使用 Elastic-Agent 或 Beats 将 Journald 中的 syslog 和 auth 日志导入 Elastic Stack

作者&#xff1a;来自 Elastic TiagoQueiroz 我们在 Elastic 一直努力将更多 Linux 发行版添加到我们的支持矩阵中&#xff0c;现在 Elastic-Agent 和 Beats 已正式支持 Debian 12&#xff01; 本文演示了我们正在开发的功能&#xff0c;以支持使用 Journald 存储系统和身份验…