±à¼ÍƼö: |
±¾ÎÄÖ÷Òª½éÉÜTomcatµÄ×ÜÌå¼Ü¹¹,Á¬½ÓÆ÷
Connector£¬ÈÝÆ÷ Container£¬Ï£Íû¶ÔÄúµÄѧϰÓÐËù°ïÖú¡£
±¾ÎÄÀ´×ÔÓÚÔÆÊ±´ú¼Ü¹¹£¬ÓÉ»ðÁú¹ûÈí¼þAlice±à¼¡¢ÍƼö¡£ |
|
×ÜÌå¼Ü¹¹
ºËÐŦÄÜ£º
1.´¦Àí socket Á¬½Ó£¬¸ºÔð½«ÍøÂç×Ö½ÚÁ÷Óë Request
ºÍ Response ¶ÔÏóµÄת»¯£»
2.¼ÓÔØºÍ¹ÜÀí Servlet£¬ÒÔ¼°¾ßÌå´¦Àí Request ÇëÇó£»
3.Tomcat Ö§³ÖµÄ io Ä£ÐÍÓÐ NIO¡¢NIO2¡¢APR£¬Tomcat
Ö§³ÖµÄÓ¦ÓòãÐÒéÓÐ http1.1 ajp http2.0¡£
Tomcat ×î¶¥²ãÊÇ server£¬Ò»¸ö server Óжà¸ö service£¬Ò»¸ö service
Óжà¸öÁ¬½ÓÆ÷ºÍÒ»¸öÈÝÆ÷£¬Á¬½ÓÆ÷ºÍÈÝÆ÷Ö®¼äͨ¹ý ServletRequest ºÍ ServletResponse
ͨÐÅ¡£

ͨ¹ý×éºÏģʽ¡¢Ä£°å·½·¨¡¢¹Û²ìÕßģʽºÍ¹Ç¼Ü³éÏóÀ࣬tomcat ¶¨ÒåÁË»ùÀà LifeCycleBean
ʵÏÖ LifeCycle ½Ó¿Ú£¬°Ñ¹«¹²µÄÂß¼£¬ÉúÃüÖÜÆÚ״̬ת±äºÍά»¤¡¢ÉúÃüʼþµÄ´¥·¢ºÍ¼àÌýÆ÷µÄÌí¼Óɾ³ý£¬×ÓÀฺÔðʵÏÖ×Ô¼ºµÄ
init¡¢stop ºÍ start µÈ·½·¨¡£
tomcat ×Ô¶¨ÒåÁ˼àÌýÆ÷£»
@WebListener ×¢½â£¬¶¨Òå×Ô¼ºµÄ¼àÌýÆ÷£»
StandardServer¡¢StandardService µÈÊÇ Server ºÍ Service
×é¼þµÄ¾ßÌåʵÏÖÀ࣬ËüÃǶ¼¼Ì³ÐÁË LifecycleBase¡£
StandardEngine¡¢StandardHost¡¢StandardContext ºÍ StandardWrapper
ÊÇÏàÓ¦ÈÝÆ÷×é¼þµÄ¾ßÌåʵÏÖÀ࣬ÒòΪËüÃǶ¼ÊÇÈÝÆ÷£¬ËùÒԼ̳ÐÁË ContainerBase ³éÏó»ùÀ࣬¶ø
ContainerBase ʵÏÖÁË Container ½Ó¿Ú£¬Ò²¼Ì³ÐÁË LifecycleBase
À࣬ËüÃǵÄÉúÃüÖÜÆÚ¹ÜÀí½Ó¿ÚºÍ¹¦ÄܽӿÚÊÇ·Ö¿ªµÄ¡£
Á¬½ÓÆ÷ Connector
Á¬½ÓÆ÷½øÒ»²½Ï¸»¯£º
¼àÌýÍøÂç¶Ë¿Ú£»
½ÓÊÜÍøÂçÇëÇó£»
¶ÁÈ¡ÍøÂç×Ö½ÚÁ÷£»
¸ù¾ÝÓ¦ÓòãÐÒé½âÎö×Ö½ÚÁ÷£¬Éú³ÉͳһµÄ tomcat request ºÍ tomcat response
¶ÔÏó£»
½« tomcat request ¶ÔÏóת³É servletRequest£»
µ÷Óà servlet ÈÝÆ÷£¬µÃµ½ servletResponse£»
½« servletResponse ת³É tomcat response£»
½« tomcat response ת³ÉÍøÂç×Ö½ÚÁ÷£»
½«ÏìÓ¦×Ö½ÚÁ÷д»Ø¸øä¯ÀÀÆ÷£»
°´ÕÕ¸ßÄھ۵ŦÄÜ»®·Ö£º
ÍøÂçͨÐÅ£»
Ó¦ÓòãÐÒé½âÎö£»
tomcat request/response Óë servlet request/response
µÄת»»£»
×é¼þͨ¹ý½Ó¿Ú½»»¥£¬ºÃ´¦ÊÇ·â×°±ä»¯¡£Endpoint ¸ºÔðÌṩ×Ö½ÚÁ÷¸ø Processor£¬Processor
¸ºÔðÌṩ tomcat request ¶ÔÏó¸ø Adapter£¬Adapter¸ºÔðÌṩ Servlet
Request ¸øÈÝÆ÷¡£
ÆäÖÐ Endpoint ºÍ Processor ³éÏó×é×°ÔÚÒ»ÆðÐγÉÁË ProtocolHandler
×é¼þ¡£

ProtocolHandler
Endpoint
½Ó¿Ú£¬³éÏóʵÏÖÀàÊÇ AbstractEndpoint£¬¾ßÌå×ÓÀàÔÚ NioEndpoint ºÍ Nio2Endpoint£¬ÆäÖÐÁ½¸öÖØÒª×é¼þ£ºAcceptor
ºÍ SocketProcessor¡£
Acceptor ÓÃÓÚ¼àÌý Socket Á¬½ÓÇëÇó£¬SocketProcessor ÓÃÓÚ´¦ÀíÊÕµ½µÄ
Socket ÇëÇó£¬Ìá½»µ½Ïß³Ì³Ø Executor ´¦Àí¡£
Processor
½ÓÊÕ Endpoint µÄ socket£¬¶ÁÈ¡×Ö½ÚÁ÷½âÎö³É tomcat request ºÍ response£¬Í¨¹ý
adapter ½«ÆäÌá½»µ½ÈÝÆ÷´¦Àí¡£Processor µÄ¾ßÌåʵÏÖÀà AjpProcessor¡¢Http11Processor
ʵÏÖÁËÌØ¶¨ÐÒéµÄ½âÎö·½·¨ºÍÇëÇó´¦Àí·½Ê½¡£

Endpoint ½ÓÊÕµ½ socket Á¬½Óºó£¬Éú³ÉÒ»¸ö socketProcessor ½»¸øÏ̳߳ش¦Àí£¬run
·½·¨»áµ÷Óà Processor ½âÎöÓ¦ÓòãÐÒ飬Éú³É tomcat request ºó£¬µ÷Óà adapter
µÄ service ·½·¨¡£
Adapter
ProtocolHandler ½Ó¿Ú¸ºÔð½âÎöÇëÇóÉú³É tomcat requst£¬CoyoteAdapter
µÄ service ·½·¨£¬½« Tomcat Request ¶ÔÏó£¬×ª³É ServletRequest£¬ÔÙµ÷ÓÃ
service ·½·¨¡£
ÈÝÆ÷ Container
ÈÝÆ÷µÄ²ã´Î½á¹¹
¸¸×Ó¹ØÏµµÄ Engine¡¢Host¡¢Context¡¢Wrapper ºÍ Servlet¡£Context
±íʾ web Ó¦ÓóÌÐò¡¢wrapper ±íʾ servlet¡¢context Óжà¸ö wrapper£¬host
Ò²Óжà¸ö context¡£

Host ´ú±íµÄÊÇÒ»¸öÐéÄâÖ÷»ú£¬»òÕß˵һ¸öÕ¾µã£¬¿ÉÒÔ¸ø Tomcat ÅäÖöà¸öÐéÄâÖ÷»úµØÖ·£¬¶øÒ»¸öÐéÄâÖ÷»úÏ¿ÉÒÔ²¿Êð¶à¸ö
Web Ó¦ÓóÌÐò£»Engine ±íʾÒýÇæ£¬ÓÃÀ´¹ÜÀí¶à¸öÐéÄâÕ¾µã£¬Ò»¸ö Service ×î¶àÖ»ÄÜÓÐÒ»¸ö
Engine¡£

ÈÝÆ÷ͨ¹ý Pipeline-Valve ÔðÈÎÁ´£¬¶ÔÇëÇóÒ»´Î´¦Àí£¬invoke ´¦Àí·½·¨£¬Ã¿¸öÈÝÆ÷¶¼ÓÐÒ»¸ö
Pipeline£¬´¥·¢µÚÒ»¸ö Valve£¬Õâ¸öÈÝÆ÷µÄ valve ¶¼»á±»µ÷µ½£¬²»Í¬ÈÝÆ÷Ö®¼äͨ¹ý Pipeline
µÄ getBasic ·½·¨£¬¸ºÔðµ÷ÓÃϲãÈÝÆ÷µÄµÚÒ»¸ö Valve¡£

Õû¸öµ÷ÓÃÁ¬ÓÉÁ¬½ÓÆ÷ÖÐµÄ adapter ´¥·¢£¬µ÷Óà engine ÖеĵÚÒ»¸ö Valve¡£
// Calling the
container
2connector.getService().getContainer(). getPipeline().getFirst().invoke(request,
response); |
wrapper ÈÝÆ÷µÄ×îºóÒ»¸ö valve ´´½¨Ò»¸ö filter Á´£¬²¢µ÷Óà doFilter ·½·¨£¬×îÖÕ»áµ÷Óõ½
servlet µÄ service ·½·¨¡£
final class StandardWrapperValve
extends ValveBase {
@Override
public final void invoke(Request request, Response
response)
throws IOException, ServletException {
// ...
ApplicationFilterChain filterChain =
ApplicationFilterFactory.createFilterChain(request
, wrapper, servlet);
// Call the filter chain for this request
// NOTE: This also calls the servlet's service
() method
Container container = this.container;
try {
if ((servlet != null) && (filterChain
!= null)) {
// Swallow output if needed
if (context.getSwallowOutput()) {
try {
SystemLogHandler.startCapture();
if (request.isAsyncDispatching()) {
request.getAsyncContextInternal().doInternalDispatch
();
} else {
// dofilter
filterChain.doFilter(request.getRequest(),
response.getResponse());
}
} finally {
String log = SystemLogHandler.stopCapture();
if (log != null && log.length() > 0)
{
context.getLogger().info(log);
}
}
} else {
if (request.isAsyncDispatching()) {
request.getAsyncContextInternal().doInternalDispatch();
} else {
// dofilter
filterChain.doFilter
(request.getRequest(), response.getResponse());
}
}
}
} catch() {
// ...
}
}
} |
ServletContext ÊÇ tomcat ÖеÄÒ»¸ö³ÉÔ±±äÁ¿£¬spring ÖÐµÄ ApplicationContext
ÊÇ servlet ¹æ·¶ÖÐµÄ ServletContext ÊôÐÔ¡£ |