Documentation
¶
Index ¶
- func MarshalDomainEvent(event BaseEvent) ([]byte, error)
- func MarshalDomainEventToString(event BaseEvent) (string, error)
- func MarshalPayload(payload interface{}) ([]byte, error)
- func UnmarshalDomainEvent[T BaseEvent](data []byte) (T, error)
- func UnmarshalDomainEventFromString[T BaseEvent](jsonString string) (T, error)
- func UnmarshalPayload[T any](ev BaseEvent) (T, error)
- func ValidateConsistency(envelope *Envelope, event BaseEvent) error
- type BaseDomainEvent
- func (e *BaseDomainEvent) GetAggregateID() string
- func (e *BaseDomainEvent) GetAggregateType() string
- func (e *BaseDomainEvent) GetEventID() string
- func (e *BaseDomainEvent) GetEventType() string
- func (e *BaseDomainEvent) GetOccurredAt() time.Time
- func (e *BaseDomainEvent) GetPayload() interface{}
- func (e *BaseDomainEvent) GetVersion() int
- type BaseEvent
- type EnterpriseDomainEvent
- func (e *EnterpriseDomainEvent) GetCausationId() string
- func (e *EnterpriseDomainEvent) GetCorrelationId() string
- func (e *EnterpriseDomainEvent) GetTenantId() int
- func (e *EnterpriseDomainEvent) GetTraceId() string
- func (e *EnterpriseDomainEvent) SetCausationId(id string)
- func (e *EnterpriseDomainEvent) SetCorrelationId(id string)
- func (e *EnterpriseDomainEvent) SetTenantId(id int)
- func (e *EnterpriseDomainEvent) SetTraceId(id string)
- type EnterpriseEvent
- type Envelope
Constants ¶
This section is empty.
Variables ¶
This section is empty.
Functions ¶
func MarshalDomainEvent ¶
MarshalDomainEvent 序列化完整的 DomainEvent 用于 Command Side 保存到 Outbox 或发布到消息队列
使用示例:
eventBytes, err := event.MarshalDomainEvent(domainEvent)
if err != nil {
return fmt.Errorf("failed to marshal domain event: %w", err)
}
优势: 1. 统一使用 jsoniter.ConfigCompatibleWithStandardLibrary 2. 统一的错误处理 3. 避免各服务重复实现
注意: - 序列化时会包含所有字段(EventID, EventType, Payload 等) - Payload 字段会被序列化为 JSON 对象(嵌套在 DomainEvent JSON 中)
func MarshalDomainEventToString ¶
MarshalDomainEventToString 序列化 DomainEvent 为 JSON 字符串 用于测试或特殊场景
使用示例:
jsonString, err := event.MarshalDomainEventToString(domainEvent)
if err != nil {
return fmt.Errorf("failed to marshal domain event: %w", err)
}
func MarshalPayload ¶
MarshalPayload 标准化的Payload序列化助手(用于特殊场景) 一般不需要直接使用,UnmarshalPayload 内部会自动处理
使用示例:
payloadBytes, err := event.MarshalPayload(payload)
if err != nil {
return fmt.Errorf("failed to marshal payload: %w", err)
}
优势: 1. 统一使用 jxt-core/sdk/pkg/json 的 jsoniter 配置 2. 统一的错误处理
func UnmarshalDomainEvent ¶
UnmarshalDomainEvent 反序列化完整的 DomainEvent 用于 Query Side 从消息队列接收事件
使用示例:
// 使用 BaseDomainEvent
domainEvent, err := event.UnmarshalDomainEvent[*event.BaseDomainEvent](msg.Payload)
if err != nil {
return fmt.Errorf("failed to unmarshal domain event: %w", err)
}
// 使用 EnterpriseDomainEvent
enterpriseEvent, err := event.UnmarshalDomainEvent[*event.EnterpriseDomainEvent](msg.Payload)
if err != nil {
return fmt.Errorf("failed to unmarshal enterprise event: %w", err)
}
优势: 1. 统一使用 jsoniter.ConfigCompatibleWithStandardLibrary 2. 类型安全(泛型) 3. 统一的错误处理 4. 避免各服务重复实现
注意: - 反序列化后,Payload 字段的类型是 map[string]interface{}(而不是原始结构体) - 需要使用 UnmarshalPayload 进一步提取具体的 Payload 结构体
func UnmarshalDomainEventFromString ¶
UnmarshalDomainEventFromString 从 JSON 字符串反序列化 DomainEvent 用于测试或特殊场景
使用示例:
domainEvent, err := event.UnmarshalDomainEventFromString[*event.BaseDomainEvent](jsonString)
if err != nil {
return fmt.Errorf("failed to unmarshal domain event: %w", err)
}
func UnmarshalPayload ¶
UnmarshalPayload 标准化的Payload反序列化助手 解决各服务自行处理序列化导致的不一致问题
使用示例:
payload, err := event.UnmarshalPayload[MediaUploadedPayload](domainEvent)
if err != nil {
return fmt.Errorf("failed to unmarshal payload: %w", err)
}
优势: 1. 统一使用jsoniter.ConfigCompatibleWithStandardLibrary 2. 类型安全(泛型) 3. 自动处理 interface{} → map[string]interface{} → 结构体 的转换 4. 支持 []byte 和 RawMessage 类型的 Payload 5. 统一的错误处理 6. 避免各服务重复实现
注意: - 当 Payload 是 interface{} 类型且从 JSON 反序列化时,实际类型是 map[string]interface{} - 本方法会自动处理这种情况,将 map 转换为目标结构体
func ValidateConsistency ¶
ValidateConsistency 校验Envelope与DomainEvent的一致性 确保事件在传输过程中关键信息不被篡改或不一致
校验项: 1. EventType一致性 2. AggregateID一致性 3. TenantId一致性(如果是企业级事件)
使用场景: - Outbox适配器在保存事件前校验 - EventHandler在处理事件前校验 - 测试用例中验证事件完整性
Types ¶
type BaseDomainEvent ¶
type BaseDomainEvent struct {
// ========== 技术基础字段 ==========
EventID string `json:"eventId" gorm:"type:char(36);primary_key;column:event_id;comment:事件ID"`
EventType string `json:"eventType" gorm:"type:varchar(255);index;column:event_type;comment:事件类型"`
OccurredAt time.Time `json:"occurredAt" gorm:"type:datetime;index;column:occurred_at;comment:事件发生时间"`
Version int `json:"version" gorm:"type:int;column:event_version;comment:事件版本"`
// ========== DDD核心概念 ==========
AggregateID string `json:"aggregateId" gorm:"type:varchar(255);index;column:aggregate_id;comment:聚合根ID"`
AggregateType string `json:"aggregateType" gorm:"type:varchar(255);index;column:aggregate_type;comment:聚合根类型"`
// ========== 事件载荷 ==========
Payload interface{} `json:"payload" gorm:"-"` // 不持久化到数据库
}
BaseDomainEvent 基础领域事件结构 包含所有事件驱动系统都需要的核心字段 适用于:所有使用事件驱动架构的系统
func NewBaseDomainEvent ¶
func NewBaseDomainEvent(eventType string, aggregateID interface{}, aggregateType string, payload interface{}) *BaseDomainEvent
NewBaseDomainEvent 创建基础领域事件
func (*BaseDomainEvent) GetAggregateID ¶
func (e *BaseDomainEvent) GetAggregateID() string
func (*BaseDomainEvent) GetAggregateType ¶
func (e *BaseDomainEvent) GetAggregateType() string
func (*BaseDomainEvent) GetEventType ¶
func (e *BaseDomainEvent) GetEventType() string
func (*BaseDomainEvent) GetOccurredAt ¶
func (e *BaseDomainEvent) GetOccurredAt() time.Time
func (*BaseDomainEvent) GetPayload ¶
func (e *BaseDomainEvent) GetPayload() interface{}
func (*BaseDomainEvent) GetVersion ¶
func (e *BaseDomainEvent) GetVersion() int
type BaseEvent ¶
type BaseEvent interface {
GetEventID() string
GetEventType() string
GetOccurredAt() time.Time
GetVersion() int
GetAggregateID() string
GetAggregateType() string
GetPayload() interface{}
}
BaseEvent 基础事件接口 所有事件都必须实现此接口
type EnterpriseDomainEvent ¶
type EnterpriseDomainEvent struct {
BaseDomainEvent
// ========== 企业级通用字段 ==========
// 租户隔离:多租户系统的核心字段
// 多租户系统:使用实际的租户ID(如 1, 2, 3)
// 单租户系统:使用 0 表示全局/无租户
TenantId int `json:"tenantId" gorm:"type:int;index;column:tenant_id;comment:租户ID"`
// ========== 可观测性字段 ==========
// 用于分布式追踪和因果链路分析
CorrelationId string `json:"correlationId,omitempty" gorm:"type:varchar(255);index;column:correlation_id;comment:业务关联ID"`
CausationId string `json:"causationId,omitempty" gorm:"type:varchar(255);index;column:causation_id;comment:因果事件ID"`
TraceId string `json:"traceId,omitempty" gorm:"type:varchar(255);index;column:trace_id;comment:分布式追踪ID"`
}
EnterpriseDomainEvent 企业级领域事件结构 在BaseDomainEvent基础上增加企业级通用字段 适用于:多租户SaaS系统、企业级应用
func NewEnterpriseDomainEvent ¶
func NewEnterpriseDomainEvent(eventType string, aggregateID interface{}, aggregateType string, payload interface{}) *EnterpriseDomainEvent
NewEnterpriseDomainEvent 创建企业级领域事件
func (*EnterpriseDomainEvent) GetCausationId ¶
func (e *EnterpriseDomainEvent) GetCausationId() string
func (*EnterpriseDomainEvent) GetCorrelationId ¶
func (e *EnterpriseDomainEvent) GetCorrelationId() string
可观测性方法
func (*EnterpriseDomainEvent) GetTenantId ¶
func (e *EnterpriseDomainEvent) GetTenantId() int
企业级特定方法
func (*EnterpriseDomainEvent) GetTraceId ¶
func (e *EnterpriseDomainEvent) GetTraceId() string
func (*EnterpriseDomainEvent) SetCausationId ¶
func (e *EnterpriseDomainEvent) SetCausationId(id string)
func (*EnterpriseDomainEvent) SetCorrelationId ¶
func (e *EnterpriseDomainEvent) SetCorrelationId(id string)
func (*EnterpriseDomainEvent) SetTenantId ¶
func (e *EnterpriseDomainEvent) SetTenantId(id int)
func (*EnterpriseDomainEvent) SetTraceId ¶
func (e *EnterpriseDomainEvent) SetTraceId(id string)
type EnterpriseEvent ¶
type EnterpriseEvent interface {
BaseEvent
// 租户隔离
GetTenantId() int
SetTenantId(int)
// 可观测性方法
GetCorrelationId() string
SetCorrelationId(string)
GetCausationId() string
SetCausationId(string)
GetTraceId() string
SetTraceId(string)
}
EnterpriseEvent 企业级事件接口 多租户系统和需要可观测性支持的系统应实现此接口