概述
- 基于EventFlow的经典DDD,具有CQRS-ES,HyperMedia API和无处不在的单元测试项目。它针对ASP.NET Core 3.1,可以部署到Docker和K8S
- 基于事件流
- 基于asp.net core3.1
- 通过EntityFramework,MongoDB,Elasticsearch实施读取模型
- 集成兔子并使用massTransit作为消息总线(正在进行中)
- 事件驱动的微服务集成(正在进行中)
- 基础架构作为Terraform的代码,创建了AWS EKS用于运输此应用程序
- 维基正在进行
这个项目的想法
- CQR通过分开命令和查询逻辑来帮助建模纯域
- 事件采购有助于脱钩域模型和持久性
- 结合CQR和活动采购使域模型更合理和纯净
- 同时,不同的有界环境可以演变为不同的微服务,而不同的微服务可以通过异步消息总线和事件进行交互
- 最后,我们获得了基于DDD的微服务体系结构。单个微服务可确保通过CQR和事件采购的域模型的纯度。不同的微服务可以通过消息总线进行交互。最后,所有服务都可以部署到云和K8
域和有限的上下文
该示例是关于航空公司公司的在线预订/检查。一家名为“ RestAirline ”的航空公司提供在线预订/检查。上述业务有四个可能的有限上下文:
-
Booking是关注在线预订的有限背景; -
Flight Availability是一个有限的环境,将搜索可用的航班和飞行时间表的重点放在首位; -
Checkin是关注在线检查的有限上下文; -
Seat Availability是一个有界环境,可维持每次航班的座位;
微服务和通信
通常,每个有限的上下文都可以作为独立的微服务构建,目前我刚刚创建了两个微服务: Booking和FlightAvailability 。这两个微服务之间存在一些相互作用,显而易见的行动是,当乘客选择的航班Booking微服务时, FlightAvailability Microservice中的可用航班数量应减去相应的金额。这个想法是,当乘客选择了Booking服务的航班时,一个名为JourneysSelectedEvent的事件将发布到消息总线上,任何对此事件感兴趣的微服务都可以订阅此事件并处理它。
如何运行
克隆这个仓库
git克隆https://g***ithub.com/twzhangyang/restairline.git
运行容器
然后使用docker-compose旋转一个新容器
码头组合
注意:添加一个-d以在背景中运行容器
API服务和MSSQL将在Docker中运行
在本地运行
该项目基于.NET Core 3.1,请为您的操作系统安装相应的SDK:
安装后,请在下面运行以下命令,以确保当前.NET核心版本为3.1.101 dotnet --version
运行API
1。尝试在Postman中输入Home API链接:
获取http:// localhost:61200/booking/home/
2。选择旅程
旅程项目应来自另一个名为“飞行可用性”的微服务,现在让我们在API中自动建立旅程,以方便起见。因此,您无需将任何旅程ID传递给此API。
邮寄 /预订 /旅行
3。添加乘客
我们可以从最后一个API响应中获得请求身体模式,成为整个API由HyperMedia设计。 API定义由resourceCommands\\addPassengerCommand下的最后一个API响应完全描述:
\"addPassengerCommand\":
{
\"bookingId\": \"booking-352cb1f3-0f68-4e04-a2f7-24036eb53ce7\",
\"name\": null,
\"passengerType\": 0,
\"age\": 0,
\"email\": null,
\"postUrl\": {
\"uri\": \"/booking/booking-352cb1f3-0f68-4e04-a2f7-24036eb53ce7/passenger\"
}
}
显然终点是:
http:// localhost:61100/booking/booking-352CB1F3-0F68-4E04-A2F7-24036EB53CE7/乘客
有效载荷模式是:
{
\"bookingId\": \"booking-352cb1f3-0f68-4e04-a2f7-24036eb53ce7\",
\"name\": null,
\"passengerType\": 0,
\"age\": 0,
\"email\": null,
}
bookingId已经填写,请尝试填写其他参数,例如:
{
\"bookingId\": \"booking-352cb1f3-0f68-4e04-a2f7-24036eb53ce7\",
\"name\": \"test\",
\"passengerType\": 0,
\"age\": 22,
\"email\": \"test@test.com\",
}
发送请求:
邮政预订/{bookingid}/乘客
4。获取预订
根据Last API的响应,您可以通过resourceLinks进行预订,也可以通过resourceCommand发布数据。
获取 /预订 /{bookingid}
5。更新乘客名称
商业
该示例是关于一家航空公司的在线预订。一家名为“ RestAirline ”的航空公司提供在线预订。
- 乘客提交了可用旅程之一之后,这意味着该乘客开始创建在线预订。
- 乘客可以提交多个可用的旅程,包括航班在内的每一段旅程。
- 乘客增加旅程后,他/她可以增加乘客。
- 预订中添加乘客后,乘客可以更新每个乘客的乘客名称。
- 乘客可以为每次航班提交可用的座位,每个乘客,座位可能只包括座位号。
- 一旦乘客提交座位,乘客仍然可以更新座位。
- 在所有这些步骤之后,乘客有机会为所有乘客订购保险。
- 最后一步是支付所有预订,如果付款成功,请为此预订创建PNR(六位数)。
- 所有航班都可以在线检查。乘客可以在以下时间窗口检查:
2H <= TimeWindow <=出发时间-30m
- 乘客可以在此步骤之后进行在线检查,乘客开始他/她的旅程。
