Zuul proporciona funciones de Filer y Router en el sistema de microservicio de SpringCloud, que es una parte indispensable de los microservicios. Además de la implementación predeterminada de Filer, también puede personalizar la autorización, la limitación actual, la verificación de seguridad, etc., y el enrutador puede reemplazar por completo el proxy inverso de NGINX. El manejo de excepciones de Zuul se realiza por SendErrorFilter.
Durante nuestro proceso de solicitud, descubrimos que hay dos problemas que no son muy amigables para usar el filtro de excepción predeterminado:
1. Es imposible identificar rápidamente si la ruta del servicio solicita está programada o no hay nodos disponibles. Si se produce un error, solo puede ver el registro y localizarlo a través de la pila;
2. No se puede compatir con formatos de paquete de respuesta personalizado como {code:500,msg:”xx error”} Formato.
A continuación, estamos discutiendo cómo personalizar el manejo de excepciones, personalizar la información de solicitud de excepción, etc.
En primer lugar, debemos deshabilitar el sendErrorFilter predeterminado. El funcionario ha proporcionado la configuración del conmutador, por lo que puede configurarla directamente.
zuul.senderrorfilter.post.disable = true
Errorfilter personalizado, no diré mucho aquí, solo publique el código
ErrorFilter de clase pública extiende Zuulfilter {private static final String Error_status_code_key = "Error.status_code"; privado logger log = loggerFactory.getLogger (errorfilter.class); Public static final String default_err_msg = "El sistema está ocupado, intente nuevamente más tarde"; @Override public String filtType () {return "post"; } @Override public int filterOrder () {return 0; } @Override public boolean deberíafilter () {requestContext ctx = requestContext.getCurrentContext (); return ctx.containskey (error_status_code_key); } @Override public object run () {requestContext ctx = requestContext.getCurrentContext (); intente {httpservletrequest request = ctx.getRequest (); int statuscode = (integer) ctx.get (error_status_code_key); String Message = (String) ctx.get ("Error.message"); if (ctx.containskey ("error.exception")) {showable e = (excepción) ctx.get ("error.exception"); REDIBLE RE = GETORIGINEXCEPTION (E); if (re instanceof java.net.connectException) {mensaje = "conexión de servicio real rechazada"; log.warn ("uri: {}, error: {}", request.getRequesturi (), re.getMessage ()); } más if (re log.warn ("uri: {}, error: {}", request.getRequesturi (), re.getMessage ()); } else if (re log.warn ("uri: {}, error: {}", request.getRequesturi (), re.getMessage ()); } else {log.warn ("error durante el filtrado", e); }} if (stringUtils.isblank (mensaje)) Message = default_err_msg; request.setAttribute ("javax.servlet.error.status_code", statuscode); request.setAttribute ("javax.servlet.error.message", mensaje); Webutils.ResponseutJson (ctx.getResponse (), jsonutils.tojson (new wrapPerResponse <> (statuscode, mensaje))); } capt (excepción e) {string error = "error durante el filtrado [errorfilter]"; log.error (error, e); Webutils.ResponseOutJson (ctx.getResponse (), jsonutils.tojson (new WrapPerResponse <> (500, error))); } return null; } getRoRiginexception privado lanzable (lanzable e) {e = e.getCause (); while (e.getCause ()! = null) {e = e.getCause (); } return e; }}Finalmente registre nuestro Filter de error personalizado
@Bean Public ErrorFilter ErrorFilter () {return new ErrorFilter ();}Resumir
Lo anterior es el método de implementación Spring Cloud Zuul Custom Unified Exception Handling Manejo introducido por el editor. Espero que te sea útil. Si tiene alguna pregunta, déjame un mensaje y el editor le responderá a tiempo. ¡Muchas gracias por su apoyo al sitio web de Wulin.com!