FShop 是一个基于 Go 语言开发的电商系统示例,采用 DDD(领域驱动设计)架构模式实现。该项目展示了一个包含商品管理、购物车、订单处理等基本电商功能的系统。本项目主要用于展示如何在实际项目中应用 DDD 架构,以及如何使用 Freedom Framework 构建高可维护性的企业级应用。
- 完整的电商业务流程实现
- DDD架构的最佳实践示例
- 领域事件驱动的业务处理
- 完善的测试用例
- 支持容器化部署
- 高性能的缓存设计
- 分布式追踪支持
# 必需组件
- Go 1.18+
- MySQL 5.7+
- Redis 6.0+
- Freedom Framework latest
# 可选组件
- Prometheus (用于监控)
- Docker (用于容器化部署)
fshop/
├── adapter/ # 适配器层
│ ├── controller/ # HTTP 控制器
│ │ ├── cart.go # 购物车控制器
│ │ ├── goods.go # 商品控制器
│ │ ├── order.go # 订单控制器
│ │ └── delivery.go # 发货控制器
│ ├── repository/ # 数据仓储实现
│ │ ├── cart.go # 购物车仓储
│ │ ├── goods.go # 商品仓储
│ │ └── order.go # 订单仓储
│ └── consumer/ # 消费者实现
│ └── consumer.go # 事件消费者
├── domain/ # 领域层
│ ├── aggregate/ # 聚合根
│ │ ├── cart_factory.go # 购物车工厂
│ │ ├── shop_factory.go # 购买工厂
│ │ └── order_factory.go # 订单工厂
│ ├── entity/ # 实体
│ │ ├── cart.go # 购物车实体
│ │ ├── goods.go # 商品实体
│ │ └── order.go # 订单实体
│ ├── vo/ # 值对象
│ │ ├── cart.go # 购物车值对象
│ │ └── order.go # 订单值对象
│ └── event/ # 领域事件
│ ├── shop.go # 购买事件
│ └── order.go # 订单事件
├── infra/ # 基础设施层
│ └── domainevent/ # 领域事件基础设施
├── server/ # 服务器配置和启动
│ └── conf/ # 配置文件
│ ├── config.toml # TOML配置示例
│ └── config.yaml # YAML配置示例
├── api_test/ # API 测试用例
├── fshop.sql # 数据库脚本
└── Dockerfile # Docker 构建文件
- 商品的创建和管理
- 商品库存管理
- 商品标签管理
- 商品列表查询
- 商品库存增减
// 商品相关 API
GET /goods/items # 获取商品列表
POST /goods # 添加商品
PUT /goods/stock/:id/:num # 增加库存
PUT /goods/tag # 为商品打标签
POST /goods/shop # 直接购买商品
// 添加商品请求
POST /goods
{
"name": "示例商品",
"price": 9900,
"stock": 100,
"tag": "热销"
}
// 商品列表响应
GET /goods/items
{
"items": [
{
"id": 1,
"name": "示例商品",
"price": 9900,
"stock": 100,
"tag": "热销"
}
],
"total": 1
}
- 添加商品到购物车
- 查看购物车商品列表
- 清空购物车
- 购物车商品结算
// 购物车相关 API
GET /cart/items # 获取购物车商品列表
POST /cart # 添加商品到购物车
DELETE /cart/all # 清空购物车
POST /cart/shop # 购物车结算
// 添加购物车
POST /cart
{
"userId": 1,
"goodsId": 1,
"goodsNum": 2
}
// 购物车列表响应
GET /cart/items?userId=1
{
"items": [
{
"goodsId": 1,
"goodsName": "示例商品",
"goodsNum": 2,
"price": 9900
}
]
}
- 订单创建
- 订单支付
- 订单发货
- 订单列表查询
// 订单相关 API
GET /order/items # 获取订单列表
POST /order/pay # 订单支付
POST /delivery # 订单发货
// 订单支付
POST /order/pay
{
"orderNo": "202312200001",
"userId": 1
}
// 订单列表响应
GET /order/items?userId=1
{
"orders": [
{
"orderNo": "202312200001",
"totalPrice": 19800,
"status": "待发货",
"items": [
{
"goodsId": 1,
"goodsName": "示例商品",
"num": 2
}
]
}
]
}
// CartFactory 示例
type CartFactory struct {
UserRepo dependency.UserRepo
CartRepo dependency.CartRepo
GoodsRepo dependency.GoodsRepo
}
// 创建购物车聚合根
func (factory *CartFactory) NewCartAddCmd(goodsID, userID int) (*CartAddCmd, error) {
// 实现细节...
}
// OrderFactory 示例
type OrderFactory struct {
OrderRepo dependency.OrderRepo
UserRepo dependency.UserRepo
}
// 创建订单聚合根
func (factory *OrderFactory) NewOrderPayCmd(orderNo string, userID int) (*OrderPayCmd, error) {
// 实现细节...
}
// 购买商品事件
type ShopGoods struct {
UserID int
OrderNO string
GoodsID int
GoodsNum int
GoodsName string
}
// 订单支付事件
type OrderPay struct {
OrderNo string
UserID int
Amount int
}
// 事件处理示例
func (g *GoodsService) ShopEvent(event *event.ShopGoods) error {
// 处理购买事件...
return nil
}
// 商品资源库接口
type GoodsRepo interface {
Get(id int) (*entity.Goods, error)
Save(goods *entity.Goods) error
FindsByPage(page, pagesize int, tag string) ([]*entity.Goods, error)
}
// 商品资源库实现
type GoodsRepository struct {
freedom.Repository
}
func (repo *GoodsRepository) Get(id int) (*entity.Goods, error) {
// 实现细节...
}
[db]
addr = "root:password@tcp(localhost:3306)/fshop?charset=utf8mb4"
max_open_conns = 16
max_idle_conns = 8
[redis]
addr = "localhost:6379"
pool_size = 32
db:
addr: "root:password@tcp(localhost:3306)/fshop?charset=utf8mb4"
max_open_conns: 16
max_idle_conns: 8
redis:
addr: "localhost:6379"
pool_size: 32
// 日志中间件示例
func LoggerMiddleware(ctx freedom.Context) {
// 实现细节...
}
// 追踪中间件示例
func TracingMiddleware(ctx freedom.Context) {
// 实现细节...
}
// 购物车结算事务
func (cmd *CartShopCmd) Shop() error {
return cmd.tx.Execute(func() error {
// 1. 修改商品库存
// 2. 清空购物车
// 3. 创建订单
// 4. 记录事件
return nil
})
}
- 遵循 Go 官方代码规范
- DDD 分层架构严格划分
- 统一的错误处理机制
- 完善的日志记录
- 接口响应时间监控
- 错误率监控
- 资源使用监控
- 业务指标监控
Q: 如何处理依赖问题? A: 使用 go mod tidy 更新依赖
Q: 配置文件找不到? A: 检查 FSHOP-CONFIG 环境变量
Q: 如何添加新的 API? A: 在 controller 中添加新的处理方法,并在 init 中注册路由
Q: 如何处理并发问题? A: 使用事务和锁机制确保数据一致性
FShop 项目是一个基于 DDD 架构的电商系统示例,展示了如何在 Go 语言中实现领域驱动设计。项目结构清晰,代码组织合理,实现了电商系统的核心功能,并且提供了完善的测试用例和部署支持。通过这个项目,开发者可以学习到:
- DDD 架构在实际项目中的应用
- Go 语言企业级应用开发最佳实践
- 微服务设计和实现方法
- 高并发场景下的性能优化
- 分布式系统开发经验