소개: Jetty는 오픈 소스, 표준 기반, 기능이 풍부한 HTTP 서버이자 Java로 구현된 웹 구현입니다. 컨테이너는 상업적 용도로 무료로 사용할 수 있습니다. Jetty 프로젝트는 1995년에 설립되었습니다. Apache Geromino, JBoss, IBM Tivoli, Cisco SESM 등 Jetty는 전통적인 웹 서버나 동적 콘텐츠 서버로 사용될 수 있습니다. Jetty는 Java 애플리케이션에 쉽게 내장될 수 있습니다.
기능 소개
사용 용이성
Jetty 디자인의 기본 원칙은 사용 용이성이 주로 다음과 같은 측면에서 반영됩니다.
1. XML 또는 API를 통해 Jetty를 구성합니다.
2. 기본 구성은 대부분의 요구 사항을 충족할 수 있습니다.
3.
애플리케이션에 포함하려면
확장성
Ajax를 사용하는 Web 2.0이 거의 필요하지 않습니다. 각 연결을 장기간 유지해야 하는 애플리케이션에서는 스레드 및 메모리 소비가 크게 증가합니다. 이로 인해 단일 구성 요소로 인해 전체 프로그램이 병목 현상에 빠지고 전체 프로그램의 성능에 영향을 미칠까 걱정됩니다. 하지만 있습니다 부두:
1. 서비스 요청이 많은 경우에도 시스템의 성능은 수용 가능한 상태로 유지될 수 있습니다.
2.계속 사용
다수의 사용자 요청과 긴 연결을 처리하는 메커니즘입니다.
게다가 Jetty는 매우 좋은 인터페이스를 디자인했기 때문에 Jetty에서는
Jetty의 특정 구현이 사용자의 요구를 충족할 수 없는 경우 사용자는 Jetty의 일부 구현을 쉽게 수정하여 Jetty를 특수 애플리케이션의 요구에 적합하게 만들 수 있습니다.
삽입 용이성
Jetty는 처음부터 뛰어난 구성 요소로 설계되었습니다. 즉, Jetty를 사용하는 프로그램 없이도 Jetty를 애플리케이션에 쉽게 삽입할 수 있습니다. 변경하십시오. 어느 정도는 Jetty를 내장형 웹 서버로 생각할 수도 있습니다.
------------------------------- ------ ----------
애플리케이션 배포
Jetty에 자신의 애플리케이션을 배포하는 것은 매우 간단합니다. 먼저 개발된 애플리케이션을 WAR 패키지로 패키징하고 Jetty의 Webapps에 넣습니다. 디렉토리 아래. 그런 다음 서버를 시작한 후 Java –jar start.jar 명령을 사용하여 Jetty 서버를 시작합니다. 이제 애플리케이션인 Jetty에 액세스할 수 있습니다. 기본 포트는 8080이고 WAR의 이름은 애플리케이션의 루트 컨텍스트입니다. 예를 들어 일반적인 URL은 즉, http://127.0.0.1:8080/sample/index.jsp입니다.
------------------------------- ------ ----------
방법 프로그램에 Jetty 삽입
코드 1에 표시된 것처럼 Jetty를 프로그램에 삽입하는 것은 매우 간단합니다. 먼저 서버 객체를 생성하고 포트를 8080으로 설정한 다음 이 서버에 대한 포트를 설정합니다. 개체는 기본 처리기를 추가합니다. 그런 다음 구성 파일 jetty.xml을 사용하여 이 서버를 설정하고 마지막으로 server.start() 메서드를 사용하여 서버를 시작하면 됩니다. 이 코드에서 볼 수 있듯이 Jetty는 애플리케이션에 구성 요소로 포함되기에 매우 적합합니다. 매우 중요한 기능입니다.
목록 1. 코드 조각
public class JettyServer { public static void main(String[] args) { Server server = new Server(8080); server.setHandler(new DefaultHandler()); XmlConfiguration configuration = null; try { configuration = new XmlConfiguration( new FileInputStream("C:/development/Jetty/jetty-6.1.6rc0/etc/jetty.xml")); } catch (FileNotFoundException e1) { e1.printStackTrace(); } catch (SAXException e1) { e1.printStackTrace(); } catch (IOException e1) { e1.printStackTrace(); } try { configuration.configure(server); server.start(); } catch (Exception e) { e.printStackTrace(); } } }
다음으로 Jetty Server가 어떻게 시작되는지 분석합니다. 먼저 우리는 Server 클래스를 주목합니다. 이 클래스는 Jetty를 시작할 때 실제로 상속됩니다. 서버를 사용할 때 즉, Jetty 루트 디렉터리의 명령줄에서 java -jar start.jar etc/jetty.xml을 입력하면 여기에 구성 파일이 있다는 점을 참고하세요. jetty.xml은 실행 매개변수로 사용됩니다. 이 매개변수는 다른 구성 파일일 수도 있으며, 실제로 이 구성 파일은 Struts를 사용할 때와 같습니다. struts-config.xml 파일에 이전 섹션의 HttpServer와 같은 Server를 실행하는 데 필요한 구성 요소를 작성합니다. 구성에 필요한 구성 요소 클래스를 이 구성 파일에 작성할 수 있습니다. 위의 방법으로 Jetty Server가 시작되면 Server 클래스의 main이 호출됩니다. 메서드에서 이 입력 메서드는 먼저 Server 클래스 인스턴스를 구성하고(실제로 HttpServer도 구성함) 인스턴스를 생성하는 과정에서 XmlConfiguration을 구성합니다. 클래스 개체를 사용하여 매개변수 구성 파일을 읽은 다음 이 구성 파일에서 생성된 XmlConfiguration 개체를 사용하여 서버를 구성합니다. 구성 프로세스는 실제로 Java를 사용합니다. 리플렉션 메커니즘, Server 메서드를 호출하고 구성 파일에 작성된 매개변수를 전달하여 이 서버에 추가합니다. HttpListener, HttpContext, HttpHandler 및 웹 애플리케이션(웹 애플리케이션에 해당).
---------- ---------------------
Jetty의 지속 메커니즘
讨论 Jetty 的 Continuation 机制,首先需要提到 Ajax 技术,Ajax 技术是当前开发 Web 应用的非常热门的技术,也是 Web 2.0 的一个重要的组成部分。Ajax 技术中的一个核心对象是 XMLHttpRequest 对象,这个对象支持异步请求,所谓异步请求即是指当客户端发送一个请求到服务器的时候,客户端不必一直等待服务器的响应。这样就不会造成整个页面的刷新,给用户带来更好的体验。而当服务器端响应返回时,客户端利用一个 Javascript 函数对返回值进行处理,以更新页面上的部分元素的值。但很多时候这种异步事件只是在很小一部分的情况下才会发生,那么怎么保证一旦服务器端有了响应之后客户端马上就知道呢,我们有两种方法来解决这个问题,一是让浏览器每隔几秒请求服务器来获得更改,我们称之为轮询。二是服务器维持与浏览器的长时间的连接来传递数据,长连接的技术称之为 Comet。
大家很容易就能发现轮询方式的主要缺点是产生了大量的传输浪费。因为可能大部分向服务器的请求是无效的,也就是说客户端等待发生的事件没有发生,如果有大量的客户端的话,那么这种网络传输的浪费是非常厉害的。特别是对于服务器端很久才更新的应用程序来讲,比如邮件程序,这种浪费就更是巨大了。并且对 Server 端处理请求的能力也相应提高了要求。如果很长时间才向 Server 端发送一次请求的话,那么客户端就不能的得到及时的响应。
如果使用 Comet 技术的话,客户端和服务器端必须保持一个长连接,一般情况下,服务器端每一个 Servlet 都会独占一个线程,这样就会使得服务器端有很多线程同时存在,这在客户端非常多的情况下也会对服务器端的处理能力带来很大的挑战。
Jetty 利用 Java 语言的非堵塞 I/O 技术来处理并发的大量连接。 Jetty 有一个处理长连接的机制:一个被称为 Continuations 的特性。利用 Continuation 机制,Jetty 可以使得一个线程能够用来同时处理多个从客户端发送过来的异步请求,下面我们通过一个简化的聊天程序的服务器端的代码来演示不使用 Continuation 机制和使用 Continuation 的差别。
清单 2. Continuation 机制
public class ChatContinuation extends HttpServlet{ public void doPost(HttpServletRequest request, HttpServletResponse response){ postMessage(request, response); } private void postMessage(HttpServletRequest request, HttpServletResponse response) { HttpSession session = request.getSession(true); People people = (People)session.getAttribute(session.getId()); if (!people.hasEvent()) { Continuation continuation = ContinuationSupport.getContinuation(request, this); people.setContinuation(continuation); continuation.suspend(1000); } people.setContinuation(null); people.sendEvent(response); } }
大家注意到,首先获取一个 Continuation 对象,然后把它挂起 1 秒钟,直到超时或者中间被 resume 函数唤醒位置,这里需要解释的是,在调用完 suspend 函数之后,这个线程就可处理其他的请求了,这也就大大提高了程序的并发性,使得长连接能够获得非常好的扩展性。
如果我们不使用 Continuation 机制,那么程序就如 清单 3 所示:
清单 3. 不使用 Continuation 机制
public class Chat extends HttpServlet{ public void doPost(HttpServletRequest request, HttpServletResponse response){ postMessage(request, response); } private void postMessage(HttpServletRequest request, HttpServletResponse response) { HttpSession session = request.getSession(true); People people = (People)session.getAttribute(session.getId()); while (!people.hasEvent()) { try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } people.setContinuation(null); people.sendEvent(response); } }
大家注意到在等待事件发生的时间里,线程被挂起,直到所等待的事件发生为止,但在等待过程中,这个线程不能处理其他请求,这也就造成了在客户端非常多的情况下服务器的处理能力跟不上的情况。下面我们解释一下 Jetty 的 Continuation 的机制是如何工作的。
为了使用 Continuatins,Jetty 必须配置为使用它的 SelectChannelConnector 处理请求。这个 connector 构建在 java.nio API 之上,允许它维持每个连接开放而不用消耗一个线程。当使用 SelectChannelConnector 时,ContinuationSupport.getContinuation() 提供一个 SelectChannelConnector.RetryContinuation 实例(但是,您必须针对 Continuation 接口编程)。当在 RetryContinuation 上调用 suspend() 时,它抛出一个特殊的运行时异常 -- RetryRequest,该异常传播到 servlet 外并且回溯到 filter 链,最后被 SelectChannelConnector 捕获。但是不会发送一个异常响应给客户端,而是将请求维持在未决 Continuations 队列里,则 HTTP 连接保持开放。这样,用来服务请求的线程返回给 ThreadPool,然后又可以用来服务其他请求。暂停的请求停留在未决 Continuations 队列里直到指定的过期时间,或者在它的 Continuation 上调用 resume() 方法。当任何一个条件触发时,请求会重新提交给 servlet(通过 filter 链)。这样,整个请求被"重播"直到 RetryRequest 异常不再抛出,然后继续按正常情况执行。
--------------------------------------------------------------------------------
Jetty 的安全性
为了防止任何人都有权限去关闭一个已经开启的 Jetty 服务器, 我们可以通过在启动 Jetty
服务器的时候指定参数来进行控制,使得用户必须提供密码才能关闭 Jetty 服务器,启动 Jetty 服务器的命令如下所示:
java -DSTOP.PORT=8079 -DSTOP.KEY=mypassword -jar start.jar
这样,用户在停止 Jetty
服务器的时候,就必须提供密码“mypassword”。
--------------------------------------------------------------------------------
总结
Jetty 是一个非常方便使用的 Web 服务器,它的特点在于非常小,很容易嵌入到我们的应用程序当中,而且针对 Web 2.0 的 Ajax
技术进行了特别的优化,这也使得我们的使用 Ajax 的应用程序可以拥有更好的性能。
以上就是jetty的使用详解,更多相关文章请关注PHP中文网(www.php.cn)!