博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
zuul转发的一些常见异常
阅读量:5950 次
发布时间:2019-06-19

本文共 5029 字,大约阅读时间需要 16 分钟。

  hot3.png

##序 使用zuul作为api网关的话,经常会碰见一些异常,这里小结一下。

##ZuulException 这个是最外层的异常

public class ZuulException extends Exception {    public int nStatusCode;    public String errorCause;    /**     * Source Throwable, message, status code and info about the cause     * @param throwable     * @param sMessage     * @param nStatusCode     * @param errorCause     */    public ZuulException(Throwable throwable, String sMessage, int nStatusCode, String errorCause) {        super(sMessage, throwable);        this.nStatusCode = nStatusCode;        this.errorCause = errorCause;        incrementCounter("ZUUL::EXCEPTION:" + errorCause + ":" + nStatusCode);    }    /**     * error message, status code and info about the cause     * @param sMessage     * @param nStatusCode     * @param errorCause     */    public ZuulException(String sMessage, int nStatusCode, String errorCause) {        super(sMessage);        this.nStatusCode = nStatusCode;        this.errorCause = errorCause;        incrementCounter("ZUUL::EXCEPTION:" + errorCause + ":" + nStatusCode);    }    /**     * Source Throwable,  status code and info about the cause     * @param throwable     * @param nStatusCode     * @param errorCause     */    public ZuulException(Throwable throwable, int nStatusCode, String errorCause) {        super(throwable.getMessage(), throwable);        this.nStatusCode = nStatusCode;        this.errorCause = errorCause;        incrementCounter("ZUUL::EXCEPTION:" + errorCause + ":" + nStatusCode);    }    private static final void incrementCounter(String name) {        CounterFactory.instance().increment(name);    }}

##RibbonRoutingFilter spring-cloud-netflix-core-1.2.6.RELEASE-sources.jar!/org/springframework/cloud/netflix/zuul/filters/route/RibbonRoutingFilter.java 这个类抛了很多ZuulException:

@Override	public Object run() {		RequestContext context = RequestContext.getCurrentContext();		this.helper.addIgnoredHeaders();		try {			RibbonCommandContext commandContext = buildCommandContext(context);			ClientHttpResponse response = forward(commandContext);			setResponse(response);			return response;		}		catch (ZuulException ex) {			context.set(ERROR_STATUS_CODE, ex.nStatusCode);			context.set("error.message", ex.errorCause);			context.set("error.exception", ex);		}		catch (Exception ex) {			context.set("error.status_code",					HttpServletResponse.SC_INTERNAL_SERVER_ERROR);			context.set("error.exception", ex);		}		return null;	}

###forward

protected ClientHttpResponse forward(RibbonCommandContext context) throws Exception {		Map
info = this.helper.debug(context.getMethod(), context.getUri(), context.getHeaders(), context.getParams(), context.getRequestEntity()); RibbonCommand command = this.ribbonCommandFactory.create(context); try { ClientHttpResponse response = command.execute(); this.helper.appendDebug(info, response.getStatusCode().value(), response.getHeaders()); return response; } catch (HystrixRuntimeException ex) { return handleException(info, ex); } }

这里有一个HystrixRuntimeException,主要是跟hystrix相关的,比如超时等。 ###handleException

protected ClientHttpResponse handleException(Map
info, HystrixRuntimeException ex) throws ZuulException { int statusCode = HttpStatus.INTERNAL_SERVER_ERROR.value(); Throwable cause = ex; String message = ex.getFailureType().toString(); ClientException clientException = findClientException(ex); if (clientException == null) { clientException = findClientException(ex.getFallbackException()); } if (clientException != null) { if (clientException .getErrorType() == ClientException.ErrorType.SERVER_THROTTLED) { statusCode = HttpStatus.SERVICE_UNAVAILABLE.value(); } cause = clientException; message = clientException.getErrorType().toString(); } info.put("status", String.valueOf(statusCode)); throw new ZuulException(cause, "Forwarding error", statusCode, message); }

###findClientException

protected ClientException findClientException(Throwable t) {		if (t == null) {			return null;		}		if (t instanceof ClientException) {			return (ClientException) t;		}		return findClientException(t.getCause());	}

com.netflix.client.ClientException

public class ClientException extends Exception{	/**	 * 	 */	private static final long serialVersionUID = -7697654244064441234L;		/**     * define your error codes here     *      */    public enum ErrorType{        GENERAL,         CONFIGURATION,         NUMBEROF_RETRIES_EXEEDED,         NUMBEROF_RETRIES_NEXTSERVER_EXCEEDED,         SOCKET_TIMEOUT_EXCEPTION,         READ_TIMEOUT_EXCEPTION,        UNKNOWN_HOST_EXCEPTION,        CONNECT_EXCEPTION,        CLIENT_THROTTLED,        SERVER_THROTTLED,        NO_ROUTE_TO_HOST_EXCEPTION,        CACHE_MISSING;                static String getName(int errorCode){            if (ErrorType.values().length >= errorCode){                return ErrorType.values()[errorCode].name();            }else{                return "UNKNOWN ERROR CODE";            }        }    }//...}

想获取最新资讯,请关注微信公众号

输入图片说明

转载于:https://my.oschina.net/go4it/blog/994069

你可能感兴趣的文章
HBase 笔记3
查看>>
2017.11.23 display fun --STM8
查看>>
深入学习jQuery选择器系列第八篇——过滤选择器之伪子元素选择器
查看>>
一个关于log4j的悲伤的故事
查看>>
PCA
查看>>
ajax上传文件
查看>>
java中通过绝对路径将图片存入数据库
查看>>
简要记录浮点型数据的二进制存储格式
查看>>
ConcurrentHashMap(Java8)源码分析
查看>>
Python文件处理之文件指针(四)
查看>>
Numpy用法详解
查看>>
DataGridView在vb.net中的操作技巧
查看>>
PMP考试冲刺进行中。。。
查看>>
大换血的代价
查看>>
Learn in FCC(3)
查看>>
RunLoop--
查看>>
chrome 2行换行省略号 ... text-ellipse
查看>>
架构,改善程序复用性的设计~目录(附核心原代码)
查看>>
Unix编程艺术阅读笔记
查看>>
nginx配置location总结及rewrite规则写法
查看>>