程序员的快乐如此简单

简介: 程序员的快乐如此简单

最近在GitHub上发起了一个关于Beego框架的小插件的开源仓库,这一举动虽然看似微小,但其中的快乐和意义却是无法用言语表达的。

Beego是一个开源的Go语言Web框架,它采用了MVC架构模式,并集成了很多常用的功能和中间件。小插件是指与Beego框架配套使用的、可扩展的、独立的软件模块或组件。通过开发小插件,可以扩展Beego框架的功能,提高开发效率和代码可维护性。

Beego-Requestid是一种中间件(Middleware),用于在处理HTTP请求时,为每个请求生成一个唯一的ID,并将其附加到请求上下文中。这样,您可以在应用程序的其他地方方便地访问这个唯一的请求ID,从而更好地跟踪和调试应用程序。

使用RequestId中间件可以帮助您解决以下问题:

  1. 跟踪请求:通过在每个请求中添加唯一的ID,您可以轻松地在应用程序中跟踪请求的来源和路径。这对于调试和性能优化非常有用。
  2. 日志记录:您可以使用请求ID将日志记录与特定请求关联起来。这样,当您在日志中查找特定请求的信息时,可以更方便地定位相关的日志条目。
  3. 错误处理:如果应用程序中出现错误,请求ID可以帮助您识别是哪个请求引发了错误。这对于故障排查和问题报告非常有帮助。
代码

话不多说直接看源码:

package beego_requestid
import (
  "github.com/beego/beego"
  "github.com/beego/beego/context"
  "github.com/google/uuid"
)
const DefaultHeaderReqIdKey = "X-Request-Id"
type Option func(config *Config)
type GenRequestIdFunc func() string
type Config struct {
  genRequestIdFunc               GenRequestIdFunc
  headerReqIdKey, customReqIdKey string
}
func NewFilter(opts ...Option) beego.FilterFunc {
  cnf := &Config{
    genRequestIdFunc: DefaultGenRequestIdFunc,
    headerReqIdKey:   DefaultHeaderReqIdKey,
  }
  for _, opt := range opts {
    opt(cnf)
  }
  return func(c *context.Context) {
    reqId := c.Request.Header.Get(cnf.headerReqIdKey)
    if reqId == "" {
      reqId = cnf.genRequestIdFunc()
      c.Request.Header.Add(cnf.headerReqIdKey, reqId)
    }
    if cnf.customReqIdKey != "" {
      c.Input.SetData(cnf.customReqIdKey, reqId)
    }
  }
}
func WithGenRequestIdFunc(genFunc GenRequestIdFunc) Option {
  return func(config *Config) {
    config.genRequestIdFunc = genFunc
  }
}
func WithHeaderReqIdKey(key string) Option {
  return func(config *Config) {
    config.headerReqIdKey = key
  }
}
func WithCustomReqIdKey(key string) Option {
  return func(config *Config) {
    config.customReqIdKey = key
  }
}
func DefaultGenRequestIdFunc() string {
  return uuid.NewString()
}

使用示例:

package main
import (
  "log"
  "time"
  "github.com/spf13/cast"
  "github.com/beego/beego"
  "github.com/beego/beego/context"
  beego_requestid "github.com/ibarryyan/beego-requestid"
)
func example1() {
  beego.InsertFilter("/*", beego.BeforeRouter, beego_requestid.NewFilter())
  beego.Get("/hello", func(c *context.Context) {
    reqId := c.Request.Header.Get("X-Request-Id")
    log.Printf("reqestid = %s", reqId)
    _, _ = c.ResponseWriter.Write([]byte("hello..."))
    return
  })
  beego.Run(":9900")
}
func example2() {
  beego.InsertFilter("/*", beego.BeforeRouter, beego_requestid.NewFilter(
    beego_requestid.WithGenRequestIdFunc(func() string {
      return cast.ToString(time.Now().Unix())
    }),
    beego_requestid.WithHeaderReqIdKey("my_header_reqid"),
    beego_requestid.WithCustomReqIdKey("my_reqid"),
  ))
  beego.Get("/hello", func(c *context.Context) {
    reqId := c.Request.Header.Get("my_header_reqid")
    log.Printf("reqestid = %s", reqId)
    cReqId := c.Input.GetData("my_reqid")
    log.Printf("my reqestid = %s", cReqId)
    _, _ = c.ResponseWriter.Write([]byte("hello..."))
    return
  })
  beego.Run(":9900")
}

此外,前端请求时需要带上header key要与后端的一致

获得快乐

发完代码后我就直接去Beego的GitHub仓库下提了一个issue,来分享的研究的中间件,地址:https://github.com/beego/beego/issues/5419,后来没想到竟然收到了回复,哈哈哈

然后我立马就去新的issue分享了我的插件

https://github.com/beego/beego/issues/5421

再后来,我就有两个star了~

仓库地址

https://github.com/ibarryyan/beego-requestid

相关实践学习
【涂鸦即艺术】基于云应用开发平台CAP部署AI实时生图绘板
【涂鸦即艺术】基于云应用开发平台CAP部署AI实时生图绘板
相关文章
|
设计模式 算法 程序员
这些Coding套路你不会还不知道吧?
这些Coding套路你不会还不知道吧?
200 0
|
缓存 Shell Windows
GoLand破解安装激活2022-09-07最新教程(附破解工具及激活码)
本文讲的是GoLand破解、GoLand激活码、GoLand安装、GoLand永久激活码的最新永久激活教程,本文有mac和windows系统的Rider安装教程。
31653 1
GoLand破解安装激活2022-09-07最新教程(附破解工具及激活码)
|
消息中间件 JSON Java
Springboot支付宝沙箱支付---完整详细步骤
Springboot支付宝沙箱支付---完整详细步骤
2765 1
|
消息中间件 测试技术 领域建模
DDD - 一文读懂DDD领域驱动设计
DDD - 一文读懂DDD领域驱动设计
45354 6
|
前端开发 JavaScript Java
SpringBoot+MyBatisPlus+Vue+ElementUI实现前后端分离的物业管理系统
🍅程序员小王的博客:程序员小王的博客 🍅 欢迎点赞 👍 收藏 ⭐留言 📝 🍅 如有编辑错误联系作者,如果有比较好的文章欢迎分享给我,我会取其精华去其糟粕 😊 如果需要源码,扫描主页左侧二维码,加我微信 一起学习、一起进步 🍅java自学的学习路线:java自学的学习路线
1835 0
SpringBoot+MyBatisPlus+Vue+ElementUI实现前后端分离的物业管理系统
|
SQL JSON Java
知识分享之Golang——在Goland中快速基于JSON或SQL创建struct
知识分享之Golang篇是我在日常使用Golang时学习到的各种各样的知识的记录,将其整理出来以文章的形式分享给大家,来进行共同学习。欢迎大家进行持续关注。 知识分享系列目前包含Java、Golang、Linux、Docker等等。
626 0
知识分享之Golang——在Goland中快速基于JSON或SQL创建struct
|
运维 数据可视化 中间件
一文搞懂SaaS、PaaS、IaaS的概念和异同
一文搞懂SaaS、PaaS、IaaS的概念和异同
66207 6
一文搞懂SaaS、PaaS、IaaS的概念和异同
|
安全 程序员 索引
SegmentFault: 聪明的黑客都在这里
作为一名“福布斯中国30位30岁以下创业者”,有时候,SegmentFault创始人高阳比他的创业项目更加受人关注。 他是一名90后创业者,没有接受过完整的大学教育,但已经拥有了3年工作经验和2两年的创业经验。他17岁开始接触互联网,22岁就拥有了自己的第一家公司,并且在24岁时成为“福布斯中国30位30岁以下创业者”。他退过学、上过班、创过业,拥有在物流、游戏、媒体、投资行业的跨界经验。
555 0
SegmentFault: 聪明的黑客都在这里
|
存储 机器学习/深度学习 人工智能
三项最高级认证,两项创新技术、两大优秀案例,阿里云亮相云原生产业大会
6 月 15 日,2022 年云原生产业大会在京召开。凭借在云原生领域的创新技术积累与充分的客户服务经验,阿里云拿下三项专业能力最高级认证:云原生技术架构成熟度-国内唯一全域最高级,云原生安全成熟度-国内唯一全域最高级,服务网格平台性能-先进级。
三项最高级认证,两项创新技术、两大优秀案例,阿里云亮相云原生产业大会

热门文章

最新文章