<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                在閱讀完back-center源碼后,是否注意過,咱們的pom依賴中引用了spring-boot-starter-web,定義了server.port ,同時定義了靜態資源,那么這個starter究竟干了什么事情。 ## 回顧back-center中的代碼 * 啟動端口 ![](https://img.kancloud.cn/e9/a0/e9a030ab2d3d10442271c56ff875abc6_1148x169.png) * 前端代碼 ![](https://img.kancloud.cn/85/10/8510afed3cf80a7360258f3552c6de27_1638x768.png) ## server.port ![](https://img.kancloud.cn/de/2e/de2e038b95ae1ddf46b60b27fb7a4539_1742x737.png) * 咱們閱讀springboot 代碼 ![](https://img.kancloud.cn/ee/40/ee40025f5d8d79991845f1fd74e1f436_1569x486.png) * 找到spring-boot-starter-web 自動裝配的程序包 ![](https://img.kancloud.cn/ed/2a/ed2acebad8ed92cc631e23111107ff20_1596x610.png) * 找到ServerProperties ![](https://img.kancloud.cn/d5/6c/d56c9271a255f10cd5da97527eab1706_1418x712.png) * 查找相關依賴 ![](https://img.kancloud.cn/a0/07/a00779586c9457610d751cdf3fb0f037_1062x470.png) * springboot 內置web容器中使用了ServerProperties,至于配置文件的server.port如何映射到ServerProperties,需要關注@ConfigurationProperties,springboot 內置容器將會以配置文件中的server.port啟動 ![](https://img.kancloud.cn/68/7e/687e22b092e4e4461d7814e3f349ab1c_1000x869.png) * 啟動back-center ![](https://img.kancloud.cn/7d/32/7d32f19b8d3285c1c12dcee4b374c8e4_1902x411.png) ## 靜態資源 spring boot 啟動如何知道前端的靜態資料路徑呢?你有沒有遇到在springboot項目中放了一個html 報404呢? 下面分析源碼。 * 濤聲依舊,找到spring-boot-starter-web的源碼包 ![](https://img.kancloud.cn/ed/2a/ed2acebad8ed92cc631e23111107ff20_1596x610.png) * 找到相關處理類 ![](https://img.kancloud.cn/a9/d8/a9d8c18070fe1cbc689ad7e261a71dc1_1529x574.png) * 回顧back-center代碼,建立聯系 ![](https://img.kancloud.cn/82/22/8222bede9c9478eec1e6dc3f2f9a76e4_1361x515.png) ## tomcat啟動原理 ![](https://img.kancloud.cn/7a/d0/7ad0c2ef68eafb460538ccffd229b025_1774x546.png) ## tomcat 啟動流程 ![](https://img.kancloud.cn/48/94/4894e83e6e7570a949ce2f180b431129_1657x870.png) ## 初始化連接器等信息 ![](https://img.kancloud.cn/53/5a/535a6219afd8fbbac5fb422fc15ce40c_1802x613.png) ## 內置tomcat處理能力配置情況查詢 ![](https://img.kancloud.cn/9b/f5/9bf5e1e1ed36dfe51ee867df0eae1711_1755x762.png) ## 默認tomcat配置 ![](https://img.kancloud.cn/79/1e/791e299e672de6dcb698a22ae57175c0_917x275.png) ``` # 等待隊列長度,默認100。隊列也做緩沖池用,但也不能無限長,不但消耗內存,而且出隊入隊也消耗CPU server.tomcat.accept-count=1000 # 最大工作線程數,默認200。(4核8g內存,線程數800,一般是核數*200。操作系統做線程之間的切換調度是有系統開銷的,所以不是越多越好。) server.tomcat.max-threads=800 # 最小工作空閑線程數,默認10。(適當增大一些,以便應對突然增長的訪問量) server.tomcat.min-spare-threads=100 #最大連接數,默認為10000 server.tomcat.max-connections=10000 ``` **查看tomcat線程數命令如下:** 獲取tomcat進程pid :ps -ef|grep tomcat 統計該tomcat進程內的線程個數 :ps -Lf 29295 |wc -l ## 優化理論 Tomcat在NIO模式時有一個線程專業接受請求連接,然后將其放到任務隊列,然后有工作線程從任務t隊列取出請求并并發處理(工作線程數通過maxThreads值控制,Tomcat默認是200),如果每個請求處理很快比如20ms,則工作線程1s內就能處理(1000/20*200)10000個請求,否則若請求處理很慢比如要幾秒,則請求隊列中的連接得到處理收到響應的時間也會變慢。 * maxThreads、minSpareThreads是tomcat工作線程池的配置參數,maxThreads就相當于jdk線程池的maxPoolSize,而minSpareThreads就相當于jdk線程池的corePoolSize。 * acceptCount、maxConnections是tcp層相關的參數。 ![](https://img.kancloud.cn/b2/94/b29415dcc69a1e994171e3073c0a7bc0_901x677.png) ## Tomcat與線程池 ![](https://img.kancloud.cn/49/20/4920c65138771724c48cdea0de7fce28_2264x689.png) ![](https://img.kancloud.cn/52/47/5247fb9efc8b4f3f99c000c95c00ebd5_2262x705.png) ## tomcat 執行流程 ![](https://img.kancloud.cn/e3/1d/e31d5238748258000368ed599edaa1d1_1300x269.png) 大致流程為: 1、創建一個Acceptor線程來接收用戶連接,接收到之后扔到events queue隊列里面,默認情況下只有一個線程來接收 2、創建Poller線程,數量小于等于2,Poller對象是NIO的核心,在Poller中,維護了一個Selector對象;當Poller從隊列中取出socket后,注冊到該Selector中;然后通過遍歷Selector,找出其中可讀的socket,然后扔到線程池中處理相應請求,這就是典型的NIO多路復用模型。 3、扔到線程池中的SocketProcessorBase處理請求 相較于BIO模型的tomcat,NIO的優勢分析: 1、BIO中的流程應該是接收到請求之后直接把請求扔給線程池去做處理,在這個情況下一個連接即需要一個線程來處理,線程既需要讀取數據還需要處理請求,線程占用時間長,很容易達到最大線程 2、NIO的流程的不同點在于Poller類采用了多路復用模型,即Poller類只有檢查到可讀或者可寫的連接時才把當前連接扔給線程池來處理,這樣的好處是大大節省了連接還不能讀寫時的處理時間(如讀取請求數據),也就是說NIO“讀取socket并交給Worker中的線程”這個過程是非阻塞的,當socket在等待下一個請求或等待釋放時,并不會占用工作線程,因此Tomcat可以同時處理的socket數目遠大于最大線程數,并發性能大大提高。 ## tomcat處理請求 ![](https://img.kancloud.cn/66/44/66448c24e93f0d7303a3303e8d1d945f_1552x1092.png) ## tomcat分發到DispatcherServlet ![](https://img.kancloud.cn/6d/99/6d995fc234f33a4a735d0ce5f3befcc8_1804x1025.png) ## web跳轉API ``` redirectStrategy.sendRedirect(request, response, "http://www.baidu.com"); ``` ## request ,response ``` // 獲得request對象,response對象 ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); HttpServletRequest request = attributes.getRequest(); HttpServletResponse response = attributes.getResponse(); ``` ## ServletContext ``` ContextLoader.getCurrentWebApplicationContext().getServletContext() ``` 本章主要是說明spring-boot-starter-web啟動的其中一部分,希望可以管中規豹,帶你理解springboot的一些原理,spring-boot-starter到底做了什么,后面我們會陸續分析。 ## spring boot web開發 Spring Boot 全面支持開發 Restful 程序,通過不同的注解來支持前端的請求。 @GetMapping,處理 Get 請求 @PostMapping,處理 Post 請求 @PutMapping,用于更新資源 @DeleteMapping,處理刪除請求 @PatchMapping,用于更新部分資源 這些組合注解是我們使用的@RequestMapping的簡寫版本,下面是 Java 類中的使用示例 @GetMapping(value="/xxx") 等價于 @RequestMapping(value = "/xxx",method = RequestMethod.GET) @PostMapping(value="/xxx") 等價于 @RequestMapping(value = "/xxx",method = RequestMethod.POST) @PutMapping(value="/xxx") 等價于 @RequestMapping(value = "/xxx",method = RequestMethod.PUT) @DeleteMapping(value="/xxx") 等價于 @RequestMapping(value = "/xxx",method = RequestMethod.DELETE) @PatchMapping(value="/xxx") 等價于 @RequestMapping(value = "/xxx",method = RequestMethod.PATCH)
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看