O Zuul fornece funções de arquivador e roteador no sistema de microsserviço SpringCloud, que é uma parte indispensável dos microsserviços. Além da implementação padrão do Filer, ele também pode personalizar autorização, limitação atual, verificação de segurança etc., e o roteador pode substituir completamente o proxy reverso do NGINX. O manuseio de exceção do Zuul é feito pelo SendErrorFilter.
Durante nosso processo de inscrição, descobrimos que existem dois problemas que não são muito amigáveis para usar o filtro de exceção padrão:
1. É impossível identificar rapidamente se a rota de solicitação de serviço está cronometrada ou não há nós disponíveis. Se ocorrer um erro, você só poderá visualizar o log e localizá -lo através da pilha;
2. Incapaz de ser compatível com formatos de pacote de resposta personalizados, como {code:500,msg:”xx error”} formato.
Em seguida, estamos discutindo como personalizar o manuseio de exceções, personalizar informações prontas para exceções, etc.
Primeiro de tudo, devemos desativar o sendrorFilter padrão. O funcionário forneceu a configuração do comutador, para que você possa configurá -lo diretamente.
zuul.senderrorFilter.post.disable = true
Filter de erro personalizado, não vou dizer muito aqui, basta postar o código
classe pública ErrorFilter estende o zuulfilter {private static final string error_status_code_key = "error.status_code"; logger privado log = loggerFactory.getLogger (errorFilter.class); public static final string default_err_msg = "O sistema está ocupado, tente novamente mais tarde"; @Override public String filterType () {return "post"; } @Override public int filterOrder () {return 0; } @Override public boolean devefilter () {requestContext ctx = requestcontext.getCurrentContext (); retornar ctx.containsKey (error_status_code_key); } @Override public Object run () {requestContext ctx = requestContext.getCurrentContext (); tente {httpServletRequest request = ctx.getRequest (); int statuscode = (número inteiro) ctx.get (error_status_code_key); String message = (string) ctx.get ("error.message"); if (ctx.containsKey ("error.exception")) {throwable e = (excepção) ctx.get ("error.exception"); Reproduzível re = getoriginexception (e); if (re instanceof java.net.connectException) {message = "conexão de serviço real recusada"; log.warn ("URI: {}, erro: {}", request.getRequesturi (), re.getMessage ()); } else if (re instanceof java.net.sockettimeoutException) {message = "Timeout de serviço real"; log.warn ("URI: {}, erro: {}", request.getRequesturi (), re.getMessage ()); } else if (re instanceof com.netflix.client.clientException) {message = re.getMessage (); log.warn ("URI: {}, erro: {}", request.getRequesturi (), re.getMessage ()); } else {log.warn ("Erro durante a filtragem", e); }} if (stringUtils.isblank (message)) message = default_err_msg; request.setAttribute ("javax.servlet.error.status_code", statusCode); request.setAttribute ("javax.servlet.error.message", mensagem); Webutils.Responseoutjson (ctx.getResponse (), jsonutils.tojson (novo wapperSponse <> (statusCode, mensagem))); } catch (Exceção e) {string error = "Erro durante a filtragem [ErrorFilter]"; log.error (erro, e); Webutils.Responseoutjson (ctx.getResponse (), jsonutils.tojson (novo wapperSponse <> (500, erro))); } retornar nulo; } Private Throwable Getoriginexception (Throwable e) {e = e.getcause (); while (e.getCause ()! = null) {e = e.getCause (); } retornar e; }}Finalmente registre nosso Filter de erro personalizado
@Bean public ErrorFilter ErrorFilter () {return new ErrorFilter ();}Resumir
O acima exposto é o método de implementação de manuseio de exceção de exceção do Spring Cloud Zuul, introduzido no editor. Espero que seja útil para você. Se você tiver alguma dúvida, deixe -me uma mensagem e o editor responderá a você a tempo. Muito obrigado pelo seu apoio ao site wulin.com!