千家信息网

SpringCloud之zuul源码的示例分析

发表于:2026-11-04 作者:千家信息网编辑
千家信息网最后更新 2026年11月04日,这篇文章主要为大家展示了"SpringCloud之zuul源码的示例分析",内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下"SpringCloud之zuul源码
千家信息网最后更新 2026年11月04日SpringCloud之zuul源码的示例分析

这篇文章主要为大家展示了"SpringCloud之zuul源码的示例分析",内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下"SpringCloud之zuul源码的示例分析"这篇文章吧。

zuul各版本实现存在一些微小的变化,总的实现思想未改变,以spring-cloud-netflix-core-1.3.6.RELEASE为例

一、zuul的重要的初始化类

org.springframework.cloud.netflix.zuul.ZuulServerAutoConfiguration

org.springframework.cloud.netflix.zuul.ZuulProxyAutoConfiguration

org.springframework.cloud.netflix.zuul.ZuulFilterInitializer

org.springframework.cloud.netflix.zuul.RibbonCommandFactoryConfiguration

ZuulServerAutoConfiguration

初始化路由规则

初始化一些重要的filter如 PreDecorationFilter,RibbonRoutingFilter

初始化ZuulFilterInitializer

初始化ZuulHandlerMapping

代码如下

 //路由规则  @Bean @ConditionalOnMissingBean(DiscoveryClientRouteLocator.class) public DiscoveryClientRouteLocator discoveryRouteLocator() { return new DiscoveryClientRouteLocator(this.server.getServletPrefix(), this.discovery, this.zuulProperties,  this.serviceRouteMapper); }    // pre filters @Bean public PreDecorationFilter preDecorationFilter(RouteLocator routeLocator, ProxyRequestHelper proxyRequestHelper) { return new PreDecorationFilter(routeLocator, this.server.getServletPrefix(), this.zuulProperties,  proxyRequestHelper); } // route filters @Bean public RibbonRoutingFilter ribbonRoutingFilter(ProxyRequestHelper helper,  RibbonCommandFactory ribbonCommandFactory) { RibbonRoutingFilter filter = new RibbonRoutingFilter(helper, ribbonCommandFactory, this.requestCustomizers); return filter; }  @Configuration protected static class ZuulFilterConfiguration { @Autowired private Map filters; @Bean public ZuulFilterInitializer zuulFilterInitializer(  CounterFactory counterFactory, TracerFactory tracerFactory) {  FilterLoader filterLoader = FilterLoader.getInstance();  FilterRegistry filterRegistry = FilterRegistry.instance();  return new ZuulFilterInitializer(this.filters, counterFactory, tracerFactory, filterLoader, filterRegistry); } } @Bean public ZuulController zuulController() { return new ZuulController(); } @Bean public ZuulHandlerMapping zuulHandlerMapping(RouteLocator routes) { ZuulHandlerMapping mapping = new ZuulHandlerMapping(routes, zuulController()); mapping.setErrorController(this.errorController); return mapping; }

ZuulProxyAutoConfiguration

zuulProxAutoConfiguration继承ZuulServerAutoConfiguration功能上和zuulServerAutoConfiguration

主要功能是增加了RibbonCommandFactoryConfiguration的配置,初始化所有的实现ribbon的方式如apache,okhttp。

ZuulFilterInitializer

该类的作用主要是把初始化的过滤器注册到zuul的FilterRegistry,FilterRegistry是一个单例用于初始化路由信息,在ZuulRunner中使用

RibbonCommandFactoryConfiguration

主要作用是配置转发的实现,实现主要有apache,okhttp

二、zuul的转发实现

首先第一步转到ZuulHandlerMapping中的lookupHandler方法,把转发转到zuulController中

@Override protected Object lookupHandler(String urlPath, HttpServletRequest request) throws Exception { if (this.errorController != null && urlPath.equals(this.errorController.getErrorPath())) {  return null; } String[] ignored = this.routeLocator.getIgnoredPaths().toArray(new String[0]); if (PatternMatchUtils.simpleMatch(ignored, urlPath)) {  return null; } RequestContext ctx = RequestContext.getCurrentContext(); if (ctx.containsKey("forward.to")) {  return null; } if (this.dirty) {  synchronized (this) {  if (this.dirty) {   registerHandlers();   this.dirty = false;  }  } } return super.lookupHandler(urlPath, request); }

第一次访问时dirty为true会初始化一次请求规则如下

private void registerHandlers() { Collection routes = this.routeLocator.getRoutes(); if (routes.isEmpty()) {  this.logger.warn("No routes found from RouteLocator"); } else {  for (Route route : routes) {  registerHandler(route.getFullPath(), this.zuul);  } } }

第二步ZuulController继承ServletWrappingController的会把请求转到ZuulServlet中如下

/** * @author Spencer Gibb */public class ZuulController extends ServletWrappingController { public ZuulController() { setServletClass(ZuulServlet.class); setServletName("zuul"); setSupportedMethods((String[]) null); // Allow all } @Override public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception { try {  // We don't care about the other features of the base class, just want to  // handle the request  return super.handleRequestInternal(request, response); } finally {  // @see com.netflix.zuul.context.ContextLifecycleFilter.doFilter  RequestContext.getCurrentContext().unset(); } }}

第三步ZuulServlet的service方法如下主要执行pre,route,postRoute三种路由器

 @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();      } catch (ZuulException e) {        error(e);        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();    }  }

四、最后由SendResponseFilter执行返回结果,filterOrder为1000所以最好post的filter不要超过1000否则影响返回结果

以上是"SpringCloud之zuul源码的示例分析"这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注行业资讯频道!

路由 源码 示例 分析 内容 篇文章 规则 重要 作用 功能 方法 结果 学习 帮助 配置 微小 代码 信息 思想 方式 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 互联网科技名片 华服互联网科技靠谱吗 中关村互联网科技集团 互联网核心科技是什么 互联网 科技 善班互联网科技有限公司 美国互联网黑科技 上海卓越科技 互联网 多迪互联网科技有限公司 互联网 科技馆 华中科技有哪些互联网大佬 农村开互联网科技讲堂 现代科技和互联网有关系吗 顶级互联网科技成果有哪些 金融科技与互联网金融相同和不同 互联网对科技的发展 福建科技产业互联网发展 洛阳昕诺飞互联网科技有限公司 朱啸虎曾投资哪些互联网科技企业 山东大美朱楼互联网科技有限公司 深圳市人人互联网科技有限公司 互联网科技有限公司经营范围 互联网科技深圳 上海互联网科技有限公司 互联网科技公司名称 广西拼得多互联网科技有限公司 山东吉时兔互联网科技有限公司 广州燕处互联网科技有限公司 昆明中奇联合互联网科技 普陀区互联网教育科技管理办法
0