设为首页 收藏本站
云服务器等爆品抢先购,低至4.2元/月
查看: 446|回复: 0

[经验分享] Tomcat 源码分析

[复制链接]

尚未签到

发表于 2017-1-19 06:23:00 | 显示全部楼层 |阅读模式
Tomcat 源码分析
------------------

Bootstrap
引导过程:

1 初始化自定义的类加载器:
common
shared
catalina

2 创建并实例化第一个组件类 Catalina

Tomcat 组件体系:
Server
    Service
        Connector
        Engine
            Host
                Context


实现Lifecycle生命周期接口: 表示支持生命周期管理.
start
stop

实现MBeanRegistration接口: 表示这是一个MBean.

实现Service接口,表示这是一个服务组件.

3. 创建Server, Service, Connector, Executor, LifecycleListener, GlobalNamingResource 等组件
读取配置文件 conf/server.xml 并通过反射调用:
setServer(Catalina)
setGlobalNamingResources
addLifecycleListener
addService
addExecutor
addConnector

4. 初始化 Server
StandardServer
4.1 JMX 注册 StandardServer MBean 到 JMBean Server,名称:Catalina:type=Server
4.2 注册 StringCache MBean, 名称: Catalina:type=StringCache

5. 初始化 Service, Executor, Connector
StandardService
5.1 注册 StandardService MBean, 名称: Catalina:type=Service,serviceName=Catalina
5.2 注册 StandardThreadExecutor MBean,名称: Catalina:type=Executor,name=org.apache.catalina.core.StandardThreadExecutor
5.3 注册 Connector MBean, 名称: Catalina:type=Connector,port=8080,address=127.0.0.1
Catalina:type=Connector,port=8009,address=127.0.0.1
5.4 创建适配器CoyoteAdapter
5.5 初始化ProtocolHandler, 我们这里只看Http11Protocol

6 JIoEndpoint
处理TCP连接,默认一个连接分配给一个线程,支持队列.
6.1 创建 DefaultServerSocketFactory
6.2 创建 ServerSocket

---------------- 引导初始化 ---------------

7 启动Server
7.1 启动Service
7.2 启动 Servlet Engine
     注册 StandardEngine, 名称: Catalina:type=Engine
     读取并注册 conf/tomcat5-mbeans.xml, 调用 MBean.init
     
7.3 启动 Executor
     创建 TaskQueue, TaskThreadFactory
     创建 线程池 ThreadPoolExecutor
     
7.4 启动 Connector
     注册JIOEndpoint, 名称: Catalina:type=ThreadPool,name=HTTP11Protocol
     注册GlobalRequestProcessor, 名称: Catalina:type=GlobalRequestProcessor,name=HTTP11Protocol

7.5 启动 JIOEndpoint
     创建 WorkerStack 工人线程集合
     启动TCP接收线程

8 启动TCP处理线程
当有连接建立时,会获取一个Socket对象.
一个ServerSocket可以服务多个Socket. 并发时会有多个ServerSocket.

过程如下:
并发情况下, Socket处理会加入队列, 队列满时,会抛出拒绝连接异常.
正常情况下会启动 SocketProcessor线程处理Socket. 在线程内转交对应的协议Processor来进行处理.
然后获取Socket Stream,保存到InputBuffer/OutputBuffer
解析请求头
然后调用 adapter.service(request, response) 转交请求数据给adapter.
adapter将请求转交给enginee -> host -> context -> listener -> wrapper -> filter -> ApplicationFilterChain -> Servlet.service() 来链式处理.
...
关闭Socket
重复上面过程



















-> Catalina -> conf/server.xml -> Server -> StandardServer -> Service -> StandardService -> Connector -> CoyoteAdapter -> ProtocolHandler -> Http11Protocol -> JIoEndpoint -> Http11ConnectionHandler -> ServerSocketFactory
-> StandardThreadExecutor -> ThreadPoolExecutor -> WorkerStack -> Acceptor -> SocketProcessor -> Request & Response -> Adapter -> CoyoteAdapter -> StandardWrapper -> Filter & Servlet

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-330305-1-1.html 上篇帖子: tomcat 源码解析 下篇帖子: 配置tomcat服务器
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表