Skip to content

三、整体架构 ​

本章将介绍 Kratos 的整体架构,帮助读者建立对框架的整体认知。

3.1 架构总览 ​

3.1.1 分层架构图 ​

┌─────────────────────────────────────────────────────────────────────────┐
│                              Kratos 架构                                 │
└─────────────────────────────────────────────────────────────────────────┘

                              用户代码
                                 │
                                 ▼
┌─────────────────────────────────────────────────────────────────────────┐
│                           Application 层                                  │
│                                                                         │
│    ┌─────────────────────────────────────────────────────────────┐    │
│    │                      kratos.New()                           │    │
│    │                                                             │    │
│    │   1. 创建 App                                                │    │
│    │   2. 应用配置 (Option)                                       │    │
│    │   3. 构建服务 (build)                                         │    │
│    │   4. 启动服务 (Run)                                           │    │
│    └─────────────────────────────────────────────────────────────┘    │
│                                                                         │
└─────────────────────────────────────────────────────────────────────────┘
                                 │
                                 ▼
┌─────────────────────────────────────────────────────────────────────────┐
│                           Server 层                                       │
│                                                                         │
│    ┌──────────────────┐              ┌──────────────────┐             │
│    │   HTTP Server   │              │   gRPC Server    │             │
│    │                  │              │                  │             │
│    │  - 路由 (Router) │              │  - 服务注册      │             │
│    │  - 中间件        │              │  - 拦截器        │             │
│    │  - 处理器        │              │  - 流处理        │             │
│    │  - 适配器        │              │  - 适配器        │             │
│    └──────────────────┘              └──────────────────┘             │
│                                                                         │
└─────────────────────────────────────────────────────────────────────────┘
                                 │
                                 ▼
┌─────────────────────────────────────────────────────────────────────────┐
│                         Middleware 层                                     │
│                                                                         │
│    ┌──────────┐  ┌──────────┐  ┌──────────┐  ┌──────────┐           │
│    │ Recovery │  │  Logging │  │  Tracing │  │ Validate │           │
│    │  错误恢复  │  │   日志   │  │  链路追踪 │  │   验证   │           │
│    └──────────┘  └──────────┘  └──────────┘  └──────────┘           │
│                                                                         │
│    ┌──────────┐  ┌──────────┐  ┌──────────┐                        │
│    │ Metrics  │  │  CORS    │  │  RateLim │                        │
│    │   指标   │  │  跨域    │  │   限流   │                        │
│    └──────────┘  └──────────┘  └──────────┘                        │
│                                                                         │
└─────────────────────────────────────────────────────────────────────────┘
                                 │
                                 ▼
┌─────────────────────────────────────────────────────────────────────────┐
│                          Transport 层                                      │
│                                                                         │
│    ┌──────────────────┐              ┌──────────────────┐             │
│    │   HTTP 传输      │              │   gRPC 传输      │             │
│    │                  │              │                  │             │
│    │  - net/http     │              │  - grpc/grpc    │             │
│    │  - 路由匹配     │              │  - 协议转换     │             │
│    │  - 请求解析     │              │  - 流处理       │             │
│    │  - 响应编码     │              │  - 编解码       │             │
│    └──────────────────┘              └──────────────────┘             │
│                                                                         │
└─────────────────────────────────────────────────────────────────────────┘
                                 │
                                 ▼
┌─────────────────────────────────────────────────────────────────────────┐
│                         支撑层                                            │
│                                                                         │
│    ┌──────────┐  ┌──────────┐  ┌──────────┐  ┌──────────┐           │
│    │ Registry │  │ Selector │  │ Breaker  │  │  Config  │           │
│    │ 服务注册  │  │ 负载均衡 │  │  熔断    │  │  配置    │           │
│    └──────────┘  └──────────┘  └──────────┘  └──────────┘           │
│                                                                         │
│    ┌──────────┐  ┌──────────┐  ┌──────────┐                        │
│    │   Log    │  │  Errors  │  │   Wire   │                        │
│    │   日志   │  │  错误    │  │ 依赖注入  │                        │
│    └──────────┘  └──────────┘  └──────────┘                        │
│                                                                         │
└─────────────────────────────────────────────────────────────────────────┘

3.1.2 请求处理流程 ​

HTTP/gRPC 请求
       │
       ▼
┌──────────────────┐
│  Transport Layer │  传输层:接收请求、解析数据
└────────┬─────────┘
         │
         ▼
┌──────────────────┐
│ Middleware Layer │  中间件层:日志、认证、限流等
└────────┬─────────┘
         │
         ▼
┌──────────────────┐
│   Server Layer  │  服务层:路由匹配、处理器调用
└────────┬─────────┘
         │
         ▼
┌──────────────────┐
│  Business Logic  │  业务层:具体业务逻辑
└────────┬─────────┘
         │
         ▼
┌──────────────────┐
│   Data Layer    │  数据层:数据库、缓存操作
└────────┬─────────┘
         │
         ▼
      响应返回

3.2 核心数据结构 ​

3.2.1 App 结构体 ​

go
// kratos/app.go
type App struct {
    // 上下文,用于通知退出
    ctx    context.Context
    
    // 取消函数
    cancel context.CancelFunc
    
    // 配置选项
    opts   *options
    
    // 等待组,用于等待所有服务退出
    wg     sync.WaitGroup
    
    // 互斥锁
    mu     sync.RWMutex
}

// options 包含所有可配置项
type options struct {
    // 服务器列表(HTTP、gRPC)
    servers []Server
    
    // 日志
    logger log.Logger
    
    // 名称
    name string
    
    // 版本
    version string
    
    // 元数据
    metadata map[string]string
    
    // 信号通道
    sigCh chan os.Signal
}

图解 App 结构:

┌─────────────────────────────────────────┐
│              App 结构                    │
├─────────────────────────────────────────┤
│                                         │
│  ctx: context.Context ───┐             │
│                           │             │
│  cancel: func() ──────────┼──▶ 退出控制  │
│                           │             │
│  opts: *options ──────────┼──┐          │
│                           │  │          │
│  wg: sync.WaitGroup ──────┼──┤ 同步控制  │
│                           │  │          │
│  mu: sync.RWMutex ────────┴──┴── 锁     │
│                                         │
└─────────────────────────────────────────┘
                    │
                    ▼
┌─────────────────────────────────────────┐
│           options 结构                    │
├─────────────────────────────────────────┤
│                                         │
│  servers: []Server ──→ [HTTP, gRPC]    │
│  logger: log.Logger                     │
│  name: "my-app"                         │
│  version: "v1.0.0"                       │
│  metadata: map[string]string            │
│                                         │
└─────────────────────────────────────────┘

3.2.2 Server 接口 ​

go
// server.go
type Server interface {
    // Start 启动服务
    // 启动监听,开始接受请求
    Start() error
    
    // Stop 停止服务
    // 立即停止服务
    Stop() error
    
    // GracefulStop 优雅停止
    // 等待正在处理的请求完成后停止
    GracefulStop() error
}

Server 实现类:

Server 接口
    │
    ├── HTTPServer (HTTP 服务)
    │       │
    │       ├── network: "tcp"
    │       ├── address: ":8080"
    │       ├── timeout: 1s
    │       ├── router: *Router
    │       └── middlewares: []Middleware
    │
    └── GRPCServer (gRPC 服务)
            │
            ├── network: "tcp"
            ├── address: ":50051"
            ├── timeout: 1s
            ├── server: *grpc.Server
            └── unaryInterceptors: []grpc.UnaryServerInterceptor

3.2.3 Context 结构 ​

go
// context.go
type Context struct {
    // 请求
    Request *http.Request
    ResponseWriter http.ResponseWriter
    
    // 路径参数
    params Params
    
    // 请求路径
    path string
    
    // 方法
    method string
    
    // 原始数据
    data map[string]interface{}
    
    // 错误
    err error
    
    // 链路追踪
    traceInfo *TraceInfo
}

Context 生命周期:

请求到达
    │
    ▼
┌───────────────────┐
│  NewContext()    │  创建 Context
└───────────────────┘
    │
    ├── 设置 Request/Response
    ├── 设置 Path/Method
    │
    ▼
┌───────────────────┐
│  执行中间件链     │  使用 Context 传递数据
└───────────────────┘
    │
    ├── c.Set("key", value)  // 设置值
    ├── c.Get("key")        // 获取值
    ├── c.Param("id")        // 获取路径参数
    ├── c.Query("name")     // 获取查询参数
    ├── c.Body()            // 获取请求体
    │
    ▼
┌───────────────────┐
│  返回响应         │  使用 Context 返回
└───────────────────┘
    │
    ├── c.JSON(200, data)   // JSON 响应
    ├── c.String(200, "ok") // 字符串响应
    ├── c.Error(err)       // 错误响应
    │
    ▼
    请求结束,Context 销毁

3.3 模块关系 ​

3.3.1 模块依赖图 ​

┌─────────────────────────────────────────────────────────────┐
│                    模块依赖关系                               │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│   用户代码                                                   │
│       │                                                     │
│       ▼                                                     │
│   ┌───────────────┐                                         │
│   │    App        │  ◄── 依赖 ──► options                  │
│   └───────┬───────┘                                         │
│       │   │                                                 │
│       │   ▼                                                 │
│       │ ┌───────────────┐                                   │
│       │ │    Server     │  ◄── 依赖 ──► Middleware          │
│       │ └───────┬───────┘                                   │
│       │     │   │                                           │
│       │     │   ▼                                           │
│       │     │ ┌───────────────┐                             │
│       │     │ │   Router      │  ◄── 依赖 ──► Middleware  │
│       │     │ └───────┬───────┘                             │
│       │     │     │   │                                     │
│       │     │     │   ▼                                     │
│       │     │     │ ┌───────────────┐                       │
│       │     │     │ │   Handler     │  ◄── 依赖 ──► Logic  │
│       │     │     │ └───────────────┘                       │
│       │     │     │                                         │
│       │     ▼     ▼                                         │
│       │ ┌───────────────┐                                   │
│       │ │  Transport    │  ◄── 依赖 ──► net/http, grpc   │
│       │ └───────────────┘                                   │
│       │                                                     │
│       ▼                                                     │
│   ┌───────────────┐                                         │
│   │   支撑层       │  Registry, Selector, Breaker, Config   │
│   └───────────────┘                                         │
│                                                             │
└─────────────────────────────────────────────────────────────┘

3.3.2 数据流图 ​

┌─────────────────────────────────────────────────────────────┐
│                    完整数据流                                │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│  1. 启动阶段                                                │
│     ┌──────────┐                                           │
│     │ kratos.New() │                                       │
│     └─────┬──────┘                                           │
│           │                                                 │
│           ▼                                                 │
│     ┌──────────┐                                           │
│     │ app.build() │ ──► 启动 HTTP/gRPC Server             │
│     └─────┬──────┘                                           │
│           │                                                 │
│           ▼                                                 │
│     ┌──────────┐                                           │
│     │ app.Run() │ ──► 等待信号、优雅关闭                   │
│     └──────────┘                                           │
│                                                             │
│  2. 请求阶段                                                │
│     ┌──────────┐                                           │
│     │  请求进入  │                                           │
│     └─────┬──────┘                                           │
│           │                                                 │
│           ▼                                                 │
│     ┌──────────┐                                           │
│     │ Transport │ ──► 解析请求、路由匹配                   │
│     └─────┬──────┘                                           │
│           │                                                 │
│           ▼                                                 │
│     ┌──────────┐                                           │
│     │ Middleware│ ──► 日志、认证、限流                      │
│     └─────┬──────┘                                           │
│           │                                                 │
│           ▼                                                 │
│     ┌──────────┐                                           │
│     │  Router   │ ──► 找到对应的 Handler                   │
│     └─────┬──────┘                                           │
│           │                                                 │
│           ▼                                                 │
│     ┌──────────┐                                           │
│     │  Handler  │ ──► 调用业务逻辑                          │
│     └─────┬──────┘                                           │
│           │                                                 │
│           ▼                                                 │
│     ┌──────────┐                                           │
│     │  Logic   │ ──► 访问数据库、缓存                        │
│     └─────┬──────┘                                           │
│           │                                                 │
│           ▼                                                 │
│     ┌──────────┐                                           │
│     │  响应返回  │                                           │
│     └──────────┘                                           │
│                                                             │
└─────────────────────────────────────────────────────────────┘

3.4 目录结构 ​

3.4.1 Kratos 源码目录 ​

kratos/
├── cmd/                    # 入口和工具
│   ├── kratos/            # 主程序
│   │   └── main.go
│   └── goctl/             # 代码生成工具
│       └── main.go
│
├── contrib/               # 第三方集成
│   ├── config/           # 配置中心 (Apollo, etcd, nacos)
│   ├── registry/         # 服务注册 (Consul, etcd, kubernetes)
│   ├── tracing/          # 链路追踪 (OpenTelemetry, Jaeger)
│   └── metrics/          # 监控 (Prometheus)
│
├── errors/                # 错误处理
│   └── errors.go
│
├── examples/              # 示例代码
│   ├── http/
│   ├── grpc/
│   └── middleware/
│
├── log/                   # 日志
│   └── log.go
│
├── metadata/              # 元数据
│   └── metadata.go
│
├── middleware/           # 中间件
│   ├── recovery/         # 错误恢复
│   ├── logging/          # 日志
│   ├── tracing/          # 链路追踪
│   ├── validate/         # 参数验证
│   └── ... (更多中间件)
│
├── registry/              # 服务注册发现
│   ├── consul/
│   ├── etcd/
│   └── kubernetes/
│
├── router/                # 路由
│   └── router.go
│
├── selector/              # 负载均衡
│   ├── random/
│   ├── roundrobin/
│   └── weighted/
│
├── transport/             # 传输层
│   ├── grpc/
│   │   ├── server.go
│   │   ├── client.go
│   │   └── ...
│   └── http/
│       ├── server.go
│       ├── client.go
│       └── ...
│
├── util/                  # 工具函数
│   ├── context/
│   ├── reflect/
│   └── ...
│
├── version/               # 版本信息
│   └── version.go
│
└── wire/                  # 依赖注入
    └── wire.go

3.4.2 典型项目结构 ​

myapp/
├── api/                   # Protobuf 定义
│   └── user/
│       └── v1/
│           ├── user.proto
│           └── user.pb.go
│
├── cmd/                   # 入口
│   └── user-api/
│       └── main.go
│
├── configs/              # 配置文件
│   └── user-api.yaml
│
├── internal/             # 内部包
│   ├── config/          # 配置定义
│   │   └── config.go
│   ├── handler/         # HTTP 处理
│   │   ├── user.go
│   │   └── routes.go
│   ├── logic/           # 业务逻辑
│   │   └── user.go
│   ├── model/           # 数据模型
│   │   └── user.go
│   ├── server/          # 服务器配置
│   │   └── server.go
│   ├── service/         # 服务实现
│   │   └── user.go
│   ├── svc/             # 服务上下文
│   │   └── service.go
│   └── types/           # 类型定义
│       └── types.go
│
├── third_party/          # 第三方 proto
│   └── google/
│
├── go.mod
└── go.sum

3.5 本章小结 ​

┌─────────────────────────────────────────────────────────────┐
│                      本章总结                                │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│  ✓ Kratos 采用分层架构                                       │
│     └── Application → Server → Middleware → Transport      │
│                                                             │
│  ✓ 核心数据结构:App、Server、Context                        │
│                                                             │
│  ✓ 模块之间通过接口解耦                                     │
│                                                             │
│  ✓ 典型的项目结构便于团队协作                                │
│                                                             │
└─────────────────────────────────────────────────────────────┘

下章预告 ​

下一章我们将学习启动流程详解,深入分析 Kratos 是如何启动的。

敬请期待!