Spring Cloud Netflix:使用 Feign 处理远程服务错误

Spring Cloud Netflix: Remote service error handling with Feign

我们正在尝试将 Spring Cloud Netflix 投入生产环境。现在我们遇到了一个关于业务逻辑错误处理的问题。

我们使用 Feign 作为 HTTP REST 客户端。微服务A需要调用部署在不同JVM(或物理服务器)中的微服务B。微服务 B 可能 return 一些属于业务的错误消息。例如A需要向B查询订单信息,但是订单ID可能不存在,所以B必须return告诉A这个订单不存在的错误信息。 A要对return消息做if-else判断,判断是否有错误,那么代码就会像下面这样:

//remoteServiceA is an interface annotated with @FeignClient
resultA = remoteServiceA.foo();
if (resultA.hasError) {

} else {

}

resultB = remoteServiceB.foo();
if (resultB.hasError) {

} else {

}

// ... ...

这么多if-else,不够优雅。我们想要的是remoteServieA.foo()可以抛出一个自定义的运行时异常,比如OrderNotExistException。有实现这个目标的想法吗?

如果您启用了 Hystrix,您应该能够将 serviceA.foo() 包装在一个 try 块中并在您的远程服务中抛出异常。

try {
    serviceA.foo();
} catch(HystrixRuntimeException ex) {
    throw new OrderNotExistException("Error message");
}

您仍然需要考虑到,如果您的远程服务没有应答,或者如果发生其他错误,您可以捕捉到这种异常。也许您可以找到有关发生的异常的信息,并决定是否应该抛出异常。

我想到的第一件事是在我的一个项目中工作。

我已经解决了这个问题。 我自定义了Feign的ErrorDecoder组件,可以根据HTTP原始响应抛出自己的异常