13
http://blog.csdn.net/liu251 Jetty ( Jetty ( Jetty ( Jetty ( Version 8) Version 8) Version 8) Version 8) 核心架构解析 核心架构解析 核心架构解析 核心架构解析

Jetty(version 8)核心架构解析

  • Upload
    wavefly

  • View
    1.564

  • Download
    0

Embed Size (px)

DESCRIPTION

The request handling flow of jetty server

Citation preview

http://blog.csdn.net/liu251

Jetty (Jetty (Jetty (Jetty (Version 8)Version 8)Version 8)Version 8)核心架构解析核心架构解析核心架构解析核心架构解析

目录

1111

3333 server启动流程

2222 架构

使用方式

5555 连接建立流程(NIO)

4444 connector启动流程

6666 处理请求流程(Http)

使用方式使用方式使用方式使用方式•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

Q/A