服务错误处理
Lagom提供了许多不同的机制来控制和定制服务之间处理和报告错误的方式。
Lagom内置错误处理的设计背后有许多原则:
- 在生产中,Lagom服务永远不应该向另一个服务提供它遇到的错误的详细信息,除非它知道这样做是安全的。出于安全原因,攻击者可以使用未经审查的错误消息来获取有关服务实现方式的详细信息。实际上,这意味着Lagom认为有许多内置异常是安全的,它将返回这些异常的详细信息,其余的则不返回任何内容。
- 在开发中,通过网络发送完整的错误消息非常有用。Lagom将尝试在开发中运行服务时发送有关异常的有用信息。
- 如果可能,Lagom将在服务端抛出错误时尝试在客户端重建错误。因此,如果服务器端抛出异常,表示无法序列化某些内容,那么客户端代码应该会收到相同的异常。
- 如果可能,异常应该映射到惯用的协议响应代码,例如HTTP 4xx和5xx状态代码以及WebSocket错误关闭代码。
如果使用Lagom使用服务(在Lagom或第三方堆栈中实现),Lagom提供的客户端将把状态代码值在4xx和5xx范围内的响应映射到异常。这会影响客户端用于连接到该端点的断路器。默认情况下,Lagom断路器会将任何异常视为故障,但该行为是可配置的。因此,4xx和5xx将被映射到异常,但您可以将某些异常列为不应使断路器跳闸的白名单。
异常序列化
Lagom提供了[ExceptionSerializer](https://www.lagomframework.com/documentation/1.6.x/scala/api/com/lightbend/lagom/scaladsl/api/deser/ExceptionSerializer.html)
特质,允许将异常序列化为某种形式,例如JSON,并选择错误代码。它还允许根据错误代码及其序列化形式重新创建异常。
异常序列化程序将异常转换为[RawExceptionMessage](https://www.lagomframework.com/documentation/1.6.x/scala/api/com/lightbend/lagom/scaladsl/api/deser/RawExceptionMessage.html)
。原始异常消息包含一个状态代码,它将对应于HTTP状态代码或WebSocket关闭代码、一个消息正文和一个协议描述符,用于说明消息的内容类型——在HTTP中,这将转换为响应中的 Content-Type
消息头。
Lagom提供的默认异常序列化程序使用Play JSON将异常序列化为JSON。此异常序列化程序实现了上述指导原则——除非处于开发阶段,否则它只会在[TransportException](https://www.lagomframework.com/documentation/1.6.x/scala/api/com/lightbend/lagom/scaladsl/api/transport/TransportException.html)
的子类中返回异常的详细信息。TransportException
有几个有用的内置子类可供使用,包括[NotFound](https://www.lagomframework.com/documentation/1.6.x/scala/api/com/lightbend/lagom/scaladsl/api/transport/NotFound.html)
和[PolicyViolation](https://www.lagomframework.com/documentation/1.6.x/scala/api/com/lightbend/lagom/scaladsl/api/transport/PolicyViolation.html)
。Lagom通常能够向客户机抛出这些异常。您也可以直接实例化TransportException
并使用它,或者您可以定义TransportException
的子类,但是请注意,Lagom不会在客户机中抛出该子类,因为它不知道该子类,除非您提供自定义异常序列化程序来处理该子类。