当前位置: 首页 > news >正文

【Golang】gin框架动态更新路由

目录

  • 1、背景
  • 2、gin框架下载
  • 3、代码示例
    • 【1】定义可动态更新的http处理器
    • 【2】定义初始化和更新的回调函数
    • 【3】使用方法

1、背景

运行一个http服务通常需要两步,第一步是注册路由,第二步是启动服务。当我们发送一个http请求时,启动服务内部会处理我们的请求,通过路由匹配找到对应的回调函数来执行,有的业务场景可能需要路由对应的整个回调函数因为某种情况整个逻辑都变化,接下来我们就来提供一种更新路由对应的回调函数的示例。

2、gin框架下载

go get -u github.com/gin-gonic/gin

3、代码示例

【1】定义可动态更新的http处理器

//用于动态更新回调函数
type DynamicHandler struct {handler http.Handler  //http处理器lock    sync.RWMutex  //保证更新http处理器接口时的并发安全
}//处理http请求
func (d *DynamicHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {d.lock.RLock()defer d.lock.RUnlock()d.handler.ServeHTTP(w, r) //真正处理http请求的地方
}func (d *DynamicHandler) Update(h http.Handler) {d.lock.Lock()defer d.lock.Unlock()d.handler = h //更新http处理器
}

【2】定义初始化和更新的回调函数

//初始化的回调函数
func initialHandler() http.Handler {return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {_, _ = w.Write([]byte(fmt.Sprintf("init time:%s", time.Now().Format("2006-01-02 15:04:05"))))})
}//更新之后的回调函数
func newHandler() http.Handler {return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {_, _ = w.Write([]byte(fmt.Sprintf("udpate time:%s", time.Now().Format("2006-01-02 15:04:05"))))})
}

【3】使用方法

func main() {r := gin.New()//初始化回调函数dh := &DynamicHandler{handler: initialHandler()} r.GET("/xxx", func(c *gin.Context) {dh.ServeHTTP(c.Writer, c.Request)})go func() {time.Sleep(60 * time.Second)//60秒之后更新回调函数dh.Update(newHandler())}()r.Run(":9999")
}

运行服务端程序之后,手动curl一下接口控制台输出:

$ curl http://127.0.0.1:9999/xxx
init time:2025-05-09 14:54:03

60秒之后再次手动curl一下控制台输出:

$ curl http://127.0.0.1:9999/xxx
udpate time:2025-05-09 14:55:20
http://www.dtcms.com/a/180980.html

相关文章:

  • WebRTC流媒体传输协议RTP点到点传输协议介绍,WebRTC为什么使用RTP协议传输音视频流?
  • 电压取样端口静电浪涌防护方案 之6TS Series瞬态抑制器TVS
  • 2025年社交APP安全防御指南:抵御DDoS与CC攻击的实战策略
  • 【免杀】C2免杀 | 概念篇
  • Python 爬虫基础入门教程(超详细)
  • 2025数字孪生技术全景洞察:从工业革命到智慧城市的跨越式发展
  • 进入虚拟机单用户模式(Linux系统故障排查)
  • Vscode 顶部Menu(菜单)栏消失如何恢复
  • Java——反射
  • 操作系统 == 内存管理
  • FAISS 与机器学习、NLP 的关系
  • android-ndk开发(11): 安装 repo 命令
  • 一场陟遐自迩的 SwiftUI + CoreData 性能优化之旅(下)
  • YOLOv1模型架构、损失值、NMS极大值抑制
  • auto推导类型原则
  • 2025数维杯数学建模竞赛B题完整参考论文(共38页)(含模型、代码、数据)
  • 如何优化系统启动时间--基于米尔瑞萨MYD-YG2LX开发板
  • LeetCode百题刷001双指针·快慢指针
  • Kaggle图像分类竞赛实战总结详细代码解读
  • 图像来源:基于协同推理的双视角超声造影分类隐式数据增强方法|文献速递-深度学习医疗AI最新文献
  • 插槽、生命周期
  • RabbitMQ消息的重复消费问题如何解决?
  • 港大今年开源了哪些SLAM算法?
  • Cluster Interconnect in Oracle RAC
  • 一些模型测试中的BUG和可能解决方法
  • PostgreSQL逻辑复制(logic replication)
  • [AI ][Dify] Dify Tool 插件调试流程详解
  • 浅聊大模型-有条件的文本生成
  • 具身智能时代的机器人导航和操作仿真器综述
  • MySQL数据库故障排查与解决方案