Easy-Go-Web3
知识图谱Go 教程React Web3智能合约
需求分析系统设计设计模式Go 微服务
项目实战DevOps
Go 生态React 生态智能合约生态Web3 生态AI × Web3工具箱Web3 公司远程Web3求职
🎯 AA 工程师面试手册博客
GitHub
返回设计模式
结构型

中间件模式

通过层层包装为请求处理添加横切关注点。

问题场景

需要在请求处理前后执行通用逻辑,如日志、认证、限流。

解决方案

定义中间件函数签名,链式组合处理器。

Go 实现

middleware.go
go
1type Handler func(ctx context.Context, req *Request) (*Response, error)
2
3type Middleware func(Handler) Handler
4
5// 日志中间件
6func LoggingMiddleware(next Handler) Handler {
7 return func(ctx context.Context, req *Request) (*Response, error) {
8 start := time.Now()
9 resp, err := next(ctx, req)
10 log.Printf("method=%s duration=%v err=%v", req.Method, time.Since(start), err)
11 return resp, err
12 }
13}
14
15// 认证中间件
16func AuthMiddleware(next Handler) Handler {
17 return func(ctx context.Context, req *Request) (*Response, error) {
18 if !verifySignature(req) {
19 return nil, ErrUnauthorized
20 }
21 return next(ctx, req)
22 }
23}
24
25// 组合中间件
26func Chain(h Handler, middlewares ...Middleware) Handler {
27 for i := len(middlewares) - 1; i >= 0; i-- {
28 h = middlewares[i](h)
29 }
30 return h
31}
32
33// 使用
34handler := Chain(businessHandler,
35 LoggingMiddleware,
36 AuthMiddleware,
37 RateLimitMiddleware,
38)

Web3 应用场景

API 网关的请求处理链,包含签名验证、Gas 估算、Nonce 管理。

优点

  • +关注点分离
  • +可复用
  • +易于测试

缺点

  • -调用链长时调试困难
函数选项模式策略模式
Easy-Go-Web3

构建 Go 后端与 Web3 的学习之路。从基础到进阶,从理论到实践,助你成为全栈区块链开发者。

学习路径

  • 知识图谱
  • Go 教程
  • Go 微服务
  • 面试手册

资源中心

  • 工具箱
  • DevOps 工具
  • Web3 生态
  • 博客

© 2025 Easy-Go-Web3. All rights reserved.

Created withbyhardybao