Zuul fournit des fonctions de fichier et de routeur dans le système de microservice SpringCloud, qui est une partie indispensable des microservices. En plus de l'implémentation par défaut de Filer, il peut également personnaliser l'autorisation, la limitation actuelle, la vérification de sécurité, etc., et le routeur peut complètement remplacer le proxy inverse Nginx. La gestion de l'exception de Zuul est réalisée par SenderrorFilter.
Au cours de notre processus de candidature, nous avons constaté qu'il y avait deux problèmes qui ne sont pas très conviviaux pour utiliser le filtre d'exception par défaut:
1. Il est impossible d'identifier rapidement si l'itinéraire de demande de service est expiré ou qu'il n'y a pas de nœuds disponibles. Si une erreur se produit, vous ne pouvez afficher le journal et le localiser via la pile;
2. Impossible de se compatible avec les formats de package de réponse personnalisés tels que {code:500,msg:”xx error”} Format.
Ensuite, nous discutons de la façon de personnaliser la gestion des exceptions, de personnaliser les informations d'invite d'exception, etc.
Tout d'abord, nous devons désactiver le SenderrorFilter par défaut. Le fonctionnaire a fourni la configuration du commutateur, vous pouvez donc le configurer directement.
zuul.senderrorfilter.post.disable = true
ErrorFilter personnalisé, je ne dirai pas grand-chose ici, il suffit de publier le code
Classe publique ErrorFilter étend ZuulFilter {String static final static error_status_code_key = "error.status_code"; Logger privé Log = loggerfactory.getLogger (errorFilter.class); Public Static Final String default_err_msg = "Le système est occupé, veuillez réessayer plus tard"; @Override public String filterType () {return "post"; } @Override public int filterOrder () {return 0; } @Override public boolean aitfilter () {requestContext ctx = requestContext.getCurrentContext (); return ctx.containsKey (error_status_code_key); } @Override public objet run () {requestContext ctx = requestContext.getCurrentContext (); essayez {httpServLetRequest request = ctx.getRequest (); int statuscode = (entier) ctx.get (error_status_code_key); String Message = (String) ctx.get ("error.sessage"); if (ctx.containsKey ("error.exception")) {throwable e = (exception) ctx.get ("error.exception"); Throwable re = getoriginexception (e); if (re instanceof java.net.connectException) {message = "Real Service Connection Refused"; log.warn ("uri: {}, error: {}", request.getRequeSturi (), re.getMessage ()); } else if (re instanceof java.net.sockettimeoutException) {message = "real service timeout"; log.warn ("uri: {}, error: {}", request.getRequeSturi (), re.getMessage ()); } else if (re instanceof com.netflix.client.clientException) {message = re.getMessage (); log.warn ("uri: {}, error: {}", request.getRequeSturi (), re.getMessage ()); } else {log.warn ("erreur pendant le filtrage", e); }} if (stringUtils.isblank (message)) message = default_err_msg; request.setAttribute ("javax.servlet.error.status_code", statuscode); request.setAttribute ("javax.servlet.error.mesage", message); Webutils.ResponseAutjson (ctx.getResponse (), jsonUtils.tojson (new-tassersonseon <> (statuscode, message))); } catch (exception e) {String error = "error pendant le filtrage [errorFilter]"; log.Error (erreur, e); Webutils.ResponseAutjson (ctx.getResponse (), jsonUtils.tojson (new-tasserruponse <> (500, erreur))); } return null; } private thringable getoriginexception (throwable e) {e = e.getCause (); while (e.getCause ()! = null) {e = e.getCause (); } return e; }}Enfin enregistrez notre fichier d'erreur personnalisé
@Bean public errorFilter errorFilter () {return new errorFilter ();}Résumer
Ce qui précède est le Spring Cloud Zuul personnalisé Unified Gestion de la méthode d'implémentation de gestion de l'exception qui vous est présentée par l'éditeur. J'espère que cela vous sera utile. Si vous avez des questions, veuillez me laisser un message et l'éditeur vous répondra à temps. Merci beaucoup pour votre soutien au site Web Wulin.com!