기본 프레임 워크의 소스 코드 분석의 톰캣 소스 심층 분석

전체 아키텍처

아래와 같이 일반 아키텍처 톰캣 (http://blog.csdn.net/jiaomingliang/article/details/47393141 찍은) 



Tomcat 서버, 위와 같이, 서비스 엔진은 Connerctor는 호스트 콘텍스트 요소는, 상기 복수의 부품으로 대표 S는 컨텍스트 (들), 우리는 여러 Tomcat을 배포 할 수 같이 톰캣 인스턴스에 존재 애플리케이션은 각각의 컨텍스트에 대응. 이러한 구성 요소는 바람둥이의 conf / server.xml 파일에서 찾을 수 있습니다, 필요의 튜닝은 파일 바람둥이을 변경하려면


server.xml의

<서비스 이름 = "카타리나">

    <커넥터 포트 = "8080"프로토콜 = "HTTP / 1.1"

           은 ConnectionTimeout = "20000"

           있는 redirectPort = "8443"/>


    <커넥터 포트 = "8080"프로토콜 = "HTTP / 1.1"

               은 ConnectionTimeout = "20000"

               있는 redirectPort = "8443"/>


    <커넥터 포트 = "8009"프로토콜 = "AJP / 1.3"있는 redirectPort = "8443"/>


    <엔진 이름 = "카타리나"defaultHost에서 = "로컬 호스트">

      <영역 클래스 이름 = "org.apache.catalina.realm.LockOutRealm">

        <영역 클래스 이름 = "org.apache.catalina.realm.UserDatabaseRealm"

               resourceName이 = "사용자 데이터베이스"/>

      </ 영역>

      <호스트 이름 = "localhost"를 appBase = "webapps에"

            unpackWARs = "true"를 autoDeploy = "진정한">

        <밸브 클래스 이름은 = "org.apache.catalina.valves.AccessLogValve"디렉토리 = "로그"

               접두사 = "localhost_access_log"접미사 = ". TXT"

               패턴 = "% 1 %의 시간 (L) % U % t & quot; %의 R & quot; % S %의 B"/>

      </ 호스트>

    </ 엔진>

</ 서비스>

1

4

5

6

(7)

8

9

(10)

(11)

(12)

(13)

(14)

(15)

(16)

(17)

(18)

(19)

(20)

(21)

(22)

(23)

(24)

(25)

섬기는 사람



도에 보이는 서버 구성 요소에 대응 org.apache.catalina.Server 인터페이스 클래스. 

- 수명주기 서버 상속 수명주기가 매우 중요한 인터페이스이며, 주요 구성 요소는 초기화, 시작, 정지, 32 파괴와 같은 바람둥이의 라이프 사이클을 관리하기 위해이 인터페이스를 상속, 또한, 라이프 사이클을 옵저버 패턴을 사용하여 LifecycleListener 관찰자를 등록하는 수신기이며, 다양한 이벤트를 보낼 것입니다 

- 서버는 서비스 구성 요소를 탐색, 발견 지원은 거의 연결 구성 요소 및 Serivce을 볼 수있을 것 findService, getCatalina, getCatalinaHome, getCatalinaBase 인터페이스를 제공합니다


공용 인터페이스 서버 라이프 사이클을 {확장


    공공 NamingResourcesImpl getGlobalNamingResources ();


    공공 무효 setGlobalNamingResources (NamingResourcesImpl globalNamingResources);


    공공 javax.naming.Context getGlobalNamingContext ();


    공공 INT getPort ();


    공공 무효 setPort (INT 포트);


    공공 문자열 getAddress에 ();


    공공 무효 setAddress (문자열 주소);


    공공 문자열 getShutdown ();


    공공 무효 setShutdown (문자열 종료)


    공공 클래스 로더 getParentClassLoader ();


    공공 무효 setParentClassLoader (클래스 로더의 부모);


    공공 카탈 getCatalina ();


    공공 무효 setCatalina (카탈 카탈);


    공공 파일 getCatalinaBase ();


    공공 무효 setCatalinaBase (파일 catalinaBase);


    공공 파일 getCatalinaHome ();


    공공 무효 setCatalinaHome (파일 catalinaHome);


    공공 무효 AWAIT ();


    공공 서비스 findService (문자열 이름);


    공용 서비스 [] findServices ();


    공공 무효 removeService (서비스 서비스);


    공공 오브젝트 getNamingToken ();

}

1

4

5

6

(7)

8

9

(10)

(11)

(12)

(13)

(14)

(15)

(16)

(17)

(18)

(19)

(20)

(21)

(22)

(23)

(24)

(25)

(26)

(27)

(28)

(29)

(30)

(31)

(32)

(33)

(34)

(35)

(36)

(37)

(38)

(39)

(40)

(41)

(42)

(43)

(44)

(45)

(46)

서비스

LifecycleMBeanBase에 상속, 기본 구현 클래스 서비스 StardardService이며, StardardServer 클래스 구조가 매우 유사하다, 구현 서비스 인터페이스


내부 구조의 서비스 인터페이스 서비스 구성 요소에 의해 발견하는 것은 어렵지 않다 

- 엔진 인스턴스 유지 

- 서버 인스턴스를 잡고 

- 관리 할 수있는 여러 인스턴스 커넥터 

- 홀드 집행자 참조


공용 클래스 StandardService는 LifecycleMBeanBase 구현 서비스를 {확장

    // 코드는 몇 가지 생략

}


공용 인터페이스의 서비스 라이프 사이클을 {확장


    공공 엔진 getContainer에 ();


    공공 무효 setContainer (엔진 엔진);


    공공 문자열 getName ();


    공공 무효에서는 setName (문자열 이름);


    공공 서버 getServer ();


    공공 무효 setServer (서버 서버);


    공공 클래스 로더 getParentClassLoader ();


    공공 무효 setParentClassLoader (클래스 로더의 부모);


    공공 문자열 getDomain ();


    공공 무효 addConnector (커넥터 커넥터);


    공용 커넥터 [] findConnectors ();


    공공 무효 removeConnector (커넥터 커넥터);


    공공 무효 addExecutor (집행 인 예);


    공개 실행자 [] findExecutors ();


    공공 집행자 getExecutor (문자열 이름);


    공공 무효 removeExecutor (집행 인 예);


    매퍼 getMapper ();

}

1

4

5

6

(7)

8

9

(10)

(11)

(12)

(13)

(14)

(15)

(16)

(17)

(18)

(19)

(20)

(21)

(22)

(23)

(24)

(25)

(26)

(27)

(28)

(29)

(30)

(31)

(32)

(33)

(34)

(35)

(36)

(37)

(38)

(39)

(40)

커넥터

커넥터는 HTTP AJP 포트를 모니터링하기 위해 각각 조립,의 server.xml 정의하는 두 개의 기본 커넥터에서 TCP 포트 바람둥이에 듣고있다. 해당 코드가 org.apache.catalina.connector.Connector, 그것은 구현 클래스 및 구현 인터페이스 라이프 사이클이다


HTTP

<커넥터 포트 = "8080"프로토콜 = "HTTP / 1.1"

               은 ConnectionTimeout = "20000"

               있는 redirectPort = "8443"/>

1

커넥터 HTTP HTTP 프로토콜을 지정할 수있는 프로토콜의 버전, 또한 2.0을 지원하며, 전술 한 바와 같이 대응하는 구성]은 ConnectionTimeout 밀리 초, 접속 시간을 정의하며있는 redirectPort는 SSL 포트 리디렉션 그 요청을 리디렉션 이 포트 8443


AJP

<커넥터 포트 = "8009"프로토콜 = "AJP / 1.3"있는 redirectPort = "8443"/>

1

아파치 jserver 프로토콜 (AJP)는 바이너리 프로토콜 응용 프로그램 서버에있는 웹 서버에 인바운드 요청에서 웹 서버가. 우리는 아파치 HTTP 기존 (또는 신규) 서버에 톰캣 통합을 원하고 아파치는 정적 콘텐츠 웹 응용 프로그램에 포함 된 처리하는, 또는 아파치 SSL 프로세싱을 사용하는 경우, 우리는이 프로토콜을 사용할 수 있습니다. 그러나, 실제 프로젝트의 응용 프로그램에서, AJP 프로토콜은 일반적으로 사용되지 않으며, 대부분의 경우는의 nginx + 바람둥이로드를 사용합니다.


컨테이너

API를 org.apache.catalina.Container 인터페이스는 핸들입니다 컨테이너를 정의하고 네 가지 컨테이너가 사용자의 웹 모듈에 대한 사용자 서블릿 요청 객체를 반환합니다 : 

- 엔진은 전체 카탈리나 서블릿 엔진을 나타냅니다 

- 호스트, 호스팅 문맥 웹의 숫자를 표현했다 

- 컨텍스트는 웹 응용 프로그램, 하나 또는 그 이상의 래퍼를 포함하는 컨텍스트를 나타냅니다 

- 래퍼는 독립 서블릿을 나타냅니다




엔진, 호스트, 컨텍스트, 래퍼 StandardXXX이 ContainerBase에 상속됩니다 기본 구현 클래스가 있습니다. 또한, 상기 컨테이너는 상기처럼 Lodder, 로거 관리자 리소스 영역의 시리즈를 포함하고,


컨테이너는 낮은 수준에 하나 이상의 하위 컨테이너를 가질 수 있으며, 카탈 기능은 반드시 네 용기를 배포 할 필요가 없습니다. 컨텍스트는 하나 이상의 래퍼의하는 맨 아래 컨테이너 계층과 래퍼, 컨테이너가 아이를 포함 할 수있다. 다른 용기에 하나 개의 컨테이너로부터 추가 인터페이스 정의에서 정의하는 AddChild 컨테이너 () 메소드를 사용할 수있다 :


공공 무효하는 AddChild (컨테이너 아이); 

1

컨테이너는 정의로 removeChild 컨테이너 인터페이스 () 메소드를 삭제하기 위해 사용될 수있다 :


공공 무효로 removeChild (컨테이너 아이); 

1

또한 용기 인터페이스 지원 하위 인터페이스와 액세스 방법 findChild 방법 findChildren 대한 모든 인터페이스 서브 세트를 보면 :


공공 컨테이너 findChild (문자열 이름); 

공용 컨테이너 [] findChildren (); 

1

엔진



사용되는 경우, 엔진이 탈리 서블릿 엔진을 나타내고, 엔진, 그때는 방법이 예외를 직접 던지는는, setParent의 StardardCataline ()에서 탈리 상부 용기이며


공용 인터페이스 엔진은 컨테이너를 {확장


    공공 문자열 getDefaultHost ();


    공공 무효 setDefaultHost (문자열 defaultHost에서);


    공공 문자열 getJvmRoute ();


    공공 무효 setJvmRoute (문자열 jvmRouteId);


    공공 서비스의 getService ();


    공공 무효 setService (서비스 서비스);

}


공용 클래스 StandardEngine는 ContainerBase 구현 엔진을 {확장


    // 다른 코드 ...


    공공 무효는, setParent (컨테이너 컨테이너) {

        새로운 IllegalArgumentException가 (sm.getString ( "standardEngine.notParent을")) 던져;

    }

}

1

4

5

6

(7)

8

9

(10)

(11)

(12)

(13)

(14)

(15)

(16)

(17)

(18)

(19)

(20)

(21)

(22)

(23)

server.xml의


<엔진 이름 = "카타리나"defaultHost에서 = "로컬 호스트">

  <영역 클래스 이름 = "org.apache.catalina.realm.LockOutRealm">

    <영역 클래스 이름 = "org.apache.catalina.realm.UserDatabaseRealm"

           resourceName이 = "사용자 데이터베이스"/>

  </ 영역>


  <호스트 이름 = "로컬 호스트는"appBase = unpackWARs = "true"를 autoDeploy = "를 웹 어플리케이션"을 "true">

    <밸브 클래스 이름은 = "org.apache.catalina.valves.AccessLogValve"디렉토리 = "로그"

           접두사 = "localhost_access_log"접미사 = ". TXT"

           패턴 = "% 1 %의 시간 (L) % U % t & quot; %의 R & quot; % S %의 B"/>

  </ 호스트>

</ 엔진>

1

4

5

6

(7)

8

9

(10)

(11)

(12)

숙주

호스트는 물론 가상 호스트, 이른바 가상 호스트를 정의하고,이를 응용 프로그램, Tomcat의 호스트뿐만 아니라를 배포하는 데 사용할 수 있습니다. 그것은 로컬 호스트 호스트의 server.xml에 정의되어, 응용 프로그램 루트 디렉토리 아래의 웹 어플리케이션, 기본은 압축 해제의 재배치를 지원하는 것입니다.


... </ 호스트> <호스트 이름은 = "로컬 호스트는"appBase = unpackWARs = "true"를 autoDeploy = "true"를 "웹 어플리케이션">을

1

문맥



컨텍스트는 다른 클래스 로더 피할 클래스 충돌을 사용하는 바람둥이 각 컨텍스트에 대한 별도의 웹 응용 프로그램을 나타냅니다. 우리는 사용자 정의 배포 경로로 디렉토리를 사용하려면 server.xml의 컨텍스트에 추가 할 수 있습니다


<컨텍스트 경로 = "/ 정지"= Docbase의 "D / 정지"재충전 = "참"> </ 컨텍스트>

1

코드 모듈 소개

카탈 리 패키지

톰캣 코어 HttpServlet을,의 HttpSession를 달성하기 위해 포함 모듈, 및 주요 구성 요소의 실현의 일부는, 코드의 양이 조각은 가장 크고 복잡하다


coyote 포

이는 HTTP1.1, http2.0, AJP 등 다양한 프로토콜, 코드의 적은 양을 지원하기 위해 주로


추천

출처blog.51cto.com/14524696/2455532