Reference
针对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 | curl -H "Content-type:application/json" -X POST -d |
修改 发送必要信息 只有string orderId发送
用subscriber来模拟处理订单需要的时间,然后再开始配送
RabbitMQ
下载了windows版(关于和linux虚拟机斗争的故事之后再说。。)
激活命令:
1 | rabbitmq-plugins.bat enable rabbitmq_management |
默认账号和密码:guest/guest
暂时先用webclient发送消息 因此消息队列在本次作业中没有用上
Thoughts
Future 获取结果 在发布任务的服务中可能需要
Mono/Flux区别: Mono 0-1item,Flux 0-n items
callback和future的区别?Futures are better than callbacks