乐视开放平台技术架构-servlet和spring mvc篇

  在乐视风口浪尖的时候,敢于站出来说我是乐视的而尽管被打脸的,相当于本身了。尽管作者然后不在乐视了,提起来在乐视工作过,我也还是挺骄傲的。因为那是一个有美妙,敢拼敢干的商家。想起复仇者联盟里Fury指挥官的一句话:Until
such time as the world ends, we will act as though it intends to spin
on.
下一周我们去怀柔团建,人家都是七个父母住一间,带孩子的是多人一间。笔者带着作者家小王子五个人住了1380一晚的豪华住房,听他们说是最好的屋子。像自个儿说过的,每每好事儿都让自身摊上了,所以照旧该干啥干啥。

  大家机关叫基础工作平台部,负责基本管理乐视摄像的摄像,音频及大街小巷的专栏数据。单台QPS几千,业老婆士表示并发量相当小,只是商户的集中缓存大失所望。

  开放平台的体系框架是那般的:

图片 1

  那是3个很标准的网站连串框架,基本得以满意当下多数SOA垂直拆分网站架构的供给。项目看重关系是这么的:

图片 2

 客户层ope-web选择的是明媒正娶的spring mvc架构。定义了三个视图解析器:

  1>InternalResourceViewResolver  那么些是UrlBasedViewResolver的造福子类。因为前者页面使用的是JSP,那个肯定是首要选拔。

  2>CommonsMultipartResolver  涉及上传摄像和图表,这些要求。须求专注最大上传大小和最大占用内部存款和储蓄器大小。

  3>SimpleMappingExceptionResolver  定义统一格外处理。我们以此连串中配置的默许跳转页面defaultErrorView是404,万分时指点的属性exceptionAttribute是ex。在exceptionMappings只定义了三个叫AccessException的尤其,跳转到errors页面。

说到Spring MVC照旧先放一张架构图吧

  图片 3

 

 由图中能够看到任何spring
mvc宗旨是dispatcherServlet,客户端将请求提交给它,它查询web.xml里的mapping定义找到Controller。大家项目mapping定义是

    <servlet>
        <servlet-name>dispatcher</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:spring/applicationContext.xml</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>

    <servlet-mapping>
        <servlet-name>dispatcher</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>

  全体的请求都走那几个dispatcherServlet,遵照applicationContext.xml的配备处理,那当中配备了自行扫描的controller路径和地点提到的视图解释器。来看一眼dispatcherServlet的主导源码:

protected void initStrategies(ApplicationContext context) {
initMultipartResolver(context); //文件上传解析,如果请求类型是multipart将通过MultipartResolver进行文件上传解析;
initLocaleResolver(context); //本地化解析
initThemeResolver(context);   //主题解析
initHandlerMappings(context); //通过HandlerMapping,将请求映射到处理器
initHandlerAdapters(context); //通过HandlerAdapter支持多种类型的处理器
initHandlerExceptionResolvers(context); //如果执行过程中遇到异常将交给HandlerExceptionResolver来解析
initRequestToViewNameTranslator(context); //直接解析请求到视图名
initViewResolvers(context); //通过ViewResolver解析逻辑视图名到具体视图实现
initFlashMapManager(context); //flash映射管理器     }

  从命名就可以看看,那么些中主要利用了策略形式,对分裂的视图选择区其余国策。ApplicationContext是2个虚无接口,spring的上下文将框架之中的依次零部件新闻都经过二个context暴光给外部,是三个外衣情势。

  dispatcherServlet在展开呼吁分发的时候还提供了一些服务:

  1>保存现场:保存request熟稔的快速照相,以便能在供给时上升。

  2>将框架必要的靶子放入request中,以便view和handler使用。

  3>在伸手分发后重操旧业现场。

  建议我们看看DispatcherServlet的源码,平日做spring
mvc项目以来,相信源码不难看懂。大家莫不时时境遇的题材,比如看了<Java并发编制程序实践>那本书,感觉这么些事物品种中用不到啊。其实不是这么,那本书很基础,里面包车型地铁事物都用到了,只是封装在框架里了,很多少人没稳扎稳打而已。记得书里讲安全发表的时候讲到使用Collections.unmodifiableMap来发表二个只读的map。那个在DispatcherServlet源码里对它的利用分外的天下第3:将flashmap的三个快速照相保存在request的品质里以备查看用。

    FlashMap inputFlashMap = this.flashMapManager.retrieveAndUpdate(request, response);
    if (inputFlashMap != null) {
      request.setAttribute(INPUT_FLASH_MAP_ATTRIBUTE, Collections.unmodifiableMap(inputFlashMap));
    }

  从源码到原理,最基础的,比如:调用构造器来创立一个Java类的时候,要明了这些构造器实际上是八个静态方法。所以率先次调用构造器创立对象的时候,大概访问这么些类的静态方法恐怕静态成员的时候,Java解释器先要定位其字节码(class)文件,加载了字段文件后,要举行具有的静态起始化学工业作,这几个工作只进行二遍。

  多思考,从编码到排查难点,相信都不会无从入手。

  上面说了在spring里能够安插不行处理页面,这么些不经过spring直接走servlet也能够,只要在web.xml里安顿一下:

图片 4

  DispatcherServlet还落到实处了三个很重庆大学的法力:拦截器,我们项目中十分重要用它来做用户身份验证。用户身份验证要走乐视网统一的SSO,在隔着本身工位4,5排的用户大旨组那边。只是七个外部接口的调用,可是总不能够每一回用户发一个呼吁就调一回sso啊,外部调用network
hops延时很要紧的,所以此时就用到了集中式缓存。取了一遍之后将表达身份的token存于redis里,有效期24小时。

  大家组和SSO组中间隔着前端组。JSP的静态页和JS都以前者提供的。为了尤其解耦前后端的工作,数据的加载都走的是js异步调用,数据由前端去渲染。为了酬答前端的修改,jSP中山大学量引入静态分片。那一个静态分片由2个后台服务定时将新型的分红刷新到当地。路径保存在地点缓存中。本地缓存用的google的guava工具包。

  再说拦截器,拦截器和servlet的过滤器很像,它们都以AOP变成思想的体现。那地点要小心:在web.xml配置的都以servlet的作用,在applicationContext里布署的是spring
mvc的效用。它们的分别也在这么些地方。因为Filter是Servlet的行业内部,仅能在Servlet前后起成效。而interceptor和spring可以接近互动,能够一语说破到点子前后,卓殊抛出上下等,能够访问Action上下文,值栈里的指标,可反复被调用。

相似项目中用过滤器的就是utf8字符过滤器,在web.xml的安插如下:

    <filter>
        <filter-name>CharacterEncodingFilter</filter-name>
        <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
        <init-param>
            <param-name>encoding</param-name>
            <param-value>UTF-8</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>CharacterEncodingFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

  Servlet规范中还定义了一种尤其类,监听器,用于监听域对象的始建与销毁,以及那些域对象属性的修改事件。大家项目中它来计划logback日志的监听。

  

admin

网站地图xml地图