golang基于DDD和端口适配器架构的电商功能插件库Flamingo Commerce的使用
Golang基于DDD和端口适配器架构的电商功能插件库Flamingo Commerce的使用
Flamingo Commerce是一个用于构建快速灵活电子商务体验应用的工具包,基于Golang实现,采用领域驱动设计(DDD)和端口适配器架构。
主要功能和设计目标
解决的问题
- 现代架构:打破单体电子商务架构,实现可扩展性和可维护性
- 现代架构:用于构建无头(headless)电子商务解决方案
- 实时商务:构建个性化体验,无需缓存渲染页面
设计目标
- 性能:不依赖前端缓存,为每个客户提供个性化体验
- 清晰架构:使用"领域驱动设计"和"端口适配器"构建可维护的应用程序
- 适合微服务架构:适配器概念和各种弹性概念使其易于连接其他(微)服务
- 解耦和灵活的前端开发:前端开发与"前端后端"解耦
- 可测试性:通过提供"模拟适配器"提供测试数据
- 优秀的开发者体验
- 开源
主要模块
Flamingo Commerce提供了一系列电子商务模块,每个模块都提供了独立的限界上下文,包含领域、应用和接口逻辑:
- price:提供价格和费用值对象,支持计算、四舍五入和拆分
- product:提供处理不同产品类型的领域模型和接口逻辑
- category:提供类别树和类别视图的领域模型和接口逻辑
- cart:强大的购物车领域模型,支持多交付、多支付交易等
- payment:提供通用支付值对象以及通用Web支付接口
- search:提供通用搜索和搜索过滤器的领域模型和接口逻辑
- checkout:提供默认结账实现
- customer:提供客户领域模型
- order:提供订单领域模型(如"我的订单"页面使用)
- w3cdatalayer:提供用于电子商务跟踪的数据层渲染逻辑
安装和使用示例
推荐使用Go模块,只需在主go文件中导入Flamingo Commerce即可。
示例:使用产品模块
import (
"flamingo.me/flamingo-commerce/v3/product"
)
然后在应用程序引导中加载模块:
// main是入口点
func main() {
flamingo.App([]dingo.Module{
// flamingo-commerce模块
new(product.Module),
}, nil)
}
更新go.mod
依赖:
go get flamingo.me/flamingo-commerce/v3
完整示例:产品查询
package main
import (
"flamingo.me/dingo"
"flamingo.me/flamingo/v3"
"flamingo.me/flamingo-commerce/v3/product"
"flamingo.me/flamingo-commerce/v3/product/application"
"flamingo.me/flamingo-commerce/v3/product/interfaces"
"flamingo.me/flamingo-commerce/v3/product/interfaces/graphql"
)
// 配置产品模块
type productModule struct {
ProductService *application.ProductService `inject:""`
}
// Configure 配置路由
func (m *productModule) Configure(injector *dingo.Injector) {
// 注册产品控制器
injector.Bind(new(interfaces.ProductController)).To(&interfaces.ProductControllerImpl{})
// 注册GraphQL服务
injector.Bind(new(graphql.Service)).To(graphql.ServiceImpl{})
}
func main() {
flamingo.App([]dingo.Module{
new(product.Module),
new(productModule),
}, nil)
}
示例:购物车操作
package cart
import (
"context"
"flamingo.me/flamingo-commerce/v3/cart/domain/cart"
"flamingo.me/flamingo-commerce/v3/cart/domain/decorator"
"flamingo.me/flamingo-commerce/v3/cart/application"
)
type CartController struct {
CartService *application.CartService `inject:""`
CartReceiverService *application.CartReceiverService `inject:""`
}
// 添加产品到购物车
func (cc *CartController) AddToCart(ctx context.Context, productID string, qty int) (*cart.Cart, error) {
// 获取当前购物车
currentCart, err := cc.CartReceiverService.ViewCart(ctx)
if err != nil {
return nil, err
}
// 添加产品
addRequest := cart.AddRequest{
MarketplaceCode: productID,
Qty: qty,
}
err = cc.CartService.AddProduct(ctx, currentCart.ID, addRequest)
if err != nil {
return nil, err
}
// 返回更新后的购物车
return cc.CartReceiverService.ViewCart(ctx)
}
// 获取购物车装饰器(包含额外信息)
func (cc *CartController) GetDecoratedCart(ctx context.Context) (*decorator.DecoratedCart, error) {
return cc.CartReceiverService.ViewDecoratedCart(ctx)
}
状态说明
Flamingo Commerce API目前处于Beta阶段,API(模型和方法)可能还会更改。鼓励使用,但更新时可能需要调整代码以适应最新变化。
演示
有在线演示商店和使用Flamingo Commerce构建的示例代码可供参考:
更多关于golang基于DDD和端口适配器架构的电商功能插件库Flamingo Commerce的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html
更多关于golang基于DDD和端口适配器架构的电商功能插件库Flamingo Commerce的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
Flamingo Commerce: 基于DDD和端口适配器架构的电商插件库
Flamingo Commerce是一个基于领域驱动设计(DDD)和端口适配器架构(Hexagonal Architecture)的Golang电商框架。它提供了一套模块化的电商功能组件,可以灵活组合使用。
核心架构理念
1. 领域驱动设计(DDD)实现
Flamingo Commerce将电商领域划分为多个限界上下文(Bounded Context),如:
- 产品目录(Product)
- 购物车(Cart)
- 订单(Order)
- 支付(Payment)
- 客户(Customer)
每个限界上下文都有自己独立的领域模型。
2. 端口适配器架构
Flamingo采用端口(接口)和适配器模式,核心业务逻辑通过接口定义,具体实现可以替换:
业务核心 <-- 端口(接口) --> 适配器(实现)
主要功能模块
1. 产品目录模块
// 产品服务接口(端口)
type ProductService interface {
Get(ctx context.Context, marketplaceCode string) (domain.BasicProduct, error)
List(ctx context.Context, filters ...SearchFilter) ([]domain.BasicProduct, error)
}
// 使用示例
func (h *ProductHandler) Get(c web.Context) error {
product, err := h.productService.Get(c.Request().Context(), c.Params("code"))
if err != nil {
return c.Response().Status(404).JSON(nil)
}
return c.Response().JSON(product)
}
2. 购物车模块
// 购物车服务接口
type CartService interface {
GetCart(ctx context.Context, cartID string) (*domain.Cart, error)
AddItem(ctx context.Context, cartID string, item domain.AddRequest) (*domain.Cart, error)
DeleteItem(ctx context.Context, cartID string, itemID string) (*domain.Cart, error)
}
// 添加商品到购物车示例
func (h *CartHandler) AddItem(c web.Context) error {
var addRequest domain.AddRequest
if err := c.Bind(&addRequest); err != nil {
return c.Response().Status(400).JSON(err.Error())
}
cart, err := h.cartService.AddItem(c.Request().Context(), c.Params("cartId"), addRequest)
if err != nil {
return c.Response().Status(500).JSON(err.Error())
}
return c.Response().JSON(cart)
}
3. 订单模块
// 订单服务接口
type OrderService interface {
PlaceOrder(ctx context.Context, cart *domain.Cart) (domain.Order, error)
GetOrder(ctx context.Context, orderID string) (domain.Order, error)
}
// 下单示例
func (h *OrderHandler) PlaceOrder(c web.Context) error {
cart, err := h.cartService.GetCart(c.Request().Context(), c.Params("cartId"))
if err != nil {
return c.Response().Status(400).JSON(err.Error())
}
order, err := h.orderService.PlaceOrder(c.Request().Context(), cart)
if err != nil {
return c.Response().Status(500).JSON(err.Error())
}
return c.Response().JSON(order)
}
依赖注入配置
Flamingo使用依赖注入(DI)来组装各个模块:
// 模块定义
type CommerceModule struct {}
// Configure 注册服务
func (m *CommerceModule) Configure(injector *dingo.Injector) {
// 注册产品服务
injector.Bind(new(productDomain.ProductService)).To(productApplication.ProductServiceImpl{})
// 注册购物车服务
injector.Bind(new(cartDomain.CartService)).To(cartApplication.CartServiceImpl{})
// 注册订单服务
injector.Bind(new(orderDomain.OrderService)).To(orderApplication.OrderServiceImpl{})
}
自定义适配器实现
可以替换默认实现,例如使用MongoDB作为产品存储:
// MongoDB产品仓库实现
type MongoProductRepository struct {
collection *mongo.Collection
}
func (r *MongoProductRepository) Get(ctx context.Context, code string) (productDomain.BasicProduct, error) {
var product productDomain.BasicProduct
err := r.collection.FindOne(ctx, bson.M{"code": code}).Decode(&product)
return product, err
}
// 注册自定义仓库
func (m *CustomModule) Configure(injector *dingo.Injector) {
injector.Bind(new(productDomain.ProductRepository)).To(MongoProductRepository{})
}
路由配置
// 注册路由
func (m *WebModule) Configure(router *routing.Router) {
router.Get("/products/:code", productHandler.Get)
router.Post("/cart/:cartId/items", cartHandler.AddItem)
router.Post("/orders/:cartId", orderHandler.PlaceOrder)
}
优势特点
- 模块化设计:可以只使用需要的模块
- 可替换实现:所有核心功能都有接口定义,可以自定义实现
- 领域驱动:清晰的业务边界和模型
- 前后端分离:提供REST API,适合现代前端框架集成
- 可扩展性:易于添加新功能或修改现有功能
使用建议
- 从核心模块(产品、购物车、订单)开始
- 根据需要逐步添加支付、配送等模块
- 自定义适配器实现以集成现有系统
- 利用事件系统处理跨领域逻辑
- 遵循DDD原则设计自己的限界上下文
Flamingo Commerce提供了电商系统的基础构建块,开发者可以专注于业务逻辑的实现,而不必从零开始构建电商基础设施。