交流
商城
MCN
登入
注册
首页
提问
分享
讨论
建议
公告
动态
发表新帖
发表新帖
第3 章:Connector介绍
分享
未结
0
923
李延
LV6
2021-08-02
悬赏:20积分
# 作用 Connector(连接器)组件是Tomcat最核心的两个组件之一,主要的职责就是负责接收客户端连接和客户端请求的处理加工。每个Connector都将指定一个端口进行监听,分别负责对请求报文的解析和响应报文组装。 在http协议中,复制 请求的连接与数据接收,并将请求组装成request和response。并在最后根据response返回数据。 # 组件说明 Connector组件其中包含Protocol组件、Mapper组件和CoyoteAdapter组件; **Protocol**组件:协议的抽象,对不同的通信协议进行了封装,比如HTTP协议和AJP协议;其中又分为一下组件: Endpoint是接收端的抽象,由于使用了不同的I/O模式,因此存在很多类型的Endpoint,如BIO模式的JionPoint、NIO模式的NioEndPoint和本地库I/O模式的APREndpoint。 Acceptor是专门用于接收客户端连接的接收器组件; Executor则是处理客户端请求的连接池,Connector可能使用了Service组件的共享线程池,也可能是Connector自己私有的线程池。 Processor组件是处理客户端请求的处理器,不同的协议和不同的I/O模式都有不同的处理方式,所以存在不同类型的Processor; **Mapper**组件可以称为路由器,它提供了对客户端请求URL的映射功能,即可以通过它将请求转发到对应的Host组件、Context组件、Wrapper组件以进行处理并响应客户端,也就是我们说的将某客户端请求发送到某虚拟机上的某个Web应用的某个Servlet。 **CoyoteAdapter**组件是一个适配器,它负责将Connector组件和Engine容器适配连接起来。把接收到的客户端请求报文解析生成的请求对象Request和响应对象Response传递到Engine容器,交由容器处理; [参考](https://blog.csdn.net/qq_36807862/article/details/81287955) # 源码说明 ## 初始化 在创建的时候呀使用的是无参的构造函数。具体如下: ```java public Connector() { this("HTTP/1.1"); } ``` 我们看到默认使用的是 HTTP/1.1 的协议。我们具体根据会发现创建的Protocol具体如下: ```java return new org.apache.coyote.http11.Http11NioProtocol(); ``` 我们看到最后使用的就是Http11NioProtocol。 ## 启动 Connector继承了LifecycleMBeanBase。在前面我们分析到启动的时候,会调用initInternal 和startInternal方法。具体如下: ### initInternal ```java @Override protected void initInternal() throws LifecycleException { super.initInternal(); if (protocolHandler == null) { throw new LifecycleException( sm.getString("coyoteConnector.protocolHandlerInstantiationFailed")); } // Initialize adapter adapter = new CoyoteAdapter(this); protocolHandler.setAdapter(adapter); //............ //............ try { protocolHandler.init(); } catch (Exception e) { throw new LifecycleException( sm.getString("coyoteConnector.protocolHandlerInitializationFailed"), e); } } ``` 我们看到在init的时候创建了adapter。并执行了protocol的init方法。 ### start ```java @Override protected 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); } } ``` 在start中与init相似,也是调用protocol的start。
回帖
消灭零回复
提交回复
热议榜
java 相关知识分享
8
好的程序员与不好的程序员
6
写给工程师的十条精进原则
5
spring boot以jar包运行配置的logback日志文件没生成
5
一步一步分析SpringBoot启动源码(一)
5
MockMvc测试
5
【吐槽向】是不是有个吐槽的板块比较好玩
4
logstash jdbc同步mysql多表数据到elasticsearch
3
IntelliJ IDEA 优质License Server
3
.gitignore忽略规则
3
SpringBoot启动源码分析
3
一步一步分析SpringBoot启动源码(三)
3
2
一步一步分析SpringBoot启动源码(二)
2
积分不够将无法发表新帖
2
官方产品
Meta-Boot - 基于MCN
MCN - 快速构建SpringBoot应用
微信扫码关注公众号