我们在对数据库的操作时,可以进行读写分离,但是我们的业务层却没有做到读写分离,因为业务的读和写都是公用一个
model对象,需要进行一些并发的控制。
cqrs(Command Query responsibility segregation) Command就是包含增删改,query就是查询,通过这种分离的好处就是可以分别对Command操作和query操作分开进行优化或者一些处理。
在cqrs架构中,增删改都会相当于发送了一个command,然后通过commandBus来进行分发。示例demo如下:
public interface Command<T> {
Object execute(T commandModel);
}
Command接口即是对增删改操作的抽象接口
public class CreateOrderCommand implements Command<CreateOrderCommandModel>{
@Override
public Object execute(CreateOrderCommandModel commandModel) {
return Info.container.put(commandModel.getId(),commandModel);
}
}
具体的实现类(新增订单命令)
@Component
public class CommandBus<T> {
public Object dispatch(Command cmd,T model){
return cmd.execute(model);
}
}
commandBus负责分发command,交给具体的实现类去处理
@RestController
public class OrderController {
@Autowired
private CommandBus commandBus;
@PostMapping("order")
public ResponseEntity addOrder(@RequestBody CreateOrderCommandModel model){
commandBus.dispatch(new CreateOrderCommand(),model);
return ResponseEntity.ok("SUCCESS");
}
}
这个是Controller类,通过commandBus来分发不同的命令
@Data
public class CreateOrderCommandModel {
private Integer id;
private String name;
}
实体类
通过上面的简单demo即演示了一下cqrs的简单流程,对于大家理解cqrs可能会有一些帮助。