Tomcat 流程梳理

1)Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。

    在设计模式中,Socket其实就是一个门面模式(Facade Pattern, 也叫做外观模式),它把复杂的TCP/IP协议族隐藏在Socket接口后面

    对用户来说,一组简单的接口就是全部,让Socket去组织数据,以符合指定的协议。



2)新建ServerSocket 对象需要一个参数(port),绑定端口;它的accept()方法的执行将使Server端的程序处于等待状态,

    Client 端新建Socket 对象需要两个参数(host, port)

    程序将一直阻塞直到捕捉到一个来自Client端的请求,并返回一个用于与该Client通信的Socket对象

    此后Server程序只要向这个 Socket对象读写数据,就可以实现向远端的Client读写数据。
    ServerSocket 一般仅用于设置端口号和监听, 真正进行通信的是服务器端的Socket与客户端的Socket

    在ServerSocket 进行accept之后,就将主动权转让了。

    当一个Socket会话产生后或者说服务器端SeverSocket接收了Socket后,将这个sokcet会话交给线程处理,然后主程序继续监听。运用Thread类或Runnable接口来实现是不错的办法。 

3)Tomcat 流程开始;C:\Program Files\apache-tomcat-8.5.24\bin\startup.bat 启动tomcat

    start "Tomcat" "C:/j2sdk1.4.2_15/bin/java" -D...

    在该命令中,start "Tomcat"是在控制台打开一个新的窗口,然后运行java虚拟机 C:/j2sdk1.4.2_15/bin/java, 现在大家应该明白了,tomcat是从bootstrap.jar中的org.apache.catalina.startup.Bootstrap 类main函数开始启动运行,并且传入了start参数。-D开始的都是虚拟机的运行参数;

    初始化运行环境,载入需要的jar包,读取conf/server.xml,生成相应的运行对象(组件):connector, service, engine, host, context. 

    A web container (also known as a servlet container) is essentially the component of a web server that interacts with the servlets.

    server就代表一个web容器,代表一个服务器,其它的几个概念都是属于server的一部分。service表示web容器能够提供的某项服务。如果把server按照功能粒度进行细化,那么每个单元就是一个service。connector和engine是组成server的两个组成部分。engine是执行用户的请求的引擎,connector是请求执行的通道。connector本身并不做请求的处理,只是提供通道功能。

    Connector 类的构造函数,主要是初始化一个ProtocolHandler对象;启动函数,则主要是启动这个对象;在ProtocolHandler上的init和start所执行的操作,通过AbstractProtocol这两个方法的实现来看;从代码上看AbstractProtocol本身并不做太多请求解析处理相关的事情,它是把事情委托给了一个AbstractEndpoint对象来完成。类似init和start生命周期,其它的几个生命周期如pause、resume、stop、destory也主要是通过AbstractEndpoint对象来完成。在Http11NioProtocol的构造函数中指定的是使用NioEndpoint实例,因此这里通过分析AbstractEndpoint的子类NioEndpoint来做进一步的了解。经过了这么一长串的处理之后,请求被转到了Connector来进行处理。


4)RMI全称为Remote Method Invocation,中文翻译为远程方法调用。指的是从本地调用服务器上的一组方法,服务器根据提交的信息(方法名、方法携带参数)计算得到结果、并将结果返回给调用者。Java Remote Method Invocation指的是在Java上实现上述机制。

5)。。。

6)SpringBoot (SpringMVC+Spring 环境) Debug 记录

    org/apache/tomcat/util/net/NioEndpoint$Acceptor.run();

    sun.nio.ch.ServerSocketChannelImpl.accept();    

SocketChannel和ServerSocketChannel的概念与基础的阻塞式的java 网络编程中的socket和serversocket类似。
在后者的模型中,服务器端生成一个serversocket对象,bind绑定端口号,然后accept阻塞等待客户端连接到服务器。每当连接建立成功,则返回一个Socket对象,用来表示连接建立成功。
在java nio中。ServerSocketChannel和SocketChannel模型其实是与ServerSocket和Socket模型对应的。服务器端open打开一个ServerSocketChannel,这个操作同时会成功一个ServerSocket对象,但生成的ServerSocket对象是没有进行端口绑定的。所以在进行网络监听之前,还需要对ServerSocketChannel的ServerSocket对象进行bind绑定操作。然后ServerSocketChannel开始进行accept网络监听,请求建立成功之后返回一个SocketChannel对象。这个SocketChannel对象有一个与之对应的Socket对象。
ServerSocketChannel是线程安全的 ---- at least the Oracle documentation says so.

    sun.rmi.transport.tcp.TCPTransport.class: void executeAcceptLoop(){var1 = this.serverSocket.accept();};

    org.apache.tomcat.util.net.NioBlockingSelector$BlockPoller: void run(); 

        Acceptor的作用是控制与tomcat建立连接的数量,但Acceptor只负责建立连接。socket内容的读写是通过Poller来实现的。Poller使用java nio来实现连接的管理。Java NIO(New IO)是一个可以替代标准Java IO API的IO API(从Java 1.4开始),Java NIO提供了与标准IO不同的IO工作方式。

    org.apache.coyote.AbstractProtocol.class;

    org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor;

    org.springframework.boot.web.embedded.tomcat.TomcatWebServer.class

    org.apache.catalina.core.StandardServer.class; 它代表一个服务器实例,有一个Service数组的属性,为当前这个Server所拥有的service。(StandardService表示一项具体的服务能力,它有一个Connector数组的属性,是属于这个Service的连接器;此类中的executors代表为这个服务配置的ArrayList 线程池,可在多个Connector之间共享。)

    org.apache.tomcat.util.threads.TaskThread$WrappingRunnable;

    org.apache.tomcat.util.net.SocketProcessorBase;

    org\apache\coyote\AbstractProcessorLight.class;

    org\apache\coyote\http11\Http11Processor.class;

    org/apache/catalina/connector/CoyoteAdapter.class; 每个到达Tomcat Connector的请求都有一个对应的线程去处理;线程池是在服务中配置的,在connector之间共享的。

    org/apache/catalina/core/StandardEngineValve.class;

    org/apache/catalina/valves/ErrorReportValve.class;

    org/apache/catalina/authenticator/AuthenticatorBase.class;

    org\apache\catalina\core\StandardHostValve.class;

    org/apache/catalina/authenticator/AuthenticatorBase.class;

    org/apache/catalina/core/StandardContextValve.class;

    org/apache/catalina/core/StandardWrapperValve.class;

    org\apache\catalina\core\ApplicationFilterChain.class;

    org/springframework/web/filter/OncePerRequestFilter.class;

    org/springframework/web/filter/CharacterEncodingFilter.class; 看来SpringBoot 自动配了编码过滤器;之前手动搭建SSM框架需要在web.xml 配置此过滤器。

    org/springframework/web/filter/RequestContextFilter.class;

    javax/servlet/http/HttpServlet.class;

    org/springframework/web/servlet/FrameworkServlet.class;

    org/springframework/web/servlet/DispatcherServlet.class;

    org/springframework/web/servlet/mvc/method/AbstractHandlerMethodAdapter.class;

    org/springframework/web/servlet/mvc/method/annotation/RequestMappingHandlerAdapter.class;

    org/springframework/web/servlet/mvc/method/annotation/ServletInvocableHandlerMethod.class;

    org/springframework/web/method/support/InvocableHandlerMethod.class;

    java/lang/reflect/Method.java;


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值