我尝试像这样处理rpc异常
尝试{ rpcService.invokeRemoteMethod(富)
} catch(例外e){ logger.error(“invokeRemoteMethod failed,foo = {}”,foo); 抛出CustomException(…
在我看来,断路器是控制记录的适当模式(如果延迟很高,也可以防止DOS服务)。如果更多说5个例外(可以是每个服务的配置),电路可以打开,这样如果远程服务关闭,应用程序不会调用并记录错误。
根据您的项目,您可以使用开源断路器,也可以使用AOP编写简单的断路器或使用断路器包装RPC类。
理解的非常简单的例子是
public abstract class CircuitBreaker { private Circuit circuit; public CircuitBreaker(){ circuit = new Circuit(); } public void execute() { if(circuit.isOpen()) { throw CircuitOpenException(); } invokeService(); } protected void recordFailure(){ circuit.recordFailure(); } protected abstract <T extends Object> T invokeService(); } public class RPCServiceExecutor extends CircuitBreaker { protected Result invokeService() { try { Result result = rpcService.invokeRemoteMethod(foo); return new Result(); } catch (Exception e) { this.recordFailure(); logger.error("invokeRemoteMethod failed, foo = {} ", foo); throw CustomException(e); } } }
当电路打开时不记录异常,当电路关闭时总是记录异常。
有关更多详细信息和示例,请参阅
https://martinfowler.com/bliki/CircuitBreaker.html
https://commons.apache.org/proper/commons-lang/apidocs/org/apache/commons/lang3/concurrent/CircuitBreaker.html
https://spring.io/guides/gs/circuit-breaker/
希望这有帮助。如果您需要更详细的实例,请告诉我。