GoWind 开源生态GoWind 开源生态
首页
GoWind Admin
GoWind CMS
GoWind IM
GoWind UBA
GoWind Toolkit
GitHub
首页
GoWind Admin
GoWind CMS
GoWind IM
GoWind UBA
GoWind Toolkit
GitHub
  • 介绍

    • GoWind Admin 产品介绍
    • GoWind Admin 安装指南
  • 后端文档

    • 后端架构总览
    • 后端核心模块详解
    • 后端 API 与 Protobuf 定义
    • 后端配置与部署
    • 后端扩展开发
  • 前端文档

    • 前端架构总览
    • 前端核心功能详解
  • 二开教程

    • 后端新增业务模块实战教程
    • 前端新增业务页面实战教程
    • 前后端联调完整实战教程
  • 高级教程

    • Lua 脚本扩展实战教程
    • 权限系统深度解析教程
    • 多租户架构实战教程
    • 任务调度与异步处理教程
    • 文件上传与对象存储教程
    • 事件总线与解耦架构教程
    • 前端主题定制与国际化教程
    • 性能优化与监控教程
    • SSE 实时推送
    • 登录策略与安全加固
    • 加密工具实战

后端架构总览

GoWind Admin 后端采用 Go 语言开发,基于 go-kratos 微服务框架构建,融合 Ent ORM、Wire 依赖注入、Protobuf API 定义等现代化工程实践,提供高性能、易扩展的企业级后端服务。

一、技术栈概览

类别技术说明
语言Go 1.22+高性能编译型语言,天然支持高并发
微服务框架go-kratos v2go-kratos 微服务框架,提供 HTTP/gRPC 双协议支持
依赖注入WireGoogle 出品的编译时依赖注入工具,消除运行时反射开销
ORMEnt / GormEnt 用于核心业务实体(自动生成、类型安全),Gorm 用于辅助查询
数据库PostgreSQL(默认)/ MySQL通过配置切换,Ent/Gorm 均支持多数据库适配
缓存Redis用于令牌缓存、会话管理、验证码存储等
对象存储MinIOS3 兼容的对象存储服务,用于文件上传管理
API 定义Protobuf + Buf标准化的接口定义语言,自动生成 Go/TypeScript 代码
任务调度Asynq基于 Redis 的分布式任务队列,支持定时任务和异步任务
实时推送SSE(Server-Sent Events)服务端向客户端推送实时消息
权限控制Casbin / OPA / Zanzibar多种策略引擎可选,支持 RBAC、ABAC 等权限模型
容器化Docker + Docker Compose一键部署所有依赖服务及应用本身

二、架构设计

1. 整体分层架构

后端服务遵循经典的 三层架构 设计:

  • API 层:负责接收外部请求,通过 Protobuf 生成的 HTTP Handler 暴露 RESTful 接口。中间件层处理认证(JWT)、授权(Casbin/OPA)、API 审计日志等横切关注点。
  • Service 层:核心业务逻辑的实现层,每个业务模块对应一个 Service,通过依赖注入获取 Data 层的 Repo 实例。
  • Data 层:数据持久化与外部服务交互层,封装数据库操作(Ent/Gorm)、缓存操作(Redis)、文件存储(MinIO)等。

2. 服务组成

Admin 后端服务由三个 Transport Server 组成:

服务端口说明
REST Server:7788主要的 HTTP API 服务,处理所有业务请求
SSE Server:7789服务器推送服务,用于实时消息通知
Asynq Server通过 Redis异步任务调度服务,处理定时任务和后台任务

3. 启动流程

后端服务的启动入口位于 app/admin/service/cmd/server/main.go,启动流程如下:

  1. 创建应用上下文(bootstrap.Context),包含项目名、服务 ID、版本号
  2. 通过 Wire 依赖注入(wire.go → wire_gen.go)自动组装所有依赖
  3. 初始化 REST Server、SSE Server、Asynq Server
  4. 注册所有业务 Service 的 HTTP Handler
  5. 注册 Swagger UI(开发环境)
  6. 初始化权限策略
  7. 启动 Kratos 应用,开始监听请求

三、项目目录结构

backend/
├── api/                        # API 定义与代码生成
│   ├── protos/                 # Protobuf 原始定义文件
│   │   ├── admin/service/v1/   # Admin 服务接口定义
│   │   ├── audit/              # 审计相关定义
│   │   ├── authentication/     # 认证相关定义
│   │   ├── dict/               # 字典相关定义
│   │   ├── identity/           # 身份管理相关定义
│   │   ├── internal_message/   # 站内信相关定义
│   │   ├── permission/         # 权限相关定义
│   │   ├── storage/            # 存储相关定义
│   │   └── task/               # 任务调度相关定义
│   ├── gen/                    # 自动生成的代码
│   │   └── go/                 # 生成的 Go 代码
│   ├── buf.yaml                # Buf 配置
│   └── buf.gen.yaml            # 代码生成配置
│
├── app/                        # 应用服务代码
│   └── admin/service/          # Admin 核心服务
│       ├── cmd/server/         # 服务启动入口
│       │   ├── main.go         # 主程序入口
│       │   ├── wire.go         # Wire 依赖注入定义
│       │   ├── wire_gen.go     # Wire 自动生成的代码
│       │   └── assets/         # 静态资源(OpenAPI 文档等)
│       ├── configs/            # 配置文件
│       │   ├── server.yaml     # 服务器配置
│       │   ├── data.yaml       # 数据源配置
│       │   ├── auth.yaml       # 认证授权配置
│       │   ├── client.yaml     # 客户端配置
│       │   ├── oss.yaml        # 对象存储配置
│       │   └── logger.yaml     # 日志配置
│       └── internal/           # 内部实现(不对外暴露)
│           ├── data/           # 数据访问层(Repo 实现)
│           ├── server/         # 服务器与中间件配置
│           └── service/        # 业务逻辑层(Service 实现)
│
├── pkg/                        # 通用工具包
│   ├── authorizer/             # 权限控制引擎封装
│   ├── constants/              # 全局常量定义
│   ├── crypto/                 # 加密工具(AES-GCM)
│   ├── entgo/                  # Ent ORM 扩展
│   ├── eventbus/               # 事件总线
│   ├── jwt/                    # JWT 令牌载荷解析
│   ├── lua/                    # Lua 脚本引擎
│   │   ├── api/                # Lua API 模块
│   │   ├── hook/               # Lua 钩子机制
│   │   └── engine.go           # Lua 引擎核心
│   ├── middleware/             # 自定义中间件
│   │   ├── auth/               # 认证中间件
│   │   ├── ent/                # Ent 上下文中间件
│   │   └── logging/            # 审计日志中间件
│   ├── oss/                    # 对象存储客户端
│   ├── serviceid/              # 服务标识常量
│   ├── task/                   # 任务定义
│   └── utils/                  # 通用工具函数
│
├── scripts/                    # 构建/部署脚本
│   ├── docker/                 # Docker 部署脚本
│   ├── deploy/                 # 生产部署脚本
│   └── env/                    # 环境初始化脚本
│
├── sql/                        # 数据库初始化脚本
├── Makefile                    # 自动化构建指令
├── Dockerfile                  # Docker 镜像构建文件
├── docker-compose.yaml         # 全服务部署编排
└── docker-compose.libs.yaml    # 仅依赖服务编排

四、分层设计:Service 与 Data 的交互模式

GoWind Admin 的分层设计中,Service 层与 Data 层的耦合程度是架构的关键胜负手。框架根据模块复杂度,灵活采用三种交互模式,在「快速落地」与「企业级扩展」之间取得动态平衡。

1. 模式一:Service 直连 Data Repo(简单直接)

Data 层直接实现 Repo 结构体(无接口),Service 层直接导入 Data 包引用 Repo 实例:

// Data 层:直接实现 Repo
package data

type DepartmentRepo struct {
    client *ent.Client
}

func (r *DepartmentRepo) GetByID(ctx context.Context, id uint32) (*ent.Department, error) {
    return r.client.Department.Query().Where(department.ID(id)).Only(ctx)
}
// Service 层:直接依赖 Data 层的具体实现
package service

type DepartmentService struct {
    deptRepo *data.DepartmentRepo  // 直接依赖具体类型
}

func (s *DepartmentService) GetDepartmentInfo(ctx context.Context, id uint32) (*dto.DepartmentVO, error) {
    deptEnt, err := s.deptRepo.GetByID(ctx, id)  // 直接调用
    // ...业务逻辑处理 + 数据组装
}

适用场景:轻量模块(日志、配置、系统公告)、MVP 验证、1-3 人小团队

优点缺点
开发效率极高,无需定义接口Service 与 Data 强耦合,替换 ORM 需改所有调用处
架构极简,新人上手门槛低可测试性差,单元测试需依赖真实数据库
调试链路清晰扩展性缺失,不支持多存储适配

2. 模式二:依赖倒置接口解耦(推荐)

由 Service 层定义 Repo 接口(明确「需要什么」),Data 层实现接口(明确「如何实现」),通过 Wire 依赖注入组装:

// Service 层:定义抽象接口
package service

type DepartmentRepo interface {
    GetByID(ctx context.Context, id uint32) (*DepartmentEntity, error)
    ListByOrgID(ctx context.Context, orgID uint32) ([]*DepartmentEntity, error)
}

type DepartmentService struct {
    deptRepo DepartmentRepo  // 依赖抽象接口
}
// Data 层:实现 Service 层定义的接口
package data

type DepartmentRepoImpl struct {
    entClient *ent.Client
    cache     *redis.Client
}

func NewDepartmentRepoImpl(entClient *ent.Client, cache *redis.Client) service.DepartmentRepo {
    return &DepartmentRepoImpl{entClient: entClient, cache: cache}
}

func (r *DepartmentRepoImpl) GetByID(ctx context.Context, id uint32) (*service.DepartmentEntity, error) {
    // 可自由组合 Ent + Redis 缓存,Service 层无感知
}
// Wire 依赖注入:绑定接口与实现
var ServiceProviderSet = wire.NewSet(
    service.NewDepartmentService,
    data.NewDepartmentRepoImpl,  // 绑定
)

适用场景:用户管理、权限控制、多租户等核心模块,3-10 人团队

优点缺点
彻底解耦,修改 Data 不影响 Service初期代码量增加 30%-50%
可通过 Mock 工具实现单元测试需理解依赖倒置和 Wire
支持多存储适配(MySQL/PostgreSQL/Redis)调试链路变长

3. 模式三:新增 Biz 层(超大型项目)

对于跨聚合根、复杂状态流转、强事务一致性的场景,可引入 Biz 层形成四层架构:

API 层(协议处理) → Service 层(服务契约) → Biz 层(核心业务逻辑) → Data 层(数据访问)
// Biz 层:核心业务编排
package biz

type UserBiz struct {
    userRepo    UserRepo
    roleRepo    RoleRepo
    messageRepo MessageRepo
}

func (b *UserBiz) CreateUserInTenant(ctx context.Context, tenantID uint32, req *CreateUserReq) (*User, error) {
    // 1. 校验用户名唯一
    // 2. 创建用户
    // 3. 分配角色(跨聚合)
    // 4. 发送欢迎消息(可降级)
}

适用场景:订单、支付等超复杂模块,10+ 人团队,具备领域建模意识

4. 分层决策指南

项目特征推荐方案典型模块
MVP / 单表 CRUD / 内部工具模式一(直连)系统公告、日志、字典
多人协作 / 需单元测试 / 多存储模式二(接口解耦)用户、权限、租户
跨聚合 / 状态机 / 强事务模式三(Biz 层)订单、支付

GoWind Admin 默认生成的模块多采用模式一(便于新手快速上手),而用户、租户、权限等核心模块已按模式二实现,可直接参考源码。

五、依赖注入(Wire)

项目使用 Google Wire 实现编译时依赖注入,通过 ProviderSet 将 Data、Service、Server 三层的依赖关系自动编排:

// wire.go
func initApp(*bootstrap.Context) (*kratos.App, func(), error) {
    panic(wire.Build(
        serverProviders.ProviderSet,   // 服务器层
        serviceProviders.ProviderSet,  // 业务逻辑层
        dataProviders.ProviderSet,     // 数据访问层
        newApp,
    ))
}

六、代码生成驱动

通过 Protobuf + Buf 自动生成:

  • Go HTTP Server/Client 代码
  • TypeScript 前端请求代码
  • OpenAPI v3 文档
  • 错误码定义

七、多租户支持

后端内置多租户能力,支持两种用户-租户关系模型:

  • 一对一:一个用户只属于一个租户
  • 一对多:一个用户可以属于多个租户

通过 constants.DefaultUserTenantRelationType 配置切换。

八、相关文档

  • 后端核心模块详解
  • 后端 API 与 Protobuf 定义
  • 后端配置与部署
  • 后端扩展开发
Edit this page
Last Updated:: 6/5/26, 11:52 AM
Contributors: Bobo
Next
后端核心模块详解