Skip to content

五、HTTP Server 详解 ​

本章将详细介绍 Kratos 中 HTTP Server 的创建、启动和配置。

5.1 HTTP Server 创建 ​

5.1.1 创建示例 ​

go
// 创建 HTTP Server
server := http.NewServer(
    http.Address(":8080"),
    http.Middleware(
        recovery.Recovery(),  // 错误恢复中间件
        logging.Server(),      // 日志中间件
    ),
)

5.1.2 Server 结构 ​

go
// http/server.go
type Server struct {
    // 网络配置
    network string
    address string
    timeout time.Duration
    
    // 中间件
    middlewares []Middleware
    
    // 路由
    router *Router
    
    // HTTP 服务器
    server *http.Server
    
    // 日志
    logger log.Logger
}

图解 HTTP Server:

┌─────────────────────────────────────────────────────────────┐
│                    HTTPServer 结构                          │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│  network: "tcp"                                            │
│  address: ":8080"                                          │
│  timeout: 1s                                               │
│                                                             │
│  ┌─────────────────────────────────────────────────────┐   │
│  │  middlewares: []Middleware                           │   │
│  │  ┌──────────┐ ┌──────────┐ ┌──────────┐           │   │
│  │  │Recovery  │ │Logging   │ │Tracing   │  ...      │   │
│  │  └──────────┘ └──────────┘ └──────────┘           │   │
│  └─────────────────────────────────────────────────────┘   │
│                                                             │
│  ┌─────────────────────────────────────────────────────┐   │
│  │  router: *Router                                    │   │
│  │  ┌─────────────────────────────────────────────┐  │   │
│  │  │  trees: map[string]*node                       │  │   │
│  │  │  GET  → /api/user/*                          │  │   │
│  │  │  POST → /api/user/*                          │  │   │
│  │  │  PUT  → /api/user/*                          │  │   │
│  │  │  DELETE → /api/user/*                        │  │   │
│  │  └─────────────────────────────────────────────┘  │   │
│  └─────────────────────────────────────────────────────┘   │
│                                                             │
│  ┌─────────────────────────────────────────────────────┐   │
│  │  server: *http.Server                               │   │
│  │  Addr: ":8080"                                     │   │
│  │  Handler: router                                    │   │
│  │  ReadTimeout: 1s                                    │   │
│  │  WriteTimeout: 1s                                   │   │
│  └─────────────────────────────────────────────────────┘   │
│                                                             │
└─────────────────────────────────────────────────────────────┘

5.2 HTTP Server 启动 ​

5.2.1 Start() 源码 ​

go
// http/server.go
func (s *Server) Start() error {
    // 1. 创建路由
    s.router = NewRouter(s.opts)
    
    // 2. 注册路由(通过 Option 传入)
    for _, f := range s.opt.funcs {
        f(s.router)
    }
    
    // 3. 创建 HTTP 服务器
    s.server = &http.Server{
        Addr:         s.address,
        Handler:       s.router,
        ReadTimeout:   s.timeout,
        WriteTimeout:  s.timeout,
    }
    
    // 4. 监听端口
    ln, err := net.Listen(s.network, s.address)
    if err != nil {
        return err
    }
    
    // 5. 启动服务
    go func() {
        if err := s.server.Serve(ln); err != nil {
            // 处理错误
        }
    }()
    
    return nil
}

5.2.2 启动流程图解 ​

server.Start()
        │
        ▼
┌───────────────────┐
│  1. 创建路由      │  s.router = NewRouter()
└───────────────────┘
        │
        ▼
┌───────────────────┐
│  2. 注册路由      │  for f in funcs: f(router)
└───────────────────┘
        │
        ▼
┌───────────────────┐
│  3. 创建 Server  │  s.server = &http.Server{...}
└───────────────────┘
        │
        ▼
┌───────────────────┐
│  4. 监听端口      │  net.Listen("tcp", ":8080")
└───────────────────┘
        │
        ▼
┌───────────────────┐
│  5. 启动服务      │  go server.Serve(ln)
└───────────────────┘

5.3 Server 选项 ​

5.3.1 常用选项 ​

go
// 网络配置
http.Network("tcp")
http.Address(":8080")
http.Timeout(time.Second)

// 中间件
http.Middleware(
    recovery.Recovery(),
    logging.Server(),
    tracing.Server(),
)

// 路由选项
http.Filter(func(h http.Handler) http.Handler {
    return h
})

// CORS
http.CORS(
    func(header http.Header) {
        header.Set("Access-Control-Allow-Origin", "*")
    },
)

5.3.2 选项模式 ​

Kratos 使用选项模式来配置 Server:

go
// 选项定义
type Option func(*Server)

// 示例选项
func Address(addr string) Option {
    return func(s *Server) {
        s.address = addr
    }
}

func Middleware(m ...Middleware) Option {
    return func(s *Server) {
        s.middlewares = append(s.middlewares, m...)
    }
}

// 使用选项
http.NewServer(
    Address(":8080"),
    Middleware(recovery.Recovery()),
)

5.4 本章小结 ​

┌─────────────────────────────────────────────────────────────┐
│                      本章总结                                │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│  ✓ HTTP Server 是 Kratos 的核心组件之一                     │
│                                                             │
│  ✓ 包含路由、中间件、HTTP 服务器等组件                      │
│                                                             │
│  ✓ 使用选项模式进行配置                                     │
│                                                             │
│  ✓ 启动流程:创建路由 → 注册路由 → 启动监听                 │
│                                                             │
└─────────────────────────────────────────────────────────────┘

下章预告 ​

下一章我们将学习 路由系统详解。

敬请期待!