电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

SpringBoot應用啟動內置Tomcat的過程源碼分析

瀏覽:89日期:2023-02-25 09:23:38
Connector啟動過程

Connector是Tomcat提供的類。

// 通過此 Connector 開始處理請求@Overrideprotected void startInternal() throws LifecycleException { // Validate settings before starting if (getPortWithOffset() < 0) {throw new LifecycleException(sm.getString('coyoteConnector.invalidPort', Integer.valueOf(getPortWithOffset()))); } setState(LifecycleState.STARTING); try { // 核心動作protocolHandler.start(); } catch (Exception e) {throw new LifecycleException(sm.getString('coyoteConnector.protocolHandlerStartFailed'), e); }}

springboot默認會在8080端口提供 HTTP 服務,所以這里是一個處理HTTP協議請求的 Http11NioProtocol 實例,使用 NIO 方式處理 HTTP 協議。Connector 對HTTP請求的接收和處理并非親自完成,而是委托該 Http11NioProtocol protocolHandler 完成

SpringBoot應用啟動內置Tomcat的過程源碼分析

而 protocolHandler 又進一步將請求處理工作交給 NioEndpoint 完成。

AbstractProtocol

@Overridepublic void start() throws Exception { if (getLog().isInfoEnabled()) {getLog().info(sm.getString('abstractProtocolHandler.start', getName()));logPortOffset(); } endpoint.start(); monitorFuture = getUtilityExecutor().scheduleWithFixedDelay( new Runnable() {@Overridepublic void run() { if (!isPaused()) {startAsyncTimeout(); }} }, 0, 60, TimeUnit.SECONDS);}

調用鏈 :

Connector.start() startInternal() Http11NioProtocol protocolHandler.start(); Http11NioProtocol 的 start方法,由基類 AbstractProtocol 提供實現。它們都是tomcat提供的類。 NioEndpoint endpoint.start()

start成員變量endpoint,一個 NioEndpoint 實例。Http11NioProtocol 類實例也并非最終處理請求,具體這些請求的處理都委托給了 NioEndpint endpoint 來完成

SpringBoot應用啟動內置Tomcat的過程源碼分析

AbstractEndpoint

public final void start() throws Exception { if (bindState == BindState.UNBOUND) {bindWithCleanup();bindState = BindState.BOUND_ON_START; } startInternal();}

可見 tomcat 的三種模式,默認使用 NIO 模式。SpringBoot應用啟動內置Tomcat的過程源碼分析

@Overridepublic void bind() throws Exception { initServerSocket(); setStopLatch(new CountDownLatch(1)); // Initialize SSL if needed initialiseSsl(); selectorPool.open(getName());}

protected void initServerSocket() throws Exception { if (!getUseInheritedChannel()) { // 建立服務套接字serverSock = ServerSocketChannel.open();socketProperties.setProperties(serverSock.socket());InetSocketAddress addr = new InetSocketAddress(getAddress(), getPortWithOffset());// 綁定到指定端口serverSock.socket().bind(addr,getAcceptCount()); } else {// Retrieve the channel provided by the OSChannel ic = System.inheritedChannel();if (ic instanceof ServerSocketChannel) { serverSock = (ServerSocketChannel) ic;}if (serverSock == null) { throw new IllegalArgumentException(sm.getString('endpoint.init.bind.inherited'));} } // 設置 serverSock 為阻塞模式 serverSock.configureBlocking(true); //mimic APR behavior}

serverSocket配置的是阻塞模式,明明默認使用NIO 模式,為何還要設置阻塞模式呢?為什么使用NIO,因為BIO的accept是阻塞方法,write和read也都是阻塞的。只能當新連接到來時,去創建新線程去處理這個連接。如此,最大問題是不能同時處理大量連接,因為大量連接帶來的是創建很多線程,大量線程很容易讓操作系統崩潰,而且雖然并發度很高,但是很多線程都在空轉,很多時間都浪費在線程空跑和線程切換上,效率也很差。于是誕生了NIO。

其實處理連接的操作不必放在后臺線程,因為后臺線程很可能會處理連接建立不及時,不如將其置于主線程,增加并發度(雖然優勢并不是特別明顯)。重點關心的是連接建立后獲得的與客戶端交互的那個socket,它的操作必須是非阻塞的,這很顯然。因為在處理長連接時,我們關心的是在本次連接之內數據的讀寫。

NioEndpoint 正在使用阻塞模式的 ServerSocketChannel 以使其阻塞并等待連接傳入,并且只有在accept后,才以非阻塞方式處理此傳入的socket channel (見setSocketOptions 方法)。

正如作者指出的那樣,使 ServerSocketChannel 成為非阻塞的將導致忙讀取,即一個線程將不斷輪詢有無傳入的連接,因為在非阻塞模式下 accept() 可能返回 null。

APR 代表 Apache Portable Runtime

Tomcat在接收到socket的時候做了如下操作:

SpringBoot應用啟動內置Tomcat的過程源碼分析SpringBoot應用啟動內置Tomcat的過程源碼分析SpringBoot應用啟動內置Tomcat的過程源碼分析

參考

https://blog.csdn.net/andy_zhang2007/article/details/78641974https://stackoverflow.com/questions/23168910/why-tomcats-non-blocking-connector-is-using-a-blocking-socket

到此這篇關于SpringBoot應用啟動內置Tomcat的過程分析的文章就介紹到這了,更多相關SpringBoot 內置Tomcat啟動內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: Spring
相關文章:
主站蜘蛛池模板: 免费个人pos机申请办理-移动pos机刷卡-聚合收款码办理 | 不锈钢复合板|钛复合板|金属复合板|南钢集团安徽金元素复合材料有限公司-官网 | 深圳法律咨询【24小时在线】深圳律师咨询免费 | 仿真茅草_人造茅草瓦价格_仿真茅草厂家_仿真茅草供应-深圳市科佰工贸有限公司 | 平面钻,法兰钻,三维钻-山东兴田阳光智能装备股份有限公司 | 5L旋转蒸发器-20L-50L旋转蒸发器-上海越众仪器设备有限公司 | 缝纫客 | 护腰带生产厂家_磁石_医用_热压护腰_登山护膝_背姿矫正带_保健护具_医疗护具-衡水港盛 | 接地电阻测试仪[厂家直销]_电缆故障测试仪[精准定位]_耐压测试仪-武汉南电至诚电力设备 | 机械加工_绞车配件_立式离心机_减速机-洛阳三永机械厂 | 膜片万向弹性联轴器-冲压铸造模具「沧州昌运模具」 | AGV叉车|无人叉车|AGV智能叉车|AGV搬运车-江西丹巴赫机器人股份有限公司 | 小区健身器材_户外健身器材_室外健身器材_公园健身路径-沧州浩然体育器材有限公司 | 泥浆在线密度计厂家-防爆数字压力表-膜盒-远传压力表厂家-江苏大亚自控设备有限公司 | 无菌检查集菌仪,微生物限度仪器-苏州长留仪器百科 | 焊接烟尘净化器__焊烟除尘设备_打磨工作台_喷漆废气治理设备 -催化燃烧设备 _天津路博蓝天环保科技有限公司 | 找培训机构_找学习课程_励普教育| 全自动过滤器_反冲洗过滤器_自清洗过滤器_量子除垢环_量子环除垢_量子除垢 - 安士睿(北京)过滤设备有限公司 | 注塑_注塑加工_注塑模具_塑胶模具_注塑加工厂家_深圳环科 | 金属回收_废铜废铁回收_边角料回收_废不锈钢回收_废旧电缆线回收-广东益夫金属回收公司 | 3dmax渲染-效果图渲染-影视动画渲染-北京快渲科技有限公司 | 膏剂灌装旋盖机-眼药水灌装生产线-西林瓶粉剂分装机-南通博琅机械科技 | 昆山新莱洁净应用材料股份有限公司-卫生级蝶阀,无菌取样阀,不锈钢隔膜阀,换向阀,离心泵 | 400电话_400电话申请_888元包年_400电话办理服务中心_400VIP网 | 沈阳楼承板_彩钢板_压型钢板厂家-辽宁中盛绿建钢品股份有限公司 轴承振动测量仪电箱-轴承测振动仪器-测试仪厂家-杭州居易电气 | 稳尚教育加盟-打造高考志愿填报平台_新高考志愿填报加盟_学业生涯规划加盟 | 连续密炼机_双转子连续密炼机_连续式密炼机-南京永睿机械制造有限公司 | 上海办公室装修公司_办公室设计_直营办公装修-羚志悦装 | 全温度恒温培养摇床-大容量-立式-远红外二氧化碳培养箱|南荣百科 | 电位器_轻触开关_USB连接器_广东精密龙电子科技有限公司 | 精雕机-火花机-精雕机 cnc-高速精雕机-电火花机-广东鼎拓机械科技有限公司 | LNG鹤管_内浮盘价格,上装鹤管,装车撬厂家-连云港赛威特机械 | 反渗透水处理设备|工业零排放|水厂设备|软化水设备|海南净水设备--海南水处理设备厂家 | 天津热油泵_管道泵_天津高温热油泵-天津市金丰泰机械泵业有限公司【官方网站】 | 京港视通报道-质量走进大江南北-京港视通传媒[北京]有限公司 | 上海公司注册-代理记账-招投标审计-上海昆仑扇财税咨询有限公司 上海冠顶工业设备有限公司-隧道炉,烘箱,UV固化机,涂装设备,高温炉,工业机器人生产厂家 | 常州减速机_减速机厂家_常州市减速机厂有限公司 | 小小作文网_中小学优秀作文范文大全 | 拉力机-拉力试验机-万能试验机-电子拉力机-拉伸试验机-剥离强度试验机-苏州皖仪实验仪器有限公司 | 超声骨密度仪,双能X射线骨密度仪【起草单位】,骨密度检测仪厂家 - 品源医疗(江苏)有限公司 | 贴片电容代理-三星电容-村田电容-风华电容-国巨电容-深圳市昂洋科技有限公司 |