Zuul在springcloud微服务体系中提供筛选器和路由器功能,是微服务不可或缺的部分.filer处理默认实现的外还可以自定义进行授权,限流,安全校验等,路由器完全可以替代Nginx反向代理.Zuul异常处理就是由SendErrorFilter完成。
在我们应用过程我们发现使用默认的异常滤波器有两个问题不是很友好:
1。无法快速识别出是否是请求路由的服务超时还是没有任何可用节点,发生错误只能查看日志通过堆栈去定位;
2。无法兼容自定义的譬如<代码>{味精,交易代码:500:“xx错误”}代码>格式的响应包格式。
接下来我们讨论的是如何自定义异常处理,自定义异常提示信息等。
首先,我们必须禁用默认的SendErrorFilter,官方已经提供了开关配置,直接配置即可
zuul.SendErrorFilter.post.disable=true
自定义ErrorFilter,这里就不多说,直接贴代码
公开课ErrorFilter延伸ZuulFilter { 私有静态最终字符串ERROR_STATUS_CODE_KEY=癳rror.status_code”; 私人日志记录器=LoggerFactory.getLogger (ErrorFilter.class); 公共静态最终字符串DEFAULT_ERR_MSG="系统繁忙,请稍后再试”; @Override 公共字符串filterType () { 返回“post”; } @Override 公共int filterOrder () { 返回0; } @Override 公共布尔shouldFilter () { RequestContext ctx=RequestContext.getCurrentContext (); 返回ctx.containsKey (ERROR_STATUS_CODE_KEY); } @Override 公共对象的run () { RequestContext ctx=RequestContext.getCurrentContext (); 尝试{ HttpServletRequest请求=ctx.getRequest (); int statusCode=(整数)ctx.get (ERROR_STATUS_CODE_KEY); 字符串消息=(字符串)ctx.get (“error.message”); 如果(ctx.containsKey (“error.exception”)) { Throwable e=(异常)ctx.get (“error.exception”); Throwable re=getOriginException (e); 如果(重新instanceof java.net.ConnectException) { 消息=罢嬲姆窳泳芫? 日志。警告(uri:{},错误:{}”,request.getRequestURI (), re.getMessage ()); }else if(重新instanceof java.net.SocketTimeoutException) { 消息="实际服务超时”; 日志。警告(uri:{},错误:{}”,request.getRequestURI (), re.getMessage ()); }else if(重新instanceof com.netflix.client.ClientException) { 消息=re.getMessage (); 日志。警告(uri:{},错误:{}”,request.getRequestURI (), re.getMessage ()); 其他}{ 日志。警告(“错误在过滤”,e); } } 如果(StringUtils.isBlank(消息))消息=DEFAULT_ERR_MSG; request.setAttribute (“javax.servlet.error。statusCode status_code”); request.setAttribute (“javax.servlet.error。信息”,消息); JsonUtils WebUtils.responseOutJson (ctx.getResponse ()。toJson(新WrapperResponse<祝辞(statusCode、消息))); }捕捉(异常e) { 字符串错误=按砦笤诠?ErrorFilter)”; log.error(错误,e); JsonUtils WebUtils.responseOutJson (ctx.getResponse ()。toJson(新WrapperResponse<祝辞(500错误))); } 返回null; } 私人Throwable getOriginException (Throwable e) { e=e.getCause (); 而(e.getCause () !=null) { e=e.getCause (); } 返回e; } }
最后注册我们自定义的ErrorFilter
@ bean 公共ErrorFilter ErrorFilter () { 返回新ErrorFilter (); }
以上所述是小编给大家介绍的春云zuul自定义统一异常处理实现方法,希望对大家有所帮助,如果大家有任何疑问请给我留的言,小编会及时回复大家的。在此也非常感谢大家对网站的支持!