您好,欢迎来到12图资源库!分享精神,快乐你我!我们只是素材的搬运工!!
  • 首 页
  • 当前位置:首页 > 开发 > WEB开发 >
    容易被无视的后端效劳 chunked 功用成绩
    时间:2017-11-27 21:24 来源:网络整理 作者:网络 浏览:收藏 挑错 推荐 打印

    CTO训练营 | 12月3-5日,深圳,是时分红为优秀的技术管理者了

    背景

    spring boot 创立的默许 spring mvc 项目

    集成 JAX-RS 标准框架 Jersey

    背景

    在之前的一次功用压测的时分我们发现一个细节成绩,我们运用 spring boot 创立的 web rest 项目,运用默许 spring mvc 作为 web rest 框架。

    这在运用上没有太大成绩,但是有一个影响功用的细节成绩被发现了,说假话这个成绩很难被发现。

    容易被无视的后端效劳 chunked 功用成绩

    spring boot创立的默许spring mvc项目

    我们来看一个复杂的 demo ,我运用 IDEA 创立一个 spring boot 项目,创立进程中没有什么特别的选项需求调整,一路 next 。然后我们创立一个复杂的 controller 。

    package springboot.demo.controller; 

     

    import org.springframework.web.bind.annotation.PathVariable; 

    import org.springframework.web.bind.annotation.RequestMapping; 

    import org.springframework.web.bind.annotation.RestController; 

    import springboot.demo.model.User

     

    /** 

     * Created by plen on 2017/11/25. 

     */ 

     

    @RestController 

    public class SpringMvcController { 

     

        @RequestMapping("/user/{id}"

        public User hello(@PathVariable  Long id) { 

     

            User user = new User(); 

            user.setID(id); 

            user.setUserName("mvc."); 

     

            return user

        } 

    再创立一个复杂的 model 。

    package springboot.demo.model; 

     

    import lombok.Data; 

    import lombok.EqualsAndHashCode; 

     

    /** 

     * Created by plen on 2017/11/25. 

     */ 

    @Data 

    @EqualsAndHashCode 

    public class User { 

        private Long ID; 

        private String userName; 

    然后启动拜访这个 controller ,留意看下前往的 http 信息里多了一个 Transfer-Encoding:chunked 。 Transfer-Encoding:chunked 在 HTTP 协议里的意思是无法计算 Content-Length 长度,需求分块传输。

    这是 spring mvc 的默许 complex object 传输方式,假设我们前往的是一个复杂的对象就不会有这个成绩。

    Transfer-Encoding:chunked带来的功用成绩就是拜访一次数据需求不止一次的 http 央求,而一次 http 央求的成本也是比较大的。

    (我没有经过抓包工具来测试详细哪种对象大小需求拜访几次,感兴味的可以本人试下。)

    集成JAX-RS标准框架Jersey

    处置这个成绩两个层面都可以,一种是采用比较粗犷的方式在 servlet 容器层面处置,但是这个会带来一个结果就是当我们计算 complex object 大小的时分会比较复杂而且容易出错,也会影响项目未来的分块传输功用,效果不太好。

    还有一种就是在运用层面处置,比较柔性也易于扩展,我们可以集成一个 rest 框架,最好是契合 JAX-RS 标准,本文我们集成 Jersey 框架。

    jersey集成假设经过 __@Component_ _ 方式那么 jersey 会默许接收一切的 web servlet 央求处置,所以就需求我们手动的配置专门用来处置 jersey servlet 的容器。

    spring boot处置了以前 spring 繁重的配置,提供了 auto config 功用,原来经过 web.xml 配置 servlet 的,如今需求用代码来配置。 spring boot 提供了让我们手动注册 servlet bean 的方式。

    org.springframework.boot.web.servlet.ServletRegistrationBean 

    ServletRegistrationBean 可以让我们注册servlet,我们来看下残缺代码。

    package springboot.demo.config; 

     

    import org.glassfish.jersey.servlet.ServletContainer; 

    import org.glassfish.jersey.servlet.ServletProperties; 

    import org.springframework.boot.web.servlet.ServletRegistrationBean; 

    import org.springframework.context.annotation.Bean; 

    import org.springframework.stereotype.Component; 

     

    /** 

     * Created by plen on 2017/11/25. 

     */ 

    @Component 

    public class JerseyServletBeanConfig { 

     

        @Bean 

        public ServletRegistrationBean jerseyServlet() { 

     

    (责任编辑:admin)