톰캣 소스 코드 분석 (B) ----- 톰캣 전체 아키텍처 및 구성 요소

머리말

Tomcat은 이전에 카탈로 알려져 있지만 카탈은 경량 서블릿 컨테이너입니다. 미국에서는 카탈 아름다운 섬입니다. 그래서 톰캣 톰캣의 교훈은 아름답고 우아한 경량 웹 서버를 설계하는 것을 시도 할 수있다. 그 때문에뿐만 아니라 톰캣 카탈을 등 JSP, 엘, 명명 : 다음과 같은 추가 기능을 많이 추가하는 외부 서블릿 컨테이너에 의해 지원되고 이외에 시작에서 톰캣 4.x의 버전.

최초의 톰캣은 서블릿 컨테이너이기 때문에, 우리는 서블릿 더 걱정해야한다.

그래서, 서블릿은 무엇인가?

태양의 (나중에 오라클에 인수)가 이미이 기회를보고 인터넷의 상승의 시작 부분에서, 그는 웹 응용 프로그램 애플릿을 지원하기 위해 고안했다. 그러나 사실은 잘, 일 슬픈 알림은 업계에 큰 영향을 가져 오지 않은 애플릿을 찾을 것으로 예상되지 않는다. 반사 후, 태양, 시장 전망, 우리는 헛된 아를 포기하지 않을 수있는 아주 좋은 때문에이 있었다 기회를 원했다, 그것을 어떻게 할까? 그래서 그는 규범의 집합에 참여하는 에너지를 넣어 다음 서블릿 탄생!

소위 서블릿, 사실, 썬은 웹 프로그래밍 분야 및 표준의 집합의 개발을 입력, 동적 대화 형 웹 페이지를 달성하기 위해 자바를 만들기 위해!

서블릿은 주로 다음과 같은 세 가지 일을합니다 :

  1. URI 파라미터, 방법, 요청 헤더 요청 정보 등을 : 요청 개체에있어서, 생성되고 채워
  2. 응답 객체를 생성
  3. 비즈니스 로직을 실행하고 출력 스트림 응답을 클라이언트로 출력

수행 할 경우, 당신이 필요하므로, 어떤 주요 방법을 서블릿없는 容器내부 수행 할 컨테이너가 서블릿 기능이 존재 지원하는 것입니다, Tomcat은 실제로 컨테이너 구현 서블릿이다.

전체 차트

우리는 두 가지 구성 요소의 핵심 볼 그래프에서 - 커넥터 (커넥터)와 용기 (컨테이너)는 재생 心脏역할을, 그들은 필수! 다음과 같이 이들의 역할은 다음과 같습니다

1 처리부 연결 관련 일들을위한 커넥터 및 관련 소켓 변환 요청 및 응답 제공,
(2), 용기 포장 관리 서블릿, 특정 처리 요구 요청;

만 톰캣 서버 중 하나, 서버가 여러 서비스를 포함 할 수 있습니다, 서비스는 하나의 컨테이너가 있지만 서비스는 HTTP 및 HTTPS 링크를 제공하는 것이 또한 제공 할 수 있지만 여러 연결을 가질 수 있기 때문에, 여러 개의 커넥터를 가질 수 있습니다 다음과 같은 프로토콜의 서로 다른 포트에 연결하는 개략도 (엔진, 호스트 컨텍스트 우리는 아래에서 논의 됨)이다 :

서비스와 더 많은 커넥터 및 서비스의 형성에 컨테이너가 서비스를 제공 할뿐만 아니라 생활 환경 서비스, 누군가가 그녀의 인생을주고 삶과 죽음의 힘을 파악 할 수 있어야합니다, 그것은 비 Server 이외의 아무도 없다 최대! 따라서 전체 수명주기는 톰캣 서버에 의해 제어됩니다.

 또한, 부모 - 자식 관계를 포함하는 전술 한 관계는 톰캣 conf 디렉토리 일 수 server.xml프로파일 본

상부 프로파일은 또한보다 명확 블록도의 하측으로부터 이해 될 수있다 :

 

우리에게 다양한 구성 요소의 기능을 분석하는 하나 하나를 보자 :

  1. Server그것은 서버가 시작 개별 커넥터와 컨테이너를 중지하지 않고 시작하고 전체 시스템을 중지하는 우아한 방법을 제공한다는 것을 의미
  2. Service익스프레스 서비스, Server여러 개의 서비스를 실행할 수 있습니다. 예를 들어, 톰캣 내부 서비스 주문, 결제 서비스, 사용자 서비스 등을 실행할 수 있습니다
  3. 각각 Service포함 할 수있다 多个Connector一个Container. 각각의 서비스는 다수의 프로토콜을 동시에 지원을 허용하지만, 서블릿의 최종 실행이 각각의 프로토콜은 동일하므로
  4. Connector커넥터, 서비스 등이 AJP 프로토콜을 지원할 수를 나타내고,는 HTTP 프로토콜 및 프로토콜 각각의 프로토콜은 커넥터를 지원하기 위해 사용될 수 HTTPS를
  5. Container컨테이너를 나타냅니다, 컨테이너는 서블릿 볼 수 있습니다
    • Engine - 엔진
    • Host - 호스트
    • Context - 컨텍스트
    • Wrapper - 래퍼
  6. Service服务之下还有各种支撑组件,下面简单罗列一下这些组件
    • Manager -- 管理器,用于管理会话Session
    • Logger -- 日志器,用于管理日志
    • Loader -- 加载器,和类加载有关,只会开放给Context所使用
    • Pipeline -- 管道组件,配合Valve实现过滤器功能
    • Valve -- 阀门组件,配合Pipeline实现过滤器功能
    • Realm -- 认证授权组件

除了连接器和容器,管道组件和阀门组件也很关键,我们通过一张图来看看这两个组件

Connector和Container的微妙关系

由上述内容我们大致可以知道一个请求发送到Tomcat之后,首先经过Service然后会交给我们的Connector,Connector用于接收请求并将接收的请求封装为Request和Response来具体处理,Request和Response封装完之后再交由Container进行处理,Container处理完请求之后再返回给Connector,最后在由Connector通过Socket将处理的结果返回给客户端,这样整个请求的就处理完了!

Connector最底层使用的是Socket来进行连接的,Request和Response是按照HTTP协议来封装的,所以Connector同时需要实现TCP/IP协议和HTTP协议!

Connector架构分析

Connector用于接受请求并将请求封装成Request和Response,然后交给Container进行处理,Container处理完之后在交给Connector返回给客户端。

因此,我们可以把Connector分为四个方面进行理解:

(1)Connector如何接受请求的?
(2)如何将请求封装成Request和Response的?
(3)封装完之后的Request和Response如何交给Container进行处理的?

首先看一下Connector的结构图,如下所示:

Connector就是使用ProtocolHandler来处理请求的,不同的ProtocolHandler代表不同的连接类型,比如:Http11Protocol使用的是普通Socket来连接的,Http11NioProtocol使用的是NioSocket来连接的。

其中ProtocolHandler由包含了三个部件:Endpoint、Processor、Adapter。

(1)Endpoint用来处理底层Socket的网络连接,Processor用于将Endpoint接收到的Socket封装成Request,Adapter用于将Request交给Container进行具体的处理。

(2)Endpoint由于是处理底层的Socket网络连接,因此Endpoint是用来实现TCP/IP协议的,而Processor用来实现HTTP协议的,Adapter将请求适配到Servlet容器进行具体的处理。

(3)Endpoint的抽象实现AbstractEndpoint里面定义的Acceptor和AsyncTimeout两个内部类和一个Handler接口。Acceptor用于监听请求,AsyncTimeout用于检查异步Request的超时,Handler用于处理接收到的Socket,在内部调用Processor进行处理。

Container如何处理请求的

Container处理请求是使用Pipeline-Valve管道来处理的!(Valve是阀门之意)

Pipeline-Valve是责任链模式,责任链模式是指在一个请求处理的过程中有很多处理者依次对请求进行处理,每个处理者负责做自己相应的处理,处理完之后将处理后的请求返回,再让下一个处理着继续处理。

但是!Pipeline-Valve使用的责任链模式和普通的责任链模式有些不同!区别主要有以下两点:

(1)每个Pipeline都有特定的Valve,而且是在管道的最后一个执行,这个Valve叫做BaseValve,BaseValve是不可删除的;

(2)在上层容器的管道的BaseValve中会调用下层容器的管道。

我们知道Container包含四个子容器,而这四个子容器对应的BaseValve分别在:StandardEngineValve、StandardHostValve、StandardContextValve、StandardWrapperValve。

Pipeline的处理流程图如下:

(1)Connector在接收到请求后会首先调用最顶层容器的Pipeline来处理,这里的最顶层容器的Pipeline就是EnginePipeline(Engine的管道);

(2)在Engine的管道中依次会执行EngineValve1、EngineValve2等等,最后会执行StandardEngineValve,在StandardEngineValve中会调用Host管道,然后再依次执行Host的HostValve1、HostValve2等,最后在执行StandardHostValve,然后再依次调用Context的管道和Wrapper的管道,最后执行到StandardWrapperValve。

(3)当执行到StandardWrapperValve的时候,会在StandardWrapperValve中创建FilterChain,并调用其doFilter方法来处理请求,这个FilterChain包含着我们配置的与请求相匹配的Filter和Servlet,其doFilter方法会依次调用所有的Filter的doFilter方法和Servlet的service方法,这样请求就得到了处理!

(4)当所有的Pipeline-Valve都执行完之后,并且处理完了具体的请求,这个时候就可以将返回的结果交给Connector了,Connector在通过Socket的方式将结果返回给客户端。

总结

好了,我们已经从整体上看到了Tomcat的结构,但是对于每个组件我们并没有详细分析。后续章节我们会从几个方面来学习Tomcat:

  1. 逐一分析各个组件
  2. 通过断点的方式来跟踪Tomcat代码中的一次完整请求

 

 

추천

출처www.cnblogs.com/java-chen-hao/p/11316795.html