设为首页 收藏本站
云服务器等爆品抢先购,低至4.2元/月
查看: 616|回复: 0

[经验分享] Jetty的架构(翻译)

[复制链接]

尚未签到

发表于 2017-2-26 10:29:51 | 显示全部楼层 |阅读模式
Jetty的架构
DSC0000.png
Connector(连接器)集合负责接收HTTP连接。handler(处理器)集合负责处理连接请求并给予响应。而Jetty Server(服务器)则是前两者的管道连接器。负责创建并初始化connector、handler、ThreadPool组件,然后调用start方法启动他们。ThreadPool(线程池)为他们完成工作提供线程。
Jetty Server演示代码


//1:定义server
Server server = new Server();
//2:把连接器集合放到server里
Connector connector=new SelectChannelConnector();
connector.setPort(8080);
server.setConnectors(new Connector[]{connector});
//3:并把处理器集合放到server里
Handler param=new ParamHandler();
Handler hello=new HelloHandler();
HandlerCollection handlers = new HandlerCollection();
handlers.setHandlers(new Handler[]{param,hello});
server.setHandler(handlers);
//4:启动server
server.start();
server.join();

 



模式
DSC0001.jpg

jetty遵循一些比较规范的模式,最抽象的概念通过接口定义,如连接器,处理器和缓冲区。在抽象类中实现这些接口的通用操作,如AbstractConnector, AbstractHandler and AbstractBuffer。


Connectors
DSC0002.jpg

  连接器表示协议的处理者,负责解析请求并生成响应。不同类型的连接器在其基于的协议下有效,如调度模型和IO API的使用:
  ·SocketConnector - for few busy connections or when NIO is not available.
·BlockingChannelConnector - for few busy connections when NIO is available
·SelectChannelConnector - for many mostly idle connections or asynchronous handling of Ajax requests.
·SslSocketConnector - 没有使用NIO的SSL连接器。
·SslSelectChannelConnector - 使用非阻塞NIO支持的SSL连接器。
·AJPConnector AJP protocol support for connections from apache mod_jk or mod_proxy_ajp
  connectors的使用代码

Connector connector=new SelectChannelConnector();
connector.setPort(8080);




Handlers
DSC0003.jpg

  Handler组件负责处理接收到的请求. handler核心的API是handle方法:

public void handle(String target, HttpServletRequest request, HttpServletResponse response, int dispatch)
throws IOException, ServletException;

 


  这个方法的实现可以处理请求,传递请求到另外一个处理器(或者servlet),或修改并包装请求并传递出去。有三种类型的处理器:


  • Coordinating Handlers - 负责路由请求到其他处理器的处理器(eg HandlerCollection, ContextHandlerCollection)
  • Filtering Handlers - 负责增加请求并传递到其他处理器的处理器(eg. HandlerWrapper, ContextHandler, SessionHandler)
  • Generating Handlers - 负责产生内容的处理器(eg ResourceHandler and ServletHandler)
  Handler代码如下

Handler handler=new HelloHandler();
server.setHandler(handler);
public static class HelloHandler extends AbstractHandler
{
public void handle(String target, HttpServletRequest request, HttpServletResponse response, int dispatch) throws IOException, ServletException
{
Request base_request = (request instanceof Request) ? (Request)request:HttpConnection.getCurrentConnection().getRequest();
base_request.setHandled(true);
response.setContentType("text/html");
response.setStatus(HttpServletResponse.SC_OK);
response.getWriter().println("<h1>Hello OneHandler</h1>");
}
}

 



Servlets

Context
  Contexts是一种处理器,负责组织其他特定URI上下文路径或者一个虚拟机的处理器。通常情况下一个上下文必须有:


  • 一个上下文路径,负责通过上下文定义哪一个请求被处理。 (eg /myapp )
  • 一个基于静态内容的资源(a docroot)
  • 一个类加载器去获得指定上下文中的类(通常在docroot/WEB-INF/classes下)
  • 虚拟机名称
  上下文实现包括:


  •  ContextHandler
  • Servlet Context
  •  a Web Application Context
  Context示意代码:

ContextHandler context = new ContextHandler();
context.setContextPath("/");
context.setResourceBase(".");
context.setClassLoader(Thread.currentThread().getContextClassLoader());
server.setHandler(context);

 



Web Applications
DSC0004.jpg
一个WebAppContext是servlet Context的子类,它提供web应用程序标准的层次结构,以及session, security, listeners, filter, servlets 和JSP的配置。


WebAppContext webapp = new WebAppContext();
webapp.setContextPath("/");
webapp.setWar(jetty_home+"/webapps/test");
webapp.setDefaultsDescriptor(jetty_home+"/etc/webdefault.xml");
server.setHandler(webapp);

 



参考资料


  • 官方网站:http://jetty.codehaus.org/jetty/

  • http://docs.codehaus.org/display/JETTY/Architecture<!-- comments should always display underneath the content. we should have a 'clear:both' here just in case there are floats or aligned images in the content -->

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-347343-1-1.html 上篇帖子: 基于Jetty的可执行war 下篇帖子: jetty一个开源的servlet容器
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表