제이티의 사용에 대한 상세한 설명

소개: Jetty는 Java로 구현, 오픈, 표준을 바탕으로 하고 풍부한 기능을 가진 Http 서버와 웹 용기로 상업 행위에 무료로 사용할 수 있습니다.Jetty라는 프로젝트는 1995년에 설립되었고 현재 이미 매우 많은 성공 제품이 Jetty를 바탕으로 하고 있다. 예를 들어 Apache Geromino, JBoss, IBM Tivoli, Cisco SESM 등이다.Jetty는 전통적인 웹 서버로 사용할 수도 있고 동적 콘텐츠 서버로 사용할 수도 있으며 Jetty는 Java 응용 프로그램에 쉽게 삽입할 수 있다.
특성 소개
용이성
사용성은 Jetty 디자인의 기본 원칙으로 사용성은 주로 다음과 같은 몇 가지 측면에 나타난다.
1. XML이나 API를 통해 Jetty를 구성한다.2. 기본 설정은 대부분의 수요를 충족시킬 수 있다.3. Jetty를 응용 프로그램에 끼워 넣으려면 아주 적은 코드만 필요합니다.확장성
Ajax의 웹 2.0을 사용하는 응용 프로그램에서는 연결마다 더 긴 시간을 유지해야 하기 때문에 스레드와 메모리 소모량이 급격히 증가할 것이다.이로 인해 우리는 전체 프로그램이 하나의 구성 요소가 병목에 빠져서 전체 프로그램의 성능에 영향을 줄까 봐 걱정한다.그런데 제티가 생겼어요.
1. 대량의 서비스 요청이 있는 경우에도 시스템의 성능은 받아들일 수 있는 상태로 유지된다.2. Continuation 메커니즘을 이용하여 대량의 사용자 요청과 비교적 긴 연결을 처리한다.또한 Jetty는 매우 좋은 인터페이스를 설계했기 때문에 Jetty의 어떤 실현이 사용자의 수요를 만족시키지 못할 때 사용자는 Jetty의 어떤 실현을 편리하게 수정하여 Jetty를 특수한 응용 프로그램의 수요에 적용할 수 있다.
내장성
Jetty 디자인은 처음에 우수한 구성 요소로 디자인되었다. 이것은 Jetty가 응용 프로그램에 쉽게 끼워 넣을 수 있고 프로그램이 Jetty를 사용하기 위해 수정할 필요가 없다는 것을 의미한다.어느 정도는 Jetty를 삽입식 웹 서버로 이해할 수 있다.
--------------------------------------------------------------------------------
애플리케이션 배포
자신의 응용 프로그램을 Jetty 위에 배치하는 것은 매우 간단하다. 우선 개발된 응용 프로그램을 WAR 패키지로 만들어서 Jetty의 Webapps 디렉터리 아래에 놓는다.그리고 다음 명령으로 Jetty 서버를 시작합니다: Java Cjar start.jar, 서버를 시작한 후.우리는 우리의 응용 프로그램에 접근할 수 있습니다. Jetty의 기본 포트는 8080입니다. WAR의 이름은 바로 우리의 응용 프로그램의 Root Context입니다.예를 들어 일반적인 URL은 다음과 같습니다.http://127.0.0.1:8080/sample/index.jsp .
--------------------------------------------------------------------------------
어떻게 Jetty를 프로그램에 삽입합니까
코드 1과 같이 Jetty를 프로그램에 끼워 넣는 것은 매우 간단합니다. 우선 서버 대상을 만들고 포트를 8080으로 설정한 다음에 이 서버 대상에 기본 Handler를 추가합니다.이어서 우리는 프로필jetty를 사용합니다.xml은 이 서버를 설정합니다. 마지막으로 방법 서버를 사용합니다.start() 서버를 시작하면 됩니다.이 코드를 통해 알 수 있듯이 Jetty는 하나의 구성 요소로 우리의 응용 프로그램에 삽입하기에 매우 적합하다. 이것도 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가 어떻게 시작되었는지 분석하겠습니다.먼저 우리는 서버 클래스를 알아차렸다. 이 클래스는 실제로 HttpServer를 계승했다. Jetty 서버를 시작할 때, 즉 Jetty 루트 디렉터리의 명령줄에서 자바-jarstart를 입력하면.jar etc/jetty.xml, 여기 프로필 jetty가 있습니다.xml은 실행 매개 변수로서 이 매개 변수는 다른 프로필일 수도 있고 여러 개의 XML 프로필일 수도 있습니다. 사실 이 프로필은 우리가 Struts를 사용할 때의struts-config와 같습니다.xml 파일은 서버를 실행하는 데 필요한 구성 요소를 기록합니다. 예를 들어 이전 절에서 HttpServer의 설정에 필요한 구성 요소 클래스를 이 구성 파일에 쓸 수 있습니다.상기 방법에 따라 Jetty Server를 시작할 때 서버 클래스 안에 있는main 방법을 호출합니다. 이 입구 방법은 먼저 서버 클래스 실례를 구성합니다. (사실은 HttpServer를 구성합니다.) 실례를 만드는 과정에서 XmlConfiguration 클래스의 대상을 구성하여 매개 변수 프로필을 읽고 이 프로필에서 발생하는 XmlConfiguration 대상으로 이 서버를 설정합니다.설정 과정은 사실 자바의 반사 메커니즘을 활용하여 서버를 호출하는 방법을 사용하고 프로필에 적힌 파라미터를 전송하여 이 서버에 HttpListener, HttpContext, HttpHandler, 그리고 웹 응용 프로그램(우리의 웹 응용 프로그램에 대응)을 추가한다.
--------------------------------------------------------------------------------
Jetty의 Continuation 메커니즘
Jetty의Continuation 메커니즘을 토론하려면 먼저 Ajax 기술을 언급해야 한다. Ajax 기술은 현재 웹 응용을 개발하는 매우 핫한 기술이자 웹 2.0의 중요한 구성 부분이다.Ajax 기술의 핵심 대상은 XMLHttpRequest 대상이다. 이 대상은 비동기 요청을 지원한다. 이른바 비동기 요청이란 클라이언트가 서버에 요청을 보낼 때 클라이언트가 서버의 응답을 기다릴 필요가 없다는 것을 말한다.이렇게 하면 전체 페이지의 리셋을 초래하지 않고 사용자에게 더욱 좋은 체험을 가져다 줄 수 있다.서버 측이 응답하여 되돌아올 때 클라이언트는 자바스크립트 함수를 이용하여 되돌아오는 값을 처리하여 페이지의 일부 요소의 값을 업데이트합니다.그러나 이런 비동기적인 사건은 아주 작은 부분의 상황에서만 발생하는 경우가 많다. 그러면 서버 측이 응답을 한 후에 클라이언트가 바로 알게 될 것을 어떻게 보장할 수 있겠는가. 우리는 이 문제를 해결하는 두 가지 방법이 있다. 하나는 브라우저가 몇 초마다 서비스 기기에 변경을 요청하도록 하는 것이다. 우리는 윤문이라고 부른다.둘째, 서버가 브라우저와 장시간 연결을 유지하여 데이터를 전달하는데 장시간 연결의 기술을 Comet라고 부른다.
윤문 방식의 주요 단점은 대량의 전송 낭비가 발생했다는 것을 쉽게 발견할 수 있다.대부분의 서버에 대한 요청이 무효일 수 있기 때문이다. 즉, 클라이언트가 발생하는 사건을 기다리지 않고 대량의 클라이언트가 있다면 이런 네트워크 전송의 낭비는 매우 심하다.특히 서버 쪽에서 오랫동안 업데이트된 응용 프로그램, 예를 들어 메일 프로그램은 이런 낭비가 더욱 크다.또한 서버 측의 요청 처리 능력도 이에 상응하여 요구를 향상시켰다.만약 오랫동안 서버 측에 요청을 한 번 보냈다면 클라이언트는 제때에 응답할 수 없었을 것이다.
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과 같다.
명세서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 메커니즘이 어떻게 작동하는지 설명합니다.
Jetty는 Continuatins를 사용하려면 SelectChannelConnector를 사용하여 요청을 처리하도록 구성해야 합니다.이connector는java에 구축되어 있습니다.nio API 위에서 모든 연결이 열려 있고 하나의 라인을 소모하지 않아도 됩니다.SelectChannelConnector를 사용하는 경우 ContinuationSupport.getContinuation()은 SelectChannelConnector를 제공합니다.RetryContinuation 인스턴스 (단, Continuation 인터페이스를 프로그래밍해야 합니다.)RetryContinuation에서 suspend () 를 호출할 때, 특수한 실행 시 이상 - RetryRequest를 던집니다. 이 이상은 servlet 밖으로 전파되고 필터 체인으로 거슬러 올라가서 마지막에 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는 매우 편리하게 사용할 수 있는 웹 서버로 매우 작고 우리의 응용 프로그램에 쉽게 끼워 넣을 수 있는 것이 특징이며 웹 2.0의 Ajax 기술에 대해 특별히 최적화를 했기 때문에 우리의 Ajax 응용 프로그램은 더욱 좋은 성능을 가질 수 있다.

좋은 웹페이지 즐겨찾기