命令模式
命令模式是一种行为设计模式,它可将请求转换为一个包含与请求相关的所有信息的独立对象。该转换能根据不同的请求将方法参数化、延迟请求执行或将其放入队列中,且能实现可撤销操作。
Hystrix是Netflix开源的一款容错框架,具有自我保护能力。可以阻止故障的连锁反应,快速失败和优雅降级。
它用一个HystrixCommand或者HystrixObservableCommand包装所有对外部系统/依赖的调用,每个命令在单独线程中/信号授权下执行。这正是命令模式的典型应用。
看一个Hystrix应用的例子。
首先,需要创建一个具体的命令类,通过构造函数传递接收者对象。
- public class OrderServiceHystrixCommand extends HystrixCommand
-
- //接收者,处理业务逻辑
- private OrderService orderService;
- public OrderServiceHystrixCommand(OrderService orderService) {
- super(setter());
- this.orderService = orderService;
- }
- //设置Hystrix相关参数
- public static Setter setter() {
- HystrixCommandGroupKey groupKey = HystrixCommandGroupKey.Factory.asKey("orderGroup");
- HystrixCommandKey commandKey = HystrixCommandKey.Factory.asKey("orderService");
- HystrixThreadPoolProperties.Setter threadPoolProperties = HystrixThreadPoolProperties.Setter().withCoreSize(1)
- .withQueueSizeRejectionThreshold(1);
- HystrixCommandProperties.Setter commandProperties = HystrixCommandProperties.Setter();
- return Setter.withGroupKey(groupKey)
- .andCommandKey(commandKey)
- .andThreadPoolPropertiesDefaults(threadPoolProperties)
- .andCommandPropertiesDefaults(commandProperties);
- }
- @Override
- protected Object run() throws InterruptedException {
- Thread.sleep(500);
- return orderService.orders();
- }
- @Override
- protected Object getFallback() {
- System.out.println("-------------------------------");
- return new ArrayList();
- }
- }
然后,在客户端调用的时候,创建这个命令类并执行即可。
- @RestController
- public class OrderController {
- @Autowired
- OrderService orderService;
- @RequestMapping("/orders")
- public Object orders(){
- OrderServiceHystrixCommand command = new OrderServiceHystrixCommand(orderService);
- return command.execute();
- }
- }
看上去,命令模式和策略模式有些相像,它们都可以通过某些行为来参数化对象。但它们的思想有很大区别。
比如说可以使用命令来将任何操作转换为对象,操作的参数将成为对象的成员变量。同样的,也可以对请求做任何操作,比如延迟执行,记录日志,保存历史命令等。
而策略模式侧重点在于描述完成某件事的不同方式,能够在同一个上下文类中切换算法。