golang java 中间件_Go middleware中间件

本文从实际业务开发场景出发,探讨了在Go语言中如何使用中间件来处理常见需求,如记录请求耗时、对接监控系统等。通过引入中间件的概念,解释了如何避免代码重复,保持业务代码与非业务代码的分离。同时,文章还介绍了Go的Gin框架中的中间件使用方式,并展示了其简洁优雅的实现。通过对Gin中间件的分析,揭示了其实现原理。最后,讨论了如何利用中间件技术改进现有的Go Web框架。
摘要由CSDN通过智能技术生成

先从业务开发角度出发,来逐渐引出中间件。

一、刚开始时业务开发

开始业务开发时,业务需求比较少。

当我们最开始进行业务开发时,需求不是很多。 第一个需求产是品向大家打声招呼:“hello world”。

接到需求任务,我们就进行代码开发了。

一般都会写下如下的代码,用handlefunc来处理请求的服务

package main

import (

"net/http"

)

func helloHandler(w http.ResponseWriter, r *http.Request) {

w.Write([]byte("hello world"))

}

func main() {

http.HandleFunc("/", helloHandler)

http.ListenAndServe(":8080", nil)

}

假如现在业务有变化了,我们要新增一个hello服务的处理耗时,怎么做?

这个需求比较简单,修改代码如下:

package main

import (

"log"

"net/http"

"os"

"time"

)

var logger = log.New(os.Stdout, "", 0)

func helloHandler(w http.ResponseWriter, r *http.Request) {

timeStart := time.Now()

w.Write([]byte("hello world"))

timeElapsed := time.Since(timeStart)

logger.Println(timeElapsed)

}

func main() {

http.HandleFunc("/", helloHandler)

http.ListenAndServe(":8080", nil)

}

这样就可以输出当前hello请求到日志文件了。

完成了这个需求后。过了没多久,又有新的需求来了,我们要显示信息,显示Email,

显示好朋友,并且这就一个接口也需要增加耗时记录。

一下子又增加了很多api, 简略示例代码如下:

package main

func helloHandler(wr http.ResponseWriter, r *http.Request) {

// ...

}

func showInfoHandler(wr http.ResponseWriter, r *http.Request) {

// ...

}

func showEmailHandler(wr http.ResponseWriter, r *http.Request) {

// ...

}

func showFriendsHandler(wr http.ResponseWriter, r *http.Request) {

timeStart := time.Now()

wr.Write([]byte("your friends is tom and alex"))

timeElapsed := time.Since(timeStart)

logger.Println(timeElapsed)

}

func main() {

http.HandleFunc("/", helloHandler)

http.HandleFunc("/info/show", showInfoHandler)

http.HandleFunc("/email/show", showEmailHandler)

http.HandleFunc("/friends/show", showFriendsHandler)

// ...

}

每一个handler里面都需要记录运行的时间,每次新加路由都要写同样的代码。都要把业务逻辑代码拷贝过来。

业务继续发展,又有了新的需求,增加一个监控系统,需要你上报接口运行时间到监控系统里面,以便监控接口的稳定性。这个监控系统叫metrics。

好了,现在你又要修改代码,通过http post方式把耗时时间发送给metrics系统。

而且你要修改好多个handler,增加metrics上报接口代码。

修改代码:

func helloHandler(wr http.ResponseWriter, r *http.Request) {

timeStart := time.Now()

wr.Write([]byte("hello"))

timeElapsed := time.Since(timeStart)

logger.Println(timeElapsed)

// 新增耗时上报

metrics.Upload("timeHandler", timeElapsed)

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值