# sparrow
**Repository Path**: ray_liang/sparrow
## Basic Information
- **Project Name**: sparrow
- **Description**: A pure DDD+CQRS+ES framework
- **Primary Language**: Go
- **License**: Not specified
- **Default Branch**: main
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2026-03-06
- **Last Updated**: 2026-03-06
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# 🐦 Sparrow

**一个为现代微服务而生的 Go 领域驱动框架**
[](https://golang.org)
[](LICENSE)
[]()
*事件驱动 · 领域建模 · 多存储 · 服务完全自治 · 生产就绪*
[English](./README.md) | [中文](./README.zh.md) | [详细文档](http://sparrow.rayainfo.cn/)
## 特点
### 使用侧
- **零样板代码** — 聚合根、仓储、事件发布三位一体,继承即用,无需重复实现基础设施
- **接口即契约** — 仓储、事件总线、事件存储全部面向接口编程,Mock 测试毫不费力
- **渐进式接入** — 从内存实现起步,生产时只需替换依赖注入,业务代码零改动
- **统一错误语义** — 全局错误包装规范,跨层传递不丢失上下文,可观测性开箱即用
- **配置驱动启动** — Viper 多来源配置(文件 / 环境变量 / 远程),一套 `App` 生命周期托管所有服务
### 技术侧
- **整洁架构分层** — 严格依赖倒置,领域层对基础设施零感知,架构腐化从根源阻断
- **泛型仓储 DSL** — Go 泛型加持,类型安全的 CRUD / 分页 / 软删除,多数据库一套接口
- **事件总线多后端** — Memory / NATS JetStream / RabbitMQ / Redis,接口统一,运行时按需切换
- **NATS JetStream 原生集成** — 持久化事件流、消费者组、重放能力,天然支持 Event Sourcing
- **Saga 分布式事务** — 编排式 Saga 协调器,补偿事务链路清晰,跨服务一致性有保障
- **Testcontainers 集成测试** — PostgreSQL、Redis 真实容器测试,告别 Mock 数据库的假阳性
### 微服务自治
> **一服务一数据库**,不再是奢望
微服务架构的终极目标是**完全自治**——每个服务拥有独立的数据存储,彼此无共享、无耦合。Sparrow 内置两张王牌让这一目标触手可及:
| | NATS | BadgerDB |
| ----------------------- | ------------------------ | ------------------------- |
| **定位** | 轻量高性能事件流 | 嵌入式亿级 KV 数据库 |
| **二进制体积** | < 20 MB | 无独立进程,随服务启动 |
| **吞吐量** | 数百万消息/秒 | 数百万 ops/秒(SSD) |
| **部署依赖** | 单一可执行文件,无需运维 | 零外部依赖,数据随服务走 |
| **在 Sparrow 中的角色** | 服务间事件通信与事件溯源 | 服务私有读模型 / 状态存储 |
```
┌──────────────┐ NATS JetStream ┌──────────────┐
│ 订单服务 │ ──── OrderPlaced ────► │ 库存服务 │
│ BadgerDB │ │ BadgerDB │
│ (私有存储) │ ◄─── StockReserved ─── │ (私有存储) │
└──────────────┘ └──────────────┘
↑ 无共享数据库,服务之间只通过事件通信,完全解耦自治
```
这意味着:每个微服务可以**独立部署、独立扩缩容、独立升级**,其他服务无感知。
---
## 为什么选择 Sparrow?
传统的微服务开发往往陷入三种困境:
- **业务与数据强耦合** — REST 直连数据库,审计与回放无从谈起
- **跨服务事务噩梦** — 同步调用链路,一致性问题无解
- **基础设施重复造轮子** — 仓储层、错误处理、事件承载各自为政
Sparrow 用 DDD + CQRS + Event Sourcing 的完整工具链,将这些问题一次性解决。
---
## 核心能力
### 事件驱动架构
统一的事件总线抽象,支持多种后端,按需切换,无需改动业务代码:
```go
// 订阅领域事件
bus.Sub("OrderPlaced", func(ctx context.Context, evt eventbus.Event) error {
// 处理订单创建事件
return nil
})
// 发布事件
bus.Pub(ctx, eventbus.Event{EventType: "OrderPlaced", Payload: order})
```
| 后端 | 适用场景 |
| -------------- | ------------------------ |
| Memory | 单元测试、本地开发 |
| NATS JetStream | 高吞吐、事件持久化与重放 |
| RabbitMQ | 企业消息路由、复杂拓扑 |
| Redis Pub/Sub | 轻量实时通知 |
### 领域驱动设计 (DDD)
内置聚合根模板,事件溯源开箱即用:
```go
type Order struct {
entity.BaseAggregateRoot
Status string
}
func (o *Order) PlaceOrder(items []Item) {
// 产生领域事件,自动追踪版本
o.AddDomainEvent(&OrderPlaced{Items: items})
o.Status = "placed"
}
```
- 聚合根版本控制 & 乐观锁
- 快照机制加速大版本聚合重建
- 命令模式与用例执行器
### 泛型仓储 — 换存储不换代码
```go
// 声明接口,实现自动注入
type OrderRepo interface {
usecase.Repository[Order]
}
// 从内存切换到 PostgreSQL,只需换一行依赖注入
```
| 实现 | 特性 |
| ---------- | ---------------------------- |
| Memory | 零依赖,测试利器 |
| PostgreSQL | 完整关系型支持,软删除,分页 |
| MongoDB | 文档型,半结构化数据 |
| Redis | 高性能缓存层,TTL 过期 |
| BadgerDB | 嵌入式 KV,无需额外部署 |
| GORM (SQL) | 多数据库兼容,复杂关系模型 |
### 任务调度系统
三种调度策略灵活组合:
```go
// 并发调度 — 多任务同时跑
scheduler := tasks.NewConcurrentScheduler()
// 顺序调度 — 严格保序
scheduler := tasks.NewSequentialScheduler()
// 混合调度 — 批次内并发,批次间有序
scheduler := tasks.NewHybridScheduler()
```
### CQRS 投影系统
基于 NATS JetStream 的全量 & 增量投影,自动将事件流重建为读模型:
```
事件流 → 聚合根重建 → 投影计算 → 视图存储
```
### Saga 协调器
跨服务分布式事务的编排中枢,补偿事务一键回滚。
---
## 架构总览
```
┌─────────────────────────────────────────────────────┐
│ HTTP / WebSocket │
│ Gin Router · JWT · Casbin RBAC │
├─────────────────────────────────────────────────────┤
│ 应用用例层 │
│ Command Handler · Query · Saga · Executor │
├──────────────────────┬──────────────────────────────┤
│ 领域模型 │ 事件驱动 │
│ Entity · AggRoot │ EventBus · EventStore │
│ DomainEvent · Cmd │ Publisher · Subscriber │
├──────────────────────┴──────────────────────────────┤
│ 基础设施层 │
│ PostgreSQL · MongoDB · Redis · BadgerDB · GORM │
│ NATS JetStream · RabbitMQ · Zap · Viper │
└─────────────────────────────────────────────────────┘
```
---
## 快速开始
**环境要求**: Go 1.25+
```bash
# 克隆项目
git clone https://github.com/DotNetAge/sparrow.git
cd sparrow/src
# 安装依赖
make deps
# 运行测试
make test
# 启动服务
make run
```
**使用 Docker**:
```bash
# 构建镜像
make docker-build
# 启动全套服务(含依赖)
make docker-run
```
---
## 技术栈
| 领域 | 技术 |
| ---------- | --------------------------------------- |
| 语言 | Go 1.25 |
| Web 框架 | Gin v1.11 |
| 权限控制 | Casbin v2 (RBAC) |
| 认证 | JWT (golang-jwt/jwt v5) + RSA |
| ORM | GORM v1.31 · sqlx v1.4 |
| 数据库 | PostgreSQL · MongoDB · SQLite |
| 缓存 | Redis (go-redis v8/v9) |
| 嵌入式存储 | BadgerDB v4 |
| 消息队列 | NATS JetStream v1.46 · RabbitMQ amqp091 |
| 日志 | Zap v1.27 + Lumberjack 滚动日志 |
| 配置管理 | Viper v1.21 |
| 实时通信 | Gorilla WebSocket v1.5 |
| 测试 | Testify · Testcontainers |
---
## 项目结构
```
pkg/
├── entity/ # 领域模型:聚合根、实体、领域事件、命令
├── usecase/ # 用例层:仓储接口、事件存储接口、执行器
├── eventbus/ # 事件总线:Memory / NATS / RabbitMQ / Redis
├── messaging/ # 消息子系统:JetStream 发布订阅、事件序列化
├── persistence/ # 仓储实现:多数据源适配
│ └── repo/ # PostgreSQL · MongoDB · Redis · BadgerDB · GORM · Memory
├── projection/ # 投影系统:全量投影、JetStream 索引器
├── tasks/ # 任务调度:并发 / 顺序 / 混合调度器
├── auth/ # 认证授权:JWT 签发、RSA 验证
├── bootstrap/ # 应用启动:DI 容器、生命周期管理
├── config/ # 配置管理:多格式、多来源
├── adapter/ # 接口适配器
│ ├── http/ # Gin 路由、Handler、中间件
│ ├── projection/ # 投影适配器
│ └── saga/ # Saga 协调器
├── logger/ # 日志:Zap + 滚动文件
└── ws/ # WebSocket 适配器
```
---
## 适用场景
- 需要 **可审计、可回放** 的金融 / 电商 / 物流业务系统
- 微服务架构下的 **跨服务分布式事务** 协调
- 对 **可测试性、可维护性** 有高要求的中大型团队
- 希望用 DDD 落地但不想从零搭建基础设施的项目
---
## 开发指南
```bash
make fmt # 格式化代码
make lint # 运行 golangci-lint
make test # 运行全部测试
make build # 编译二进制
```
---
**Sparrow** — 小身躯,大能量。让复杂分布式系统回归简单。