当前位置: 首页 > 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.xdnf.cn/news/363817.html

相关文章:

  • C++--NULL和nullptr的区别
  • ATH12K 驱动框架
  • ch09 题目参考思路
  • 不黑文化艺术学社首席艺术家孙溟㠭浅析“雪渔派”
  • AI赋能智能客服革新:R²AIN SUITE 如何破解医疗行业服务难题?
  • 哈希表扩容怎么处理新插入的值?Swift 是怎么做的?
  • 力扣-19.删除链表的倒数第N个结点
  • Nacos源码—Nacos配置中心实现分析
  • Mysql数据库进阶
  • LMMSE、MMSE和LS
  • vscode 配置doxygen注释和snippet
  • RT-Thread 深入系列 Part 1:RT-Thread 全景总览
  • 【赛元8523触摸按键开发调试】
  • 【vue3】vue3中封装懒加载指令
  • C++ Lambda表达式详解:匿名函数的艺术与现代编程实践
  • 数字经济时代下的消费行为变迁与经济学启示
  • 解决 Redis 缓存与数据库一致性问题的技术指南
  • 【Linux网络】Socket-TCP相关函数
  • 大模型提示词策略
  • 赋能智能交通:时空图卷积网络引领速度预测新变革
  • PostgreSQL技术大讲堂 - 第89讲:重讲数据库完全恢复
  • 图解gpt之Seq2Seq架构与序列到序列模型
  • 【某OTA网站】phantom-token 1004
  • vue 监听元素大小变化 element-resize-detector
  • 《Vuejs与实现》第 6 章(原始值响应式方案)
  • 蓝桥杯青少 图形化编程(Scratch)编程题每日一练——图形特效
  • 嵌套路由~
  • leetcode - 双指针问题
  • Linux C语言线程编程入门笔记
  • uni-app 中的条件编译与跨端兼容