AW09-Reactive Version

Reference

sa-spring/employee-reactive

针对delivery系统先尝试

EmployeeController 负责处理网页请求,返回的是用Mono或者Flux包装的数据结构

webclient 不管处理怎样的请求 都会显示取两个请求来处理

  • EmployeeRepository/Employee 基础设施
    • repository是内存中 可以模仿之前某次作业里的持久化 或者改进时再做

Simple version: 发送一个请求立刻传送 模拟高占时的计算任务

  • OrderInfo(需要添加买家名字和地址 order调整时在做,暂定是)应该在order中 迁移;

    • Stirng id
    • Items 信息(联调实现)
  • DeliveryInfo pos-api 生成随机时长 显示在路上(log)最后告知已经送达

    • String 信息
    • 是否已经送达(?)

Todo

  • rabbitmq 配置

    stream来发送 在yml里配置

  • order创建好DeliveryDto再发送 才能用mapper 在order中订阅

  • 可以用web client来发送请求

Test Ref: sa-spring/spring-webflux

测试用例可以写成mvn项目

Implementation

Tips: 把本地jar包添加到本地依赖库:

mvn install:install-file -Dfile=./target/pos-api-0.0.1-SNAPSHOT.jar -Dgroup=com.micropos -DartifactId=micropos -Dversion=0.0.1

Delivery Service

采用了reactive的设计 但是只体现在了mono这种流式处理的数据结构上,自定义的consume只在应用刚启动的时候调用了一次

client中的retrieve是用来定义提取什么部分的,只有在有订阅的时候

onSubscribe都是在订阅的之后 publish请求的时候才会被调用

sa-spring/employee-reactive,是把数据库作为publisher 服务器作为subscriber,这样subscriber可以控制数据产生的速度 order中有mono注册来subscribe 即下运输单的时候取决于运输服务的情况

改接口为Dto 方便服务间传输数据,测试样例不变

1
curl -H "Content-type:application/json" -X POST -d '{"orderId":"001","deliveryId":"001","delivered":"false"}' http://localhost:8090/delivery/add

Order Service

order

按照规范建立 建立rabbit stream传输

参照employee subscribe(感觉合适一些一对多场景?)

测试 发送一个只有一个product的order来测试(之后修改carts)

如果用stream delivery需要改进配合stream

如果是独立服务 那么用get uri?

问题:controller用webflux还是普通的 在service层抽象 repos返回orderInfo service层用mapper转换 flux来返回

add 订阅

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
curl -H "Content-type:application/json" -X POST -d
'
{
"id":"c001",
"items": [
{"id":1,
"quantity":2
"product":
{
"id": "p01",
"name": "product1",
"price": 20.0
"image": "xxx"
}
}
]
}
'
http://localhost:8089/order/add

修改 发送必要信息 只有string orderId发送

用subscriber来模拟处理订单需要的时间,然后再开始配送

RabbitMQ

下载了windows版(关于和linux虚拟机斗争的故事之后再说。。)

激活命令:

1
rabbitmq-plugins.bat enable rabbitmq_management

访问界面:http://127.0.0.1:15672/

默认账号和密码:guest/guest

后续参考

image-20220704232815224

暂时先用webclient发送消息 因此消息队列在本次作业中没有用上

Thoughts

Future 获取结果 在发布任务的服务中可能需要

Mono/Flux区别: Mono 0-1item,Flux 0-n items

callback和future的区别?Futures are better than callbacks

Future,Callback,Promise

image-20220630094227028

image-20220630094214316