Download - Jetty(version 8)核心架构解析
http://blog.csdn.net/liu251
Jetty (Jetty (Jetty (Jetty (Version 8)Version 8)Version 8)Version 8)核心架构解析核心架构解析核心架构解析核心架构解析
使用方式使用方式使用方式使用方式•Jetty 2种编码方式
–embedded– https://svn.ws.netease.com/microblog/products/butter-microblog/branches/websocket-comet
–Standalone• jetty解析jetty-xx.xml来拼装组件
– java -jar $JETTY_HOME/start.jar– $JETTY_HOME/bin/jetty.sh start– org.eclipse.jetty.start.Main.main()
使用方式使用方式使用方式使用方式•Jetty 2种编码方式
–Standalone• http://dist.codehaus.org/jetty/jetty-hightide-8.1.4/jetty-hightide-8.1.4.v20120524.zip
• http://wiki.eclipse.org/Jetty/Howto/Configure_Jetty
使用方式使用方式使用方式使用方式•Jetty 2种编码方式
– embedded public static void main(String[] args) throws Exception { Server server = new Server(); SelectChannelConnector connector0 = new
SelectChannelConnector(); connector0.setPort(8080); connector0.setMaxIdleTime(30000); connector0.setRequestHeaderSize(8192); connector0.setThreadPool(new QueuedThreadPool(20));
serverserverserverserver....setConnectorssetConnectorssetConnectorssetConnectors((((newnewnewnew ConnectorConnectorConnectorConnector[]{ []{ []{ []{ connectorconnectorconnectorconnector0 }); 0 }); 0 }); 0 }); serverserverserverserver....setHandlersetHandlersetHandlersetHandler((((newnewnewnew HelloHandlerHelloHandlerHelloHandlerHelloHandler());());());()); server.start(); server.join(); }
架构架构架构架构
• 资源浪费资源浪费资源浪费资源浪费– 日访问量已经近3亿,日发帖量近200万,这也使得各系统的负载
能力急剧上升,如用户系统负载已达到5000QPS,信息系统更是达到了20000QPS,按照峰值标准部署服务来保证系统的高可用性,导致低访问量时软硬件资源的无形浪费。
• 资源管理资源管理资源管理资源管理– 每个系统都有一个集群,系统资源部署量大且不透明,给调用、监控和
维护都带来不便,管理成本持续增加,硬件成本持续增加。
LifeCy cle
Handler
Connector
N I O
B I O
Serv er
HandlerList
ServletContextHandler
SessionHandler
ServletHandler
FilterHoder ServletHoder
EndPoint
QueuedThreadPool
架构-server启动流程
Server
doStart ( )
HandlerWrapper
super .doStart ( )
Handler (Container )
handler .start ( )
init handlers
Connector
connectors [i] . start ( )
架构-connector启动流程SelectChannelConnector AggregateLifeCycle SelectSet [ ]QueuedThreadPool
doStart ( )
SelectManager
super .doStart ( )start ( )
dispatch (runnable )
r u n .doSelect ( )1.检 查 、处理各种事件2.根 据 Selector 事 件 生成 新 的 事 件
dispatch (Acceptor )
Acceptor
r u n .accept ( )
ServerSocketChannel .accept ( )阻 塞 监 听 新 socket连 接
o p e n ( )创 建 阻 塞ServerSocketChannel
架构-连接建立流程(NIO)Client Acceptor (Thread ) SelectSet (Thread ) SelectManager
connect
ServerSocketChannel.accept ( )
register(SocketChannel)
SelectSet[i] . addChan g e (SocketChannel)
SelectSet[i] .wakeup( )
wakeup/timeout
doSelect( )
判断是否有新事件,如 果 是 新 的SocketChannel
SocketChannel
channel.register(selector,SelectionKey.O P _R E A D,n u l ln u l ln u l ln u l l)
createEndPoint( )SelectChannelEndPoint来 管 理 SocketChannel
架构-处理请求流程SelectSet (Thread ) QueuedThreadPool
doSelect ( )Selector Read 事 件
SelectChannelEndPoint
schedule( )
AsyncHttpConnection
dispatch( )线 程 处 理 Re a d 事 件
HttpParser Server ServletContextHandler
handle ( )
parseAvailable( )
parseNext( )
headerComplete( )
handleRequest ( )
handle ( ) handle(String, Request , HttpServletRequest , HttpServletResponse )
H t t p 协议解析完毕
开 始 Filter ,Serverlt
架构-处理请求流程Thread [qtp5156931-18] (Suspended (breakpoint at line 36 in HttpDateServlet))
HttpDateServlet.doPost(HttpServletRequest, HttpServletResponse) line: 36HttpDateServlet.doGet(HttpServletRequest, HttpServletResponse) line: 32HttpDateServlet(HttpServlet).service(HttpServletRequest, HttpServletResponse) line: 735HttpDateServlet(HttpServlet).service(ServletRequest, ServletResponse) line: 848ServletHolder.handle(Request, ServletRequest, ServletResponse) line: 594ServletHandler$CachedChain.doFilter(ServletRequest, ServletResponse) line: 1366HttpWelcomeFilter.doFilter(ServletRequest, ServletResponse, FilterChain) line: 34ServletHandler$CachedChain.doFilter(ServletRequest, ServletResponse) line: 1337ServletHandler.doHandle(String, Request, HttpServletRequest, HttpServletResponse) line: 484SessionHandler.doHandle(String, Request, HttpServletRequest, HttpServletResponse) line: 231
ServletContextHandler(ContextHandler).doHandle(String, Request, HttpServletRequest, HttpServletResponse) line: 1065ServletHandler.doScope(String, Request, HttpServletRequest, HttpServletResponse) line: 413SessionHandler.doScope(String, Request, HttpServletRequest, HttpServletResponse) line: 192ServletContextHandler(ContextHandler).doScope(String, Request, HttpServletRequest, HttpServletResponse) line: 999ServletContextHandler(ScopedHandler).handle(String, Request, HttpServletRequest, HttpServletResponse) line: 117HandlerList.handle(String, Request, HttpServletRequest, HttpServletResponse) line: 47Server(HandlerWrapper).handle(String, Request, HttpServletRequest, HttpServletResponse) line: 111Server.handle(AbstractHttpConnection) line: 351AsyncHttpConnection(AbstractHttpConnection).handleRequest() line: 454AsyncHttpConnection(AbstractHttpConnection).headerComplete() line: 890AbstractHttpConnection$RequestHandler.headerComplete() line: 944HttpParser.parseNext() line: 634HttpParser.parseAvailable() line: 230AsyncHttpConnection.handle() line: 77SelectChannelEndPoint.handle() line: 609SelectChannelEndPoint$1.run() line: 45QueuedThreadPool.runJob(Runnable) line: 599QueuedThreadPool$3.run() line: 534Thread.run() line: 662