fengling-gateway/.planning/codebase/STRUCTURE.md
2026-02-28 15:44:16 +08:00

18 KiB
Raw Blame History

YARP Gateway 目录结构文档

1. 目录布局

fengling-gateway/
├── .planning/                          # 规划文档目录
│   └── codebase/                       # 代码库分析文档
│       ├── ARCHITECTURE.md             # 架构文档
│       └── STRUCTURE.md                # 本文档
│
├── src/                                # 源代码目录
│   ├── Config/                         # 配置类和提供者
│   ├── Controllers/                    # API 控制器
│   ├── Data/                           # 数据访问层
│   ├── DynamicProxy/                   # YARP 动态代理
│   ├── LoadBalancing/                  # 负载均衡策略
│   ├── Migrations/                     # 数据库迁移
│   ├── Metrics/                        # 监控指标
│   ├── Middleware/                     # 中间件
│   ├── Models/                         # 数据模型
│   ├── Properties/                     # 项目属性
│   ├── Services/                       # 业务服务
│   ├── Program.cs                      # 程序入口
│   ├── YarpGateway.csproj              # 项目文件
│   ├── appsettings.json                # 配置文件
│   └── appsettings.Development.json    # 开发环境配置
│
└── (根目录其他文件)

2. 详细目录说明

2.1 Config/ - 配置层

路径: src/Config/

用途: 存放配置模型和配置提供者

文件 行数 用途
JwtConfig.cs 10 JWT 认证配置模型,包含 Authority、Audience 等属性
RedisConfig.cs 9 Redis 连接配置模型,包含连接字符串、数据库索引等
ConfigNotifyChannel.cs 7 PostgreSQL NOTIFY 通道名称常量定义
DatabaseRouteConfigProvider.cs 84 从数据库加载路由配置,转换为 YARP RouteConfig
DatabaseClusterConfigProvider.cs 100 从数据库加载集群配置,管理服务实例列表

设计特点:

  • 配置类使用 POCO 模型,通过 Options 模式注入
  • Provider 类使用单例模式,支持热重载

2.2 Controllers/ - 控制器层

路径: src/Controllers/

用途: RESTful API 端点

文件 行数 路由前缀 用途
GatewayConfigController.cs 489 /api/gateway 网关配置管理 API
PendingServicesController.cs 210 /api/gateway/pending-services 待处理服务管理 API

GatewayConfigController 端点:

方法 路由 功能
GET /tenants 获取租户列表(分页)
GET /tenants/{id} 获取单个租户
POST /tenants 创建租户
PUT /tenants/{id} 更新租户
DELETE /tenants/{id} 删除租户
GET /routes 获取路由列表(分页)
GET /routes/global 获取全局路由
GET /routes/tenant/{tenantCode} 获取租户路由
POST /routes 创建路由
PUT /routes/{id} 更新路由
DELETE /routes/{id} 删除路由
GET /clusters 获取集群列表
GET /clusters/{clusterId} 获取集群详情
POST /clusters 创建集群
DELETE /clusters/{clusterId} 删除集群
GET /clusters/{clusterId}/instances 获取实例列表
POST /clusters/{clusterId}/instances 添加实例
DELETE /instances/{id} 删除实例
POST /config/reload 重载配置
GET /config/status 获取配置状态
GET /config/versions 获取版本信息
GET /stats/overview 获取统计概览

PendingServicesController 端点:

方法 路由 功能
GET / 获取待处理服务列表
GET /{id} 获取待处理服务详情
POST /{id}/assign 分配服务到集群
POST /{id}/reject 拒绝服务
GET /clusters 获取可用集群列表

2.3 Data/ - 数据访问层

路径: src/Data/

用途: Entity Framework Core 数据库上下文

文件 行数 用途
GatewayDbContext.cs 142 EF Core 数据库上下文,包含实体配置和变更通知
GatewayDbContextFactory.cs 23 设计时 DbContext 工厂,用于迁移命令

DbContext 特性:

  • 自动检测配置变更
  • 集成 PostgreSQL NOTIFY 机制
  • 支持软删除IsDeleted 标记)
  • 版本号追踪Version 字段)

2.4 DynamicProxy/ - 动态代理层

路径: src/DynamicProxy/

用途: YARP 动态配置提供

文件 行数 用途
DynamicProxyConfigProvider.cs 79 实现 IProxyConfigProvider整合路由和集群配置

核心职责:

  • 实现 YARP 配置提供接口
  • 协调 Route 和 Cluster 配置
  • 提供配置变更通知(通过 CancellationToken

2.5 LoadBalancing/ - 负载均衡层

路径: src/LoadBalancing/

用途: 自定义负载均衡策略

文件 行数 用途
DistributedWeightedRoundRobinPolicy.cs 244 基于 Redis 的分布式加权轮询策略

策略特点:

  • 策略名称: DistributedWeightedRoundRobin
  • 支持实例权重配置
  • Redis 分布式状态存储
  • 降级策略(锁获取失败时)

2.6 Migrations/ - 数据库迁移

路径: src/Migrations/

用途: Entity Framework Core 迁移文件

文件 用途
20260201120312_InitialCreate.cs 初始数据库创建
20260201133826_AddIsGlobalToTenantRoute.cs 添加 IsGlobal 字段
20260222134342_AddPendingServiceDiscovery.cs 添加待处理服务发现表
*ModelSnapshot.cs 当前模型快照
*.Designer.cs 设计器生成文件

2.7 Metrics/ - 监控指标

路径: src/Metrics/

用途: OpenTelemetry 指标定义

文件 行数 用途
GatewayMetrics.cs 31 定义网关监控指标

指标列表:

  • gateway_requests_total - 请求总数计数器
  • gateway_request_duration_seconds - 请求延迟直方图

2.8 Middleware/ - 中间件层

路径: src/Middleware/

用途: ASP.NET Core 中间件

文件 行数 用途
JwtTransformMiddleware.cs 84 JWT Token 解析,提取租户信息注入请求头
TenantRoutingMiddleware.cs 64 租户路由解析,根据路径查找目标集群

中间件执行顺序:

CORS -> JwtTransformMiddleware -> TenantRoutingMiddleware -> YARP

2.9 Models/ - 数据模型层

路径: src/Models/

用途: 实体类定义

文件 行数 用途
GwTenant.cs 16 租户实体
GwTenantRoute.cs 20 路由配置实体
GwServiceInstance.cs 19 服务实例实体
GwPendingServiceDiscovery.cs 28 待处理服务发现实体 + 状态枚举

实体通用字段:

  • Id - 主键(雪花 ID 格式)
  • Status - 状态1=启用)
  • CreatedBy/UpdatedBy - 操作人
  • CreatedTime/UpdatedTime - 时间戳
  • IsDeleted - 软删除标记
  • Version - 版本号(乐观锁)

2.10 Services/ - 服务层

路径: src/Services/

用途: 业务逻辑和后台服务

文件 行数 类型 用途
RouteCache.cs 139 Singleton 路由缓存,支持租户路由和全局路由
RedisConnectionManager.cs 139 Singleton Redis 连接管理,分布式锁实现
PgSqlConfigChangeListener.cs 223 HostedService PostgreSQL 配置变更监听
KubernetesPendingSyncService.cs 162 HostedService Kubernetes 服务发现同步

服务生命周期:

  • Singleton: RouteCache, RedisConnectionManager状态服务
  • HostedService: PgSqlConfigChangeListener, KubernetesPendingSyncService后台任务

3. 关键文件位置

3.1 入口文件

文件 路径 用途
Program.cs src/Program.cs 应用程序入口,服务注册和中间件配置

3.2 配置文件

文件 路径 用途
appsettings.json src/appsettings.json 生产环境配置
appsettings.Development.json src/appsettings.Development.json 开发环境配置
YarpGateway.csproj src/YarpGateway.csproj 项目文件,包引用

3.3 数据库相关

文件 路径 用途
GatewayDbContext.cs src/Data/GatewayDbContext.cs 数据库上下文
GatewayDbContextFactory.cs src/Data/GatewayDbContextFactory.cs 迁移工具工厂

4. 命名约定

4.1 文件命名

类型 命名规则 示例
实体类 Gw 前缀 + PascalCase GwTenant.cs, GwTenantRoute.cs
配置类 *Config 后缀 JwtConfig.cs, RedisConfig.cs
提供者 *Provider 后缀 DatabaseRouteConfigProvider.cs
中间件 *Middleware 后缀 JwtTransformMiddleware.cs
控制器 *Controller 后缀 GatewayConfigController.cs
服务 功能描述 + 类型 RouteCache.cs, PgSqlConfigChangeListener.cs
策略 *Policy 后缀 DistributedWeightedRoundRobinPolicy.cs

4.2 命名空间

YarpGateway                    # 根命名空间
├── Config                     # 配置相关
├── Controllers                # API 控制器
├── Data                       # 数据访问
├── DynamicProxy               # 动态代理
├── LoadBalancing              # 负载均衡
├── Metrics                    # 监控指标
├── Middleware                 # 中间件
├── Models                     # 数据模型
└── Services                   # 业务服务

4.3 接口命名

类型 命名规则 示例
服务接口 I 前缀 IRouteCache, IRedisConnectionManager
DTO 类 *Dto 后缀 CreateTenantDto, CreateRouteDto
请求类 *Request 后缀 AssignServiceRequest

5. 模块组织

5.1 分层架构

┌─────────────────────────────────────────────────────────────┐
│                    Presentation Layer                        │
│  ┌─────────────────┐    ┌─────────────────────────────────┐ │
│  │   Middleware    │    │         Controllers             │ │
│  │  - JWT 解析     │    │  - GatewayConfigController      │ │
│  │  - 租户路由     │    │  - PendingServicesController    │ │
│  └─────────────────┘    └─────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────┘
                              │
                              ▼
┌─────────────────────────────────────────────────────────────┐
│                    Business Logic Layer                      │
│  ┌─────────────────┐    ┌─────────────────────────────────┐ │
│  │    Services     │    │       DynamicProxy              │ │
│  │  - RouteCache   │    │  - DynamicProxyConfigProvider   │ │
│  │  - RedisManager │    │                                 │ │
│  │  - ConfigListen │    └─────────────────────────────────┘ │
│  └─────────────────┘                                         │
└─────────────────────────────────────────────────────────────┘
                              │
                              ▼
┌─────────────────────────────────────────────────────────────┐
│                    Data Access Layer                         │
│  ┌─────────────────┐    ┌─────────────────────────────────┐ │
│  │     Models      │    │            Data                 │ │
│  │  - GwTenant     │    │  - GatewayDbContext             │ │
│  │  - GwRoute      │    │  - GatewayDbContextFactory      │ │
│  │  - GwInstance   │    │                                 │ │
│  └─────────────────┘    └─────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────┘
                              │
                              ▼
┌─────────────────────────────────────────────────────────────┐
│                 Infrastructure Layer                         │
│  ┌─────────────────┐    ┌─────────────────────────────────┐ │
│  │     Config      │    │       LoadBalancing             │ │
│  │  - JwtConfig    │    │  - WeightedRoundRobinPolicy     │ │
│  │  - RedisConfig  │    │                                 │ │
│  │  - Providers    │    └─────────────────────────────────┘ │
│  └─────────────────┘                                         │
└─────────────────────────────────────────────────────────────┘

5.2 模块依赖关系

Program.cs
    │
    ├── Config/
    │   ├── JwtConfig ◄── appsettings.json
    │   ├── RedisConfig ◄── appsettings.json
    │   ├── DatabaseRouteConfigProvider ◄── Data/GatewayDbContext
    │   └── DatabaseClusterConfigProvider ◄── Data/GatewayDbContext
    │
    ├── DynamicProxy/
    │   └── DynamicProxyConfigProvider ◄── Config/*
    │
    ├── Services/
    │   ├── RouteCache ◄── Data/GatewayDbContext, Models/*
    │   ├── RedisConnectionManager ◄── Config/RedisConfig
    │   ├── PgSqlConfigChangeListener ◄── DynamicProxy, Services/RouteCache
    │   └── KubernetesPendingSyncService ◄── Data/GatewayDbContext
    │
    ├── Middleware/
    │   ├── JwtTransformMiddleware ◄── Config/JwtConfig
    │   └── TenantRoutingMiddleware ◄── Services/RouteCache
    │
    └── Controllers/
        ├── GatewayConfigController ◄── Config/*, Services/RouteCache
        └── PendingServicesController ◄── Data/GatewayDbContext

6. 项目依赖

6.1 NuGet 包引用

<!-- 核心框架 -->
<PackageReference Include="Microsoft.AspNetCore.Authentication.JwtBearer" />
<PackageReference Include="Yarp.ReverseProxy" />

<!-- 数据库 -->
<PackageReference Include="Microsoft.EntityFrameworkCore.Design" />
<PackageReference Include="Npgsql.EntityFrameworkCore.PostgreSQL" />

<!-- 缓存 -->
<PackageReference Include="StackExchange.Redis" />

<!-- 日志 -->
<PackageReference Include="Serilog.AspNetCore" />
<PackageReference Include="Serilog.Sinks.Console" />
<PackageReference Include="Serilog.Sinks.File" />

<!-- 服务发现 -->
<PackageReference Include="Fengling.ServiceDiscovery.Core" />
<PackageReference Include="Fengling.ServiceDiscovery.Kubernetes" />
<PackageReference Include="Fengling.ServiceDiscovery.Static" />

6.2 目标框架

<TargetFramework>net10.0</TargetFramework>

7. 文件统计

目录/文件 文件数 总行数 主要用途
Config/ 5 ~210 配置模型和提供者
Controllers/ 2 ~700 REST API 端点
Data/ 2 ~165 数据库上下文
DynamicProxy/ 1 ~79 YARP 配置集成
LoadBalancing/ 1 ~244 负载均衡策略
Migrations/ 6 ~500+ 数据库迁移
Metrics/ 1 ~31 监控指标
Middleware/ 2 ~148 请求处理中间件
Models/ 4 ~83 数据实体
Services/ 4 ~665 业务服务
Program.cs 1 135 应用入口
总计 29 ~2900+ -

8. 扩展建议

8.1 建议新增目录

目录 用途
Extensions/ 扩展方法
Constants/ 常量定义
Exceptions/ 自定义异常
Validators/ 输入验证器
Dtos/ 数据传输对象(从 Controllers 提取)

8.2 代码组织建议

  1. 将 Controller 中的 DTO 类提取到独立的 Dtos/ 目录
  2. 添加 Extensions/ 存放 IServiceCollection 扩展方法
  3. 考虑将配置验证逻辑提取到 Validators/