Spring Cloud Netflix Zuul源码分析之预热篇

微信公众号:I am CR7
如有问题或建议,请在下方留言;
最近更新:2018-12-28

前言

有些日子没写文章了,各位,好久不见。前些天忙着给公司业务部门做了一套spring cloud netflix zuul集成spring security oauth2.0的定制版方案,连续加了N天班,实在是没时间继续之前Eureka源码分析,暂时先搁置下来吧。为了更好的理解zuul,今天趁着有时间,对它的源码做一次详细分析。今天发布的这一篇文章,作为预热篇,仅仅是满汉全席前的"开胃小菜",您看着品品,哈哈。

DispatcherServlet

简介

DispatcherServlet作为SpringMVC最核心的类,它的源码我们有必要仔细阅读。做过WEB开发的同学,或多或少都知道一些Servlet相关的知识。对于它的初始化过程,你知道多少呢?
请看:

  • Servlet容器加载Servlet类,把类的.class文件中的数据读到内存中;
  • Servlet容器中创建一个ServletConfig对象。该对象中包含了Servlet的初始化配置信息;
  • Servlet容器创建一个Servlet对象;
  • Servlet容器调用Servlet对象的init()方法进行初始化。
源码

简单看下初始化代码:

 1@Override
2protected void onRefresh(ApplicationContext context) {
3    initStrategies(context);
4}
5
6/**
7 * Initialize the strategy objects that this servlet uses.
8 * <p>May be overridden in subclasses in order to initialize further strategy objects.
9 */

10protected void initStrategies(ApplicationContext context) {
11    initMultipartResolver(context);
12    initLocaleResolver(context);
13    initThemeResolver(context);
14    initHandlerMappings(context);
15    initHandlerAdapters(context);
16    initHandlerExceptionResolvers(context);
17    initRequestToViewNameTranslator(context);
18    initViewResolvers(context);
19    initFlashMapManager(context);
20}
复制代码

这里与zuul请求处理相关的关键方法是initHandlerMappings()和initHandlerAdapters()方法。

时序图

关于DispatcherServlet初始化过程,我画了一个时序图,特地画出了重要的两个方法。

初始化时序图

高清大图请访问: user-gold-cdn.xitu.io/2018/12/28/…
下面,对这两个方法,我们来做重点分析。

initHandlerMappings()

initHandlerMappings()

从ApplicationContext里加载了10个HandlerMapping实体,保存到内存中,其中就包含了ZuulHandlerMapping。

initHandlerAdapters()

initHandlerAdapters()

从ApplicationContext里加载了3个HandlerAdapter实体,保存到内存中,其中就包含了SimpleControllerHandlerAdapter。

初始化日志:

日志作为我们阅读源码的利器之一,万万不可忽视,这里是初始化过程打印的debug日志,参照上面的时序图,可以加深理解。

 12018-12-27 15:41:25.752 [http-nio-8558-exec-1] DEBUG o.s.web.servlet.DispatcherServlet - Initializing servlet 'dispatcherServlet'
2
32018-12-27 15:41:29.777 [http-nio-8558-exec-1] INFO  o.a.c.c.C.[Tomcat].[localhost].[/] - Initializing Spring FrameworkServlet 'dispatcherServlet'
42018-12-27 15:41:30.956 [SimpleHostRoutingFilter.connectionManagerTimer] DEBUG o.a.h.i.c.PoolingHttpClientConnectionManager - Closing expired connections
52018-12-27 15:41:30.959 [http-nio-8558-exec-1] INFO  o.s.web.servlet.DispatcherServlet - FrameworkServlet 'dispatcherServlet': initialization started
62018-12-27 15:41:35.246 [http-nio-8558-exec-1] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Returning cached instance of singleton bean 'multipartResolver'
72018-12-27 15:41:35.246 [http-nio-8558-exec-1] DEBUG o.s.web.servlet.DispatcherServlet - Using MultipartResolver [org.springframework.web.multipart.support.StandardServletMultipartResolver@4d406619]
82018-12-27 15:41:35.253 [http-nio-8558-exec-1] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating instance of bean 'org.springframework.web.servlet.i18n.AcceptHeaderLocaleResolver'
92018-12-27 15:41:35.254 [http-nio-8558-exec-1] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Returning cached instance of singleton bean 'org.springframework.transaction.config.internalTransactionAdvisor'
102018-12-27 15:41:35.297 [http-nio-8558-exec-1] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Returning cached instance of singleton bean 'org.springframework.transaction.config.internalTransactionAdvisor'
112018-12-27 15:41:35.298 [http-nio-8558-exec-1] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Returning cached instance of singleton bean 'org.springframework.transaction.config.internalTransactionAdvisor'
122018-12-27 15:41:35.307 [http-nio-8558-exec-1] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Finished creating instance of bean 'org.springframework.web.servlet.i18n.AcceptHeaderLocaleResolver'
132018-12-27 15:41:35.308 [http-nio-8558-exec-1] DEBUG o.s.web.servlet.DispatcherServlet - Unable to locate LocaleResolver with name 'localeResolver': using default [org.springframework.web.servlet.i18n.AcceptHeaderLocaleResolver@49f4819a]
142018-12-27 15:41:35.318 [http-nio-8558-exec-1] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating instance of bean 'org.springframework.web.servlet.theme.FixedThemeResolver'
152018-12-27 15:41:35.319 [http-nio-8558-exec-1] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Returning cached instance of singleton bean 'org.springframework.transaction.config.internalTransactionAdvisor'
162018-12-27 15:41:35.351 [http-nio-8558-exec-1] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Returning cached instance of singleton bean 'org.springframework.transaction.config.internalTransactionAdvisor'
172018-12-27 15:41:35.352 [http-nio-8558-exec-1] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Returning cached instance of singleton bean 'org.springframework.transaction.config.internalTransactionAdvisor'
182018-12-27 15:41:35.357 [http-nio-8558-exec-1] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Finished creating instance of bean 'org.springframework.web.servlet.theme.FixedThemeResolver'
192018-12-27 15:41:35.357 [http-nio-8558-exec-1] DEBUG o.s.web.servlet.DispatcherServlet - Unable to locate ThemeResolver with name 'themeResolver': using default [org.springframework.web.servlet.theme.FixedThemeResolver@68903980]
202018-12-27 15:41:46.543 [SimpleHostRoutingFilter.connectionManagerTimer] DEBUG o.a.h.i.c.PoolingHttpClientConnectionManager - Closing expired connections
212018-12-27 15:41:47.584 [http-nio-8558-exec-1] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Returning cached instance of singleton bean 'faviconHandlerMapping'
222018-12-27 15:41:47.585 [http-nio-8558-exec-1] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Returning cached instance of singleton bean 'requestMappingHandlerMapping'
232018-12-27 15:41:47.585 [http-nio-8558-exec-1] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Returning cached instance of singleton bean 'viewControllerHandlerMapping'
242018-12-27 15:41:47.585 [http-nio-8558-exec-1] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Returning cached instance of singleton bean 'beanNameHandlerMapping'
252018-12-27 15:41:47.586 [http-nio-8558-exec-1] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Returning cached instance of singleton bean 'resourceHandlerMapping'
262018-12-27 15:41:47.586 [http-nio-8558-exec-1] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Returning cached instance of singleton bean 'defaultServletHandlerMapping'
272018-12-27 15:41:47.586 [http-nio-8558-exec-1] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Returning cached instance of singleton bean 'welcomePageHandlerMapping'
282018-12-27 15:41:47.587 [http-nio-8558-exec-1] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Returning cached instance of singleton bean 'zuulHandlerMapping'
292018-12-27 15:41:47.588 [http-nio-8558-exec-1] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Returning cached instance of singleton bean 'webEndpointServletHandlerMapping'
302018-12-27 15:41:47.588 [http-nio-8558-exec-1] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Returning cached instance of singleton bean 'controllerEndpointHandlerMapping'
312018-12-27 15:41:50.696 [http-nio-8558-exec-1] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Returning cached instance of singleton bean 'requestMappingHandlerAdapter'
322018-12-27 15:41:50.697 [http-nio-8558-exec-1] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Returning cached instance of singleton bean 'httpRequestHandlerAdapter'
332018-12-27 15:41:50.697 [http-nio-8558-exec-1] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Returning cached instance of singleton bean 'simpleControllerHandlerAdapter'
342018-12-27 15:41:52.972 [SimpleHostRoutingFilter.connectionManagerTimer] DEBUG o.a.h.i.c.PoolingHttpClientConnectionManager - Closing expired connections
352018-12-27 15:41:52.974 [http-nio-8558-exec-1] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Returning cached instance of singleton bean 'errorAttributes'
362018-12-27 15:41:52.974 [http-nio-8558-exec-1] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Returning cached instance of singleton bean 'handlerExceptionResolver'
372018-12-27 15:41:52.974 [http-nio-8558-exec-1] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating instance of bean 'org.springframework.web.servlet.view.DefaultRequestToViewNameTranslator'
382018-12-27 15:41:52.974 [http-nio-8558-exec-1] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Returning cached instance of singleton bean 'org.springframework.transaction.config.internalTransactionAdvisor'
392018-12-27 15:41:52.980 [http-nio-8558-exec-1] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Returning cached instance of singleton bean 'org.springframework.transaction.config.internalTransactionAdvisor'
402018-12-27 15:41:52.980 [http-nio-8558-exec-1] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Returning cached instance of singleton bean 'org.springframework.transaction.config.internalTransactionAdvisor'
412018-12-27 15:41:52.981 [http-nio-8558-exec-1] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Finished creating instance of bean 'org.springframework.web.servlet.view.DefaultRequestToViewNameTranslator'
422018-12-27 15:41:52.981 [http-nio-8558-exec-1] DEBUG o.s.web.servlet.DispatcherServlet - Unable to locate RequestToViewNameTranslator with name 'viewNameTranslator': using default [org.springframework.web.servlet.view.DefaultRequestToViewNameTranslator@1cfbb4c8]
432018-12-27 15:41:52.982 [http-nio-8558-exec-1] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Returning cached instance of singleton bean 'beanNameViewResolver'
442018-12-27 15:41:52.982 [http-nio-8558-exec-1] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Returning cached instance of singleton bean 'mvcViewResolver'
452018-12-27 15:41:52.982 [http-nio-8558-exec-1] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Returning cached instance of singleton bean 'defaultViewResolver'
462018-12-27 15:41:52.982 [http-nio-8558-exec-1] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Returning cached instance of singleton bean 'viewResolver'
472018-12-27 15:41:52.983 [http-nio-8558-exec-1] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating instance of bean 'org.springframework.web.servlet.support.SessionFlashMapManager'
482018-12-27 15:41:52.983 [http-nio-8558-exec-1] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Returning cached instance of singleton bean 'org.springframework.transaction.config.internalTransactionAdvisor'
492018-12-27 15:41:52.990 [http-nio-8558-exec-1] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Returning cached instance of singleton bean 'org.springframework.transaction.config.internalTransactionAdvisor'
502018-12-27 15:41:52.990 [http-nio-8558-exec-1] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Returning cached instance of singleton bean 'org.springframework.transaction.config.internalTransactionAdvisor'
512018-12-27 15:41:52.991 [http-nio-8558-exec-1] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Finished creating instance of bean 'org.springframework.web.servlet.support.SessionFlashMapManager'
522018-12-27 15:41:52.991 [http-nio-8558-exec-1] DEBUG o.s.web.servlet.DispatcherServlet - Unable to locate FlashMapManager with name 'flashMapManager': using default [org.springframework.web.servlet.support.SessionFlashMapManager@6d57a78b]
532018-12-27 15:41:52.991 [http-nio-8558-exec-1] DEBUG o.s.web.servlet.DispatcherServlet - Published WebApplicationContext of servlet 'dispatcherServlet' as ServletContext attribute with name [org.springframework.web.servlet.FrameworkServlet.CONTEXT.dispatcherServlet]
54
55
562018-12-27 15:41:52.991 [http-nio-8558-exec-1] INFO  o.s.web.servlet.DispatcherServlet - FrameworkServlet 'dispatcherServlet': initialization completed in 21059 ms
572018-12-27 15:41:52.991 [http-nio-8558-exec-1] DEBUG o.s.web.servlet.DispatcherServlet - Servlet 'dispatcherServlet' configured successfully
复制代码

总结

     本文内容不多,几个字总结,那就是一个图两个方法。也许有人会问,这么点东西没必要单独发一篇文章吧?其实不然,理解了这一部分,对于后面看DispatcherServlet处理请求时如何进入ZuulController,走到ZuulServlet,是非常有帮助的。不信,下一篇文章发出来的时候,您可以体会体会。
     好久不写,确实有些生疏了,好习惯还是得坚持。笔者不才,有任何意见或者建议,希望大家留言一起讨论,十分感谢!!!
     最后,借吴军老师谷歌方法论常用的结束方式:祝顺利,2018年12月28号,祁琛。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值