【直播预告】程序员逆袭 CEO 分几步?
https://ahoowang.gitee.io/wow/
更新内容
https://ahoowang.gitee.io/wow/guide/query.html
Wow 除了为命令(
Command
)自动生成了 OpenAPI 端点,另外还提供了查询(Query
) OpenAPI 端点。 这意味着开发人员通常只需专注于编写领域模型,即可完成服务开发,而无需费心处理查询逻辑的实现,极大提升了开发效率。
- 特性(query): 新增
SnapshotQueryServiceRegistrar
以支持自动将所有本地聚合根查询服务注册到Spring
容器中。 - 特性(query): 为
SnapshotQueryService
API 添加属性NamedAggregate
- 重构(compensation): 使用
QueryDSL
替换MongoExecutionFailedQuery
- 依赖(build): 升级
org.testcontainers:testcontainers-bom
版本 到v1.19.7
查询服务注册器
SnapshotQueryServiceRegistrar
用于自动将所有本地聚合根查询服务注册到 Spring
容器中。 开发者可以通过指定的 Bean Name
从 BeanFactory
中获取相应的 SnapshotQueryService
。
Bean Name
命名规则:聚合根名称 + ".SnapshotQueryService"
。
使用案例:
构造函数注入
class OrderService( @Qualifier("example.order.SnapshotQueryService") private val queryService: SnapshotQueryService<OrderState> ) { fun getById(id: String): Mono<OrderState> { return condition { id(id) }.single(queryService).toState() } }
字段注入
@Qualifier("example.order.SnapshotQueryService") @Autowired private lateinit var queryService: SnapshotQueryService<OrderState>
操作符
操作符 | 描述 |
---|---|
AND | 对提供的条件列表执行逻辑与 |
OR | 对提供的条件列表执行逻辑或 |
ID | 匹配id 字段值等于指定值的所有文档 |
IDS | 匹配id 字段值等于指定值列表中的任何值的所有文档 |
TENANT_ID | 匹配tenantId 字段值等于指定值的所有文档 |
DELETED | 匹配deleted 字段值等于指定值的所有文档 |
ALL | 匹配所有文档 |
EQ | 匹配字段名称值等于指定值的所有文档 |
NE | 匹配字段名称值不等于指定值的所有文档 |
GT | 匹配给定字段的值大于指定值的所有文档 |
LT | 匹配给定字段的值小于指定值的所有文档 |
GTE | 匹配给定字段的值大于或等于指定值的所有文档 |
LTE | 匹配给定字段的值小于或等于指定值的所有文档 |
CONTAINS | 匹配给定字段的值包含指定值的所有文档 |
IN | 匹配字段值等于指定值列表中的任何值的所有文档 |
NOT_IN | 匹配字段值不等于任何指定值或不存在的所有文档 |
BETWEEN | 匹配字段值在指定值范围区间的所有文档 |
ALL_IN | 匹配所有文档,其中字段值是包含所有指定值的数组 |
STARTS_WITH | 匹配字段值以指定字符串开头的文档 |
ENDS_WITH | 匹配字段值以指定字符串结尾的文档 |
ELEM_MATCH | 条件与包含数组字段的所有文档相匹配,其中数组中至少有一个成员与给定的条件匹配。 |
NULL | 匹配字段值在指定值为null 的所有文档 |
NOT_NULL | 匹配字段值在指定值不为null 的所有文档 |
TRUE | 匹配字段值在指定值为true 的所有文档 |
FALSE | 匹配字段值在指定值为false 的所有文档 |
RAW | 原始操作符,将条件值直接作为原始的数据库查询条件 |
TODAY | 匹配数值类型时间戳字段在今天范围区间的所有文档。比如:today 为 2024-06-06 ,匹配范围 2024-06-06 00:00:00.000 ~ 2024-06-06 23:59:59.999 的所有文档 |
TOMORROW | 匹配数值类型时间戳字段在昨天范围区间的所有文档。比如:today 为 2024-06-06 ,匹配范围 2024-06-05 00:00:00.000 ~ 2024-06-05 23:59:59.999 的所有文档 |
THIS_WEEK | 匹配数值类型时间戳字段在本周范围区间的所有文档 |
NEXT_WEEK | 匹配数值类型时间戳字段在下周范围区间的所有文档 |
LAST_WEEK | 匹配数值类型时间戳字段在上周范围区间的所有文档 |
THIS_MONTH | 匹配数值类型时间戳字段在本月范围区间的所有文档。比如:today : 2024-06-06 ,匹配范围 : 2024-06-01 00:00:00.000 ~ 2024-06-30 23:59:59.999 的所有文档 |
LAST_MONTH | 匹配数值类型时间戳字段在上月范围区间的所有文档。比如:today : 2024-06-06 ,匹配范围 : 2024-05-01 00:00:00.000 ~ 2024-05-31 23:59:59.999 的所有文档 |
RECENT_DAYS | 匹配数值类型时间戳字段在指定值最近天数范围区间的所有文档。比如:today : 2024-06-06 ,近三天,匹配范围 : 2024-06-04 00:00:00.000 ~ 2024-06-06 23:59:59.999 的所有文档。即 : 今天、昨天、前天 |
QueryDsl
通过 QueryDsl
,您可以轻松构建复杂的查询条件,例如:
pagedQuery { pagination { index(1) size(10) } sort { "field1".asc() } condition { all() not { "field1" eq "value1" "field2" ne "value2" } "filed3" gt 1 "field4" lt 1 "field5" gte 1 "field6" lte 1 "field7" like "value7" "field8" isIn listOf("value8") "field9" notIn listOf("value9") "field10" between (1 to 2) "field11" all listOf("value11") "field12" startsWith "value12" "field13" elemMatch { "field14" eq "value14" } "field15".isNull() "field16".notNull() "field17".isTrue() "field18".isFalse() and { "field3" eq "value3" "field4" eq "value4" } or { "field3" eq "value3" "field4" eq "value4" } } }
OpenAPI
以下是一个示例 curl
命令,用于执行查询:
curl -X 'POST' \ 'http://localhost:8080/execution_failed/snapshot/pagination' \ -H 'accept: application/json' \ -H 'Content-Type: application/json' \ -d '{ "sort": [ { "field": "_id", "direction": "DESC" } ], "pagination": { "index": 1, "size": 10 }, "condition": { "field": "", "operator": "AND", "value": "", "children": [ { "field": "state.recoverable", "operator": "NE", "value": "UNRECOVERABLE", "children": [] }, { "field": "state.status", "operator": "NE", "value": "SUCCEEDED", "children": [] }, { "field": "state.isBelowRetryThreshold", "operator": "EQ", "value": false, "children": [] } ] } }'
TypeScript
在 TypeScript 中,您可以使用 Conditions
类来构建复杂的查询条件,例如:
Conditions.and( [ Conditions.ne(RECOVERABLE, UNRECOVERABLE), Conditions.ne(STATUS, SUCCEEDED), Conditions.eq(IS_BELOW_RETRY_THRESHOLD, false) ] )
简介
Wow 是一个基于领域驱动设计和事件溯源的现代响应式 CQRS 微服务开发框架,历经多年生产环境验证。
旨在帮助开发者构建现代化的、高性能且易于维护的微服务应用程序,充分发挥领域驱动设计和事件溯源等模式优势的同时降低应用的复杂性以及实践成本。
值得一提的是,领域驱动设计和事件溯源并非微服务架构的专属,Wow 框架不仅适用于微服务开发,同样也可用于构建基于领域驱动设计的单体应用程序。
快速开始
使用 Wow 项目模板快速创建基于 Wow 框架的 DDD 项目
特性概览
架构图
商业智能是企业决策的关键支持,而数据则是商业智能的分析原料。业务数据越为丰富有价值,商业智能的分析结果越准确,决策也就更加可靠。
与传统架构有着显著差异,Wow 提供了实时聚合根状态事件(StateEvent
)和聚合命令(Command
)作为数据分析的数据源,同时极大降低了实时 ETL(Extract
, Transform
, Load
)的难度。
在传统架构中,实现实时 ETL 通常需要经过繁琐的流程,包括 DB->CDC->Process->DB
,而在 Wow 框架中,仅需一段简单的 SQL 脚本即可完成这一过程。
另外,在传统架构中,使用 CDC(MySql Binlog
)数据仅记录数据的变化,缺乏明确的业务语义。进行业务分析时,需要基于数据状态的变化推断出业务语义,这往往需要进行大量的数据处理。 相较之下,Wow 框架直接提供了聚合根状态事件和聚合命令作为数据分析的数据源,极大降低了数据处理的难度。
Wow 提供的实时同步机制将数据实时同步至数据仓库(ClickHouse),为实时数据分析提供了极大的便利。这种方法为商业智能提供了强有力的支持,构建了一个实时数据分析系统,使决策制定能够基于及时而准确的信息。
你可以在这里了解更多关于 Wow 商业智能。
操作审计
操作审计是企业中保障安全性和合规性的重要组成部分,同时也是对系统操作进行监控和追踪的关键手段。Wow 框架在这方面为企业带来了显著的优势。
通过记录聚合命令(Command
)作为操作审计的数据源,Wow 框架能够详细追踪系统中的各种操作。 这些记录不仅包含了操作本身的内容,还涵盖了操作触发的副作用(领域事件),为审计提供了更为全面和准确的数据基础。
相较于传统审计方法,Wow 框架的操作审计的数据源具备更加明确的业务语义,以及操作后产生的明确领域事件。
此外,Wow 框架提供的实时数据同步机制也为操作审计带来了便利,确保了审计数据的及时性和一致性。
了解更多关于 Wow 操作审计。
还没有评论,来说两句吧...