golang基于DDD和端口适配器架构的电商功能插件库Flamingo Commerce的使用

Golang基于DDD和端口适配器架构的电商功能插件库Flamingo Commerce的使用

Flamingo Commerce是一个用于构建快速灵活电子商务体验应用的工具包,基于Golang实现,采用领域驱动设计(DDD)和端口适配器架构。

主要功能和设计目标

解决的问题

  • 现代架构:打破单体电子商务架构,实现可扩展性和可维护性
  • 现代架构:用于构建无头(headless)电子商务解决方案
  • 实时商务:构建个性化体验,无需缓存渲染页面

设计目标

  • 性能:不依赖前端缓存,为每个客户提供个性化体验
  • 清晰架构:使用"领域驱动设计"和"端口适配器"构建可维护的应用程序
  • 适合微服务架构:适配器概念和各种弹性概念使其易于连接其他(微)服务
  • 解耦和灵活的前端开发:前端开发与"前端后端"解耦
  • 可测试性:通过提供"模拟适配器"提供测试数据
  • 优秀的开发者体验
  • 开源

主要模块

Flamingo Commerce提供了一系列电子商务模块,每个模块都提供了独立的限界上下文,包含领域、应用和接口逻辑:

  1. price:提供价格和费用值对象,支持计算、四舍五入和拆分
  2. product:提供处理不同产品类型的领域模型和接口逻辑
  3. category:提供类别树和类别视图的领域模型和接口逻辑
  4. cart:强大的购物车领域模型,支持多交付、多支付交易等
  5. payment:提供通用支付值对象以及通用Web支付接口
  6. search:提供通用搜索和搜索过滤器的领域模型和接口逻辑
  7. checkout:提供默认结账实现
  8. customer:提供客户领域模型
  9. order:提供订单领域模型(如"我的订单"页面使用)
  10. 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

1 回复

更多关于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)
}

优势特点

  1. 模块化设计:可以只使用需要的模块
  2. 可替换实现:所有核心功能都有接口定义,可以自定义实现
  3. 领域驱动:清晰的业务边界和模型
  4. 前后端分离:提供REST API,适合现代前端框架集成
  5. 可扩展性:易于添加新功能或修改现有功能

使用建议

  1. 从核心模块(产品、购物车、订单)开始
  2. 根据需要逐步添加支付、配送等模块
  3. 自定义适配器实现以集成现有系统
  4. 利用事件系统处理跨领域逻辑
  5. 遵循DDD原则设计自己的限界上下文

Flamingo Commerce提供了电商系统的基础构建块,开发者可以专注于业务逻辑的实现,而不必从零开始构建电商基础设施。

回到顶部