总裁培训,高铬板锤,捧腹网每日动漫
zuul的核心逻辑都是由一系列filter过滤器链实现的,但是filter的类型不同,执行的时机也不同,效果自然也不一样,主要特点如下:
zuul内部有一套完整的机制,可以动态读取编译运行filter机制,filter与filter之间不直接通信,在请求线程中会通过requestcontext来共享状态,它内部是用threadlocal实现的,例如httpservletrequest、httpservletresponse、异常信息等。部分源码如下:
public class requestcontext extends concurrenthashmap<string, object> { private static final logger log = loggerfactory.getlogger(requestcontext.class); protected static class<? extends requestcontext> contextclass = requestcontext.class; private static requestcontext testcontext = null; protected static final threadlocal<? extends requestcontext> threadlocal = new threadlocal<requestcontext>() { @override protected requestcontext initialvalue() { try { return contextclass.newinstance(); } catch (throwable e) { throw new runtimeexception(e); } } };
//.......
}
zuul中不同类型的filter执行逻辑的核心在zuulservlet类中,主要代码如下:
public class zuulservlet extends httpservlet { private static final long serialversionuid = -3374242278843351500l; private zuulrunner zuulrunner; @override public void init(servletconfig config) throws servletexception { super.init(config); string bufferreqsstr = config.getinitparameter("buffer-requests"); boolean bufferreqs = bufferreqsstr != null && bufferreqsstr.equals("true") ? true : false; zuulrunner = new zuulrunner(bufferreqs); } @override public void service(javax.servlet.servletrequest servletrequest, javax.servlet.servletresponse servletresponse) throws servletexception, ioexception { try { init((httpservletrequest) servletrequest, (httpservletresponse) servletresponse); // marks this request as having passed through the "zuul engine", as opposed to servlets // explicitly bound in web.xml, for which requests will not have the same data attached requestcontext context = requestcontext.getcurrentcontext(); context.setzuulengineran(); try { preroute(); //如果preroute方法在执行的时候出现异常,直接就抛出500异常,不会走catch中的error方法,见下图filterprocessor类中的preroute方法。 } catch (zuulexception e) { error(e); //如果preroute在执行过程中,抛出zuul异常,这里被捕捉到以后,会执行error方法,打印堆栈信息,见下图filterprocessor类中的error方法。 postroute(); return; } try { route(); } catch (zuulexception e) { error(e); postroute(); return; } try { postroute(); } catch (zuulexception e) { error(e); return; } } catch (throwable e) { error(new zuulexception(e, 500, "unhandled_exception_" + e.getclass().getname())); } finally { requestcontext.getcurrentcontext().unset(); } }
//....... }
zuul一共有4种不同的生命周期:
如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复
浅析我对 String、StringBuilder、StringBuffer 的理解
使用IDEA搭建SSM框架的详细教程(spring + springMVC +MyBatis)
Springboot整合freemarker 404问题解决方案
引入mybatis-plus报 Invalid bound statement错误问题的解决方法
网友评论