谈谈jetty response模型
1)jetty 响应的概念模型SelectChannelEndPoint: 底层的socket的封装,代表每次请求对应的网络连接(偏网路底层)AsyncHttpConnection:代表每次连接(偏上层一点),管理相关的request,response,HttpParser,HttpGenerator实例HttpParser:请求解析HttpGenerator:负责最终的response生成Re
·
1)jetty 响应的概念模型
- SelectChannelEndPoint: 底层的socket的封装,代表每次请求对应的网络连接(偏网路底层)
- AsyncHttpConnection:代表每次连接(偏上层一点),管理相关的request,response,HttpParser,HttpGenerator实例
- HttpParser:请求解析
- HttpGenerator:负责最终的response生成
- Response:不解释
- Request:不解释
- JettyServer: servlet容器,负责处理servlet相关逻辑
2)请求的实例化
- select线程感知到网络请求于是开始初始化途中的各个相关类的实例
- 最后将请求封装成一个endpoint实例丢入worker线程的队列中的等待处理
3)jetty 整体的响应流程
- worker线程从请求队列获取请求
- 请求(底层是个SelectChannelEndPoint)开始处理
- SelectChannelEndPoint调用相关的AsyncHttpConnection进行处理
- AsyncHttpConnection调用HttpParser解析请求
- AsyncHttpConnection调用servlet容器处理请求(真正的业务处理)
- servlet处理完毕处理,AsyncHttpConnection开始调用Response处理响应
4)在servlet中调用write/flush的底层实现
样例代码:
PrintWriter out = response.getWriter();
out.write(request.getParameter("id"));
out.flush();

- servlet中调用write底层会调用HttpGenerator的addContent方法
- addContent会将内容填充到HttpGenerator的_content,_content内容会被拷贝到内部buffer,如果超过内部buffer的长度就会自动flush
- servlet中调用write底层会调用HttpGenerator的flushBuffer,此操作会触发真正的网络流,下一节会具体谈
5)Response.complete到底干了什么
- 调用AsyncHttpConnection的completeResponse
-
- 调用HttpGenerator生成header内容
- 调用HttpGenerator生成content内容
- 一旦reponse header和response content完成,开始flush
- 会将header buffer和content buffer传入SelectChannelEndPoint的gatheringFlush做矢量IO
- 最终还是调用底层socket完成网络响应
更多推荐
所有评论(0)