springcloud zuul
zuul是springcloud的API网关。
入口也是springmvc的DispatcherServlet。
实际的handler是ZuulController,通过handleRequest方法调用了ZuulServlet的service方法来处理请求。
ZuulServlet就是一个普通的servlet,其service方法如下:
@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(); //pre ZuulFilter在这里调用
} catch (ZuulException e) {
error(e);
postRoute();
return;
}
try {
route(); //这里做路由
} catch (ZuulException e) {
error(e);
postRoute(); //post ZuulFilter在这里调用
return;
}
try {
postRoute(); //post ZuulFilter在这里调用
} catch (ZuulException e) {
error(e);
return;
}
} catch (Throwable e) {
error(new ZuulException(e, 500, "UNHANDLED_EXCEPTION_" + e.getClass().getName()));
} finally {
RequestContext.getCurrentContext().unset();
}
}