[zeromicro/go-zero]支持内置中间件的自定义(移除内置中间件)

2024-03-08 621 views
9
现状
  • 内置的中间件无法删除(中间件只能添加不能删)

    func (s *engine) bindRoute(fr featuredRoutes, router httpx.Router, metrics *stat.Metrics,
    route Route, verifier func(chain alice.Chain) alice.Chain) error {
    chain := alice.New(
        handler.TracingHandler,
        s.getLogHandler(),
        handler.MaxConns(s.conf.MaxConns),
        handler.BreakerHandler(route.Method, route.Path, metrics),
        handler.SheddingHandler(s.getShedder(fr.priority), metrics),
        handler.TimeoutHandler(time.Duration(s.conf.Timeout)*time.Millisecond),
        handler.RecoverHandler,
        handler.MetricHandler(metrics),
        handler.PromethousHandler(route.Path),
        handler.MaxBytesHandler(s.conf.MaxBytes),
        handler.GunzipHandler,
    )
    chain = s.appendAuthHandler(fr, chain, verifier)
    
    for _, middleware := range s.middlewares {
        chain = chain.Append(convertMiddleware(middleware))
    }
    handle := chain.ThenFunc(route.Handler)
    
    return router.Handle(route.Method, route.Path, handle)
    }
  • 某些场景下需要能够删除一些内置的中间件。举个例子:在内置的DetailedLogHandler或者LogHandler中间件无法满足业务需求的情况下,我会自己实现一个LogHandler并注入到go-zero框架,那么在功能上就会和内置的LogHandler重叠并且存在不必要的性能损耗。

回答

7

怎么自定义呢?提个解决方法讨论下哈

5

可以借鉴下gin框架的Blank Gin的做法,提供另外一个函数来创建一个空白的server,由用户根据自身需要手工注入中间件。

5

+1, 希望能支持移除内置中间件功能

5

+1 现在的搞得太死了 中间件集成太死板