成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

容易被忽視的后端服務 chunked 性能問題

開發(fā) 前端
在之前的一次性能壓測的時候我們發(fā)現(xiàn)一個細節(jié)問題,我們使用 spring boot 創(chuàng)建的 web rest 項目,使用默認 spring mvc 作為 web rest 框架。這在使用上沒有太大問題,但是有一個影響性能的細節(jié)問題被發(fā)現(xiàn)了,說實話這個問題很難被發(fā)現(xiàn)。
  • 背景
  • spring boot 創(chuàng)建的默認 spring mvc 項目
  • 集成 JAX-RS 規(guī)范框架 Jersey

背景

在之前的一次性能壓測的時候我們發(fā)現(xiàn)一個細節(jié)問題,我們使用 spring boot 創(chuàng)建的 web rest 項目,使用默認 spring mvc 作為 web rest 框架。

這在使用上沒有太大問題,但是有一個影響性能的細節(jié)問題被發(fā)現(xiàn)了,說實話這個問題很難被發(fā)現(xiàn)。

[[211303]]

spring boot創(chuàng)建的默認spring mvc項目

我們來看一個簡單的 demo ,我使用 IDEA 創(chuàng)建一個 spring boot 項目,創(chuàng)建過程中沒有什么特別的選項需要調(diào)整,一路 next 。然后我們創(chuàng)建一個簡單的 controller 。

 

  1. package springboot.demo.controller; 
  2.  
  3. import org.springframework.web.bind.annotation.PathVariable; 
  4. import org.springframework.web.bind.annotation.RequestMapping; 
  5. import org.springframework.web.bind.annotation.RestController; 
  6. import springboot.demo.model.User
  7.  
  8. /** 
  9.  * Created by plen on 2017/11/25. 
  10.  */ 
  11.  
  12. @RestController 
  13. public class SpringMvcController { 
  14.  
  15.     @RequestMapping("/user/{id}"
  16.     public User hello(@PathVariable  Long id) { 
  17.  
  18.         User user = new User(); 
  19.         user.setID(id); 
  20.         user.setUserName("mvc."); 
  21.  
  22.         return user
  23.     } 

再創(chuàng)建一個簡單的 model 。

 

  1. package springboot.demo.model; 
  2.  
  3. import lombok.Data; 
  4. import lombok.EqualsAndHashCode; 
  5.  
  6. /** 
  7.  * Created by plen on 2017/11/25. 
  8.  */ 
  9. @Data 
  10. @EqualsAndHashCode 
  11. public class User { 
  12.     private Long ID; 
  13.     private String userName; 

然后啟動訪問這個 controller ,注意看下返回的 http 信息里多了一個 Transfer-Encoding:chunked 。 Transfer-Encoding:chunked 在 HTTP 協(xié)議里的意思是無法計算 Content-Length 長度,需要分塊傳輸。

這是 spring mvc 的默認 complex object 傳輸方式,如果我們返回的是一個簡單的對象就不會有這個問題。

Transfer-Encoding:chunked帶來的性能問題就是訪問一次數(shù)據(jù)需要不止一次的 http 請求,而一次 http 請求的成本也是比較大的。

(我沒有通過抓包工具來測試具體哪種對象大小需要訪問幾次,感興趣的可以自己試下。)

集成JAX-RS規(guī)范框架Jersey

解決這個問題兩個層面都可以,一種是采用比較粗暴的方式在 servlet 容器層面解決,但是這個會帶來一個后果就是當我們計算 complex object 大小的時候會比較復雜而且容易出錯,也會影響項目未來的分塊傳輸功能,效果不太好。

還有一種就是在應用層面解決,比較柔性也易于擴展,我們可以集成一個 rest 框架,最好是符合 JAX-RS 規(guī)范,本文我們集成 Jersey 框架。

jersey集成如果通過 __@Component_ _ 方式那么 jersey 會默認接管所有的 web servlet 請求處理,所以就需要我們手動的配置專門用來處理 jersey servlet 的容器。

spring boot解決了以前 spring 繁重的配置,提供了 auto config 功能,原來通過 web.xml 配置 servlet 的,現(xiàn)在需要用代碼來配置。 spring boot 提供了讓我們手動注冊 servlet bean 的方式。

  1. org.springframework.boot.web.servlet.ServletRegistrationBean 

ServletRegistrationBean 可以讓我們注冊servlet,我們來看下完整代碼。

 

  1. package springboot.demo.config; 
  2.  
  3. import org.glassfish.jersey.servlet.ServletContainer; 
  4. import org.glassfish.jersey.servlet.ServletProperties; 
  5. import org.springframework.boot.web.servlet.ServletRegistrationBean; 
  6. import org.springframework.context.annotation.Bean; 
  7. import org.springframework.stereotype.Component; 
  8.  
  9. /** 
  10.  * Created by plen on 2017/11/25. 
  11.  */ 
  12. @Component 
  13. public class JerseyServletBeanConfig { 
  14.  
  15.     @Bean 
  16.     public ServletRegistrationBean jerseyServlet() { 
  17.  
  18.         ServletRegistrationBean registrationBean = new ServletRegistrationBean(new ServletContainer(), "/rest/v1/*"); 
  19.         registrationBean.addInitParameter(ServletProperties.JAXRS_APPLICATION_CLASS, JerseyResourceConfig.class.getName()); 
  20.  
  21.         return registrationBean; 
  22.     } 

這和原來在 web.xml 配置的是一樣的,設置 routing 地址,設置 Init 初始化參數(shù),對應的 servlet class name 。

所有的 __"rest/v1/*"__ 請求都將被 ServletContainer jersey servlet 容器接管。

 

  1. package springboot.demo.config; 
  2.  
  3. import org.glassfish.jersey.server.ResourceConfig; 
  4. import org.glassfish.jersey.server.spring.scope.RequestContextFilter; 
  5. import springboot.demo.controller.JerseyController; 
  6.  
  7. /** 
  8.  * Created by plen on 2017/11/25. 
  9.  */ 
  10. public class JerseyResourceConfig extends ResourceConfig { 
  11.  
  12.     public JerseyResourceConfig() { 
  13.         register(JerseyController.class); 
  14.         register(RequestContextFilter.class); 
  15.     } 

ResourceConfig其實是一個 jersey Application 類型。這是 __jersey 注冊 servlet 時規(guī)定的。

 

  1. package springboot.demo.controller; 
  2.  
  3. import springboot.demo.model.User
  4.  
  5. import javax.ws.rs.GET; 
  6. import javax.ws.rs.Path; 
  7. import javax.ws.rs.PathParam; 
  8. import javax.ws.rs.Produces; 
  9. import javax.ws.rs.core.MediaType; 
  10.  
  11. /** 
  12.  * Created by plen on 2017/11/25. 
  13.  */ 
  14.  
  15. @Path("/user/"
  16. public class JerseyController { 
  17.  
  18.     @Path("{id}"
  19.     @GET 
  20.     @Produces(MediaType.APPLICATION_JSON) 
  21.     public User hello(@PathParam("id") Long id) { 
  22.  
  23.         User user = new User(); 
  24.         user.setID(id); 
  25.         user.setUserName("jersey."); 
  26.  
  27.         return user
  28.     } 

這是我們應用代碼 Controller ,使用 JAX-RS 規(guī)范的注解進行設置即可。

這樣就解決了 sprng mvc 和 jersey rest 共同存在的問題,我們也不需要將所有的返回 chunked 的接口都改成 JAX-RS 的 rest 服務,只需要將有性能瓶頸的接口改造下即可。

責任編輯:未麗燕 來源: 王清培技術博客
相關推薦

2012-11-28 15:53:16

災難恢復

2017-02-08 09:51:27

JavaScript細節(jié)

2019-08-30 12:01:48

2017-08-15 17:09:31

Linux命令

2024-02-29 07:48:55

Python編程語言上下文管理器

2019-01-18 13:22:10

布線事項網(wǎng)絡

2009-11-17 16:14:28

無線路由器

2023-11-07 12:25:22

2009-11-09 09:57:39

交換機路由器

2014-04-10 16:33:48

iOS 7新特性

2017-01-15 15:13:37

Android性能優(yōu)化優(yōu)化點

2010-01-28 10:11:18

IT金飯碗

2022-11-29 12:11:25

2013-01-22 09:21:28

云計算成本私房云

2013-08-01 13:55:55

Android 4.3新特性

2023-10-24 18:05:00

2010-01-22 15:45:57

局域網(wǎng)交換機

2023-08-08 14:28:02

2013-06-07 08:48:37

Android開發(fā)注意事項

2022-07-18 13:37:10

網(wǎng)絡安全數(shù)據(jù)泄露
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 91在线精品视频 | 羞羞羞视频 | 成人亚洲 | 日韩精品一区二区三区在线播放 | 国产精品色综合 | 日韩中文字幕2019 | 国产91在线播放 | 亚洲精品永久免费 | 久久国产视频一区 | 日韩高清在线观看 | 一区在线播放 | 精品一二区 | 国产精品久久久久久久久久免费看 | 亚洲精品亚洲人成人网 | 情侣av | 福利在线看 | 精品免费观看 | 免费在线黄| 成人免费毛片在线观看 | 天天干在线播放 | 欧美黄页 | 99久久国产综合精品麻豆 | 久久精选| 成人教育av | 久久久噜噜噜久久中文字幕色伊伊 | 国产精品国产三级国产aⅴ中文 | 欧美日韩一 | 国产精品一区三区 | 91观看| 成人黄色在线观看 | 国产精品久久久久久久免费大片 | 在线资源视频 | 日韩精品视频在线 | 亚洲3p| 麻豆久久久久久久久久 | 日韩欧美一区二区三区免费观看 | 九九热精品视频 | 91一区二区三区 | 综合五月 | 精品中文字幕在线观看 | 欧美日韩久久精品 |