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原始响应抛出自己的异常
我们正在尝试将 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原始响应抛出自己的异常