说到 Netflix Hystrix 框架,一定离不开 com.netflix.hystrix.HystrixCommand,这个类是 Netflix 开源的 Hystrix 框架中的一个关键类,用于实现服务的容错和熔断功能。它主要用于将远程服务调用封装成一个独立的命令对象,以便于进行容错处理和监控。
源码中有几个关键方法,具体方法以及注释看下面的代码:
public abstract class HystrixCommand < R > extends AbstractCommand < R > implements HystrixExecutable< R >, HystrixInvokableInfo< R >, HystrixObservable< R > {
/**
* 用于【同步】执行命令
*/
public R execute() {
try {
return queue().get();
}
catch(Exception e) {
throw Exceptions.sneakyThrow(decomposeException(e));
}
}
/**
* 用于【异步】执行命令。
*/
public Future< R > queue() {
return f;
}
/**
* execute() 或 queue()失败的时候,返回兜底数据
*/
protected R getFallback() {
throw new UnsupportedOperationException("No fallback available.");
}
/**
* execute() 和 queue() 被调用的时候,执行的方法
*/
protected abstract R run() throws Exception;
}
HystrixCommand 的使用场景主要包括:
多个独立的业务逻辑场景非常适合使用 Netflix Hystrix 框架,它能并发执行所有的业务逻辑,帮我们提升系统的访问速度。
也能方便的监控每个业务逻辑执行时发生的异常、超时等异常,也很方便配置各个业务逻辑的兜底(fallback)等。
具体的业务场景如:多个独立的弹窗、多个独立的展示数据。这种业务场景都是一个页面位置中可能出现多种业务。
定制化自己的 AbstractCustomerCommand 类,这个类能够实现所有业务逻辑通用的逻辑。
也能实现,对每个业务逻辑发生 reject、异常、超时、熔断的时候的监控和日志。
public abstract class AbstractCustomerCommand<R> extends HystrixCommand<R> {
private final static Logger logger = LoggerFactory.getLogger(AbstractCustomerCommand.class);
public String key;
protected AbstractSecondScreenCommand(CommandThreadEnum commandThreadEnum) {
}
@Override
protected R run() throws Exception {
long t1 = System.currentTimeMillis();
R r = null;
try {
r = doExecute(t1);
} finally {
long cost = System.currentTimeMillis() - t1;
}
return r;
}
@Override
protected R getFallback() {
boolean isRejected = isResponseRejected();
boolean isException = isFailedExecution();
boolean isTimeout = isResponseTimedOut();
boolean isCircuit = isCircuitBreakerOpen();
// 添加异常情况的日志和监控
logger.error("{} fallback happened,isRejected:{},isException:{},isTimeout:{},isCircuit:{}",
key, isRejected, isException, isTimeout, isCircuit);
Throwable exception = getExecutionException();
if (exception != null) {
logger.error("{} fallback", key, exception);
}
return null;
}
protected abstract R doExecute(long start);
/*所有业务逻辑统一逻辑*/
public void commonLogic() {
}
}
@Slf4j
public class Case1Command extends AbstractCustomerCommand<User> {
// 构造函数
public LowPriceAreaCommand() {
}
@Override
protected DisplayCard doExecute(long start) {
// 具体业务逻辑
}
}
Case1Command caseCommand = new Case1Command();
// 异步执行
caseCommand.queue();
com.netflix.hystrix.HystrixCommand 是 Netflix Hystrix 框架中的核心类,用于实现服务的容错和熔断功能。
它通过封装远程服务调用,提供容错处理、熔断机制和监控统计等功能,适用于微服务架构和高并发场景。通过使用 HystrixCommand,可以提高系统的可用性、稳定性和性能。
我是伍六七,每天成长一点点,让每天都成为你的代表作!我们下期见。