程序员的快乐如此简单

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: 程序员的快乐如此简单

最近在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

相关实践学习
日志服务之数据清洗与入湖
本教程介绍如何使用日志服务接入NGINX模拟数据,通过数据加工对数据进行清洗并归档至OSS中进行存储。
相关文章
|
2月前
|
网络协议 Java 程序员
一文聊聊程序员的痛楚与磨难选择
对于还没有完整读过源码的小伙伴,本文建议的源码阅读方式,不妨尝试下。从你准备开始阅读源码,你会发现,要做的事情太多了,不过一步一个脚印,你会发现,付出是值得的。
一文聊聊程序员的痛楚与磨难选择
|
10月前
|
设计模式 程序员 API
程序员有哪些约定俗成的“码德”?
工作中,你是否遇到过不守“码徳”的程序员,他们的代码从来不讲究规范性。比如不规范命名,直接用a、b、c等字母来命名,回溯代码总会一头雾水;比如调用API时,不讲究入参结构一致,出参结构一致,在编写调用API的SDK时,麻烦重重。本期就来讨论下,程序员有哪些约定俗称的“码徳”。
53 1
|
9月前
|
程序员 Go 定位技术
程序员如何走向世界!
程序员如何走向世界!
32 0
|
前端开发 程序员 C#
水瓶座的回顾-高贵的程序员
水瓶座的回顾-高贵的程序员
96 0
|
程序员
程序员如何保护自己的那点东西
  程序员工作几年之后,总会有点自己的东西,比如类库、自定义控件、框架、平台,或者是某种编程思想。那么如何保护自己多年来琢磨出来的东东呢?   答案就是知识产权!   知识产权包含很多方面,版权和专利是其中比较重要的两个部分。
1141 0
|
架构师 Java 程序员
其实,咱们程序员过了30岁,还可以更牛逼!
程序员干到30岁,好不容易从码奴混到了白领,却再也干不动了,还时时面临失业的危险。30岁,是一个程序员伤不起的年龄。明天,何去何从? 一.30岁现象 在官场上,曾经有一个59岁现象,就是官员们会在59岁时,会使劲捞上一把。
1347 0
|
架构师 Java 程序员
程序员如何在百忙之中不走岔路,不白忙!
程序员忙,似乎是个公论,有些程序员甚至会认为,不忙的程序员无法快速地进步,从而会落伍。或者说,不忙的程序员有可能被公司末尾淘汰掉。对此,一直危机感很重的我深以为然。
1037 0
|
程序员
为什么要选择做一名程序员?
从这篇文章开始准备做一个大学生学编程系列文章,主要帮助一些还在编程路上徘徊的小伙伴,作为一个过来人的身份总结一些编程经验以及心得,在自学的过程中走了很多的弯路,在此通过这个专栏分享给需要编程的小伙伴。
2051 0