在 Java 微服务系统中,错误检查在哪里?
in a Java MicroServices System where locate the error check?
我有一个控制器接收请求,将数据传递给服务,服务进行外部 http 调用,答案返回给服务,然后控制器 returns 一个网页。
错误消息或异常可能来自外部调用。
错误检查应该在调用外部的服务中进行还是在返回网页之前在控制器中进行?
很抱歉,这完全取决于您。
您可以在 HTTP 调用方法中捕获错误,或者如果您更喜欢全局捕获,则可以在控制器级别捕获所有内容。
如果您使用的是 Spring,我会查看 ControllerAdvice class 并在那里针对不同类型的错误实施我的捕获:
https://spring.io/blog/2013/11/01/exception-handling-in-spring-mvc
@ControllerAdvice
class GlobalControllerExceptionHandler {
@ResponseStatus(HttpStatus.CONFLICT) // 409
@ExceptionHandler(DataIntegrityViolationException.class)
public void handleConflict() {
// Nothing to do
}
}
仅在您知道如何继续的特定、合理方式的地方以及在应用程序顶层(如果您实现要由另一个应用程序使用的服务,则不存在)永远捕获异常。
当您收到来自外部调用的错误响应时,请确保将其视为异常,例如通过创建并抛出异常。
否则只需确保您的调用者获得适当的失败信息:
- 在一个 JVM 中让异常冒泡。
- 尽可能避免包装异常,以便您的调用者有机会轻松查看实际发生的情况,而无需展开多层异常包装器,并且还可以避免大量无用代码。
- 在 JVM 边界,将异常转换为适当的错误消息(例如 4xx 或 5xx HTTP 状态)。
- 在向客户端发送错误响应之前,记录错误。您客户的日志(如果存在的话)将不会包含有关该问题的所有信息,并且您很可能无法使用。
我有一个控制器接收请求,将数据传递给服务,服务进行外部 http 调用,答案返回给服务,然后控制器 returns 一个网页。
错误消息或异常可能来自外部调用。
错误检查应该在调用外部的服务中进行还是在返回网页之前在控制器中进行?
很抱歉,这完全取决于您。 您可以在 HTTP 调用方法中捕获错误,或者如果您更喜欢全局捕获,则可以在控制器级别捕获所有内容。
如果您使用的是 Spring,我会查看 ControllerAdvice class 并在那里针对不同类型的错误实施我的捕获: https://spring.io/blog/2013/11/01/exception-handling-in-spring-mvc
@ControllerAdvice
class GlobalControllerExceptionHandler {
@ResponseStatus(HttpStatus.CONFLICT) // 409
@ExceptionHandler(DataIntegrityViolationException.class)
public void handleConflict() {
// Nothing to do
}
}
仅在您知道如何继续的特定、合理方式的地方以及在应用程序顶层(如果您实现要由另一个应用程序使用的服务,则不存在)永远捕获异常。
当您收到来自外部调用的错误响应时,请确保将其视为异常,例如通过创建并抛出异常。
否则只需确保您的调用者获得适当的失败信息:
- 在一个 JVM 中让异常冒泡。
- 尽可能避免包装异常,以便您的调用者有机会轻松查看实际发生的情况,而无需展开多层异常包装器,并且还可以避免大量无用代码。
- 在 JVM 边界,将异常转换为适当的错误消息(例如 4xx 或 5xx HTTP 状态)。
- 在向客户端发送错误响应之前,记录错误。您客户的日志(如果存在的话)将不会包含有关该问题的所有信息,并且您很可能无法使用。