JBoss EAP 7 의 웹컨테이너인 Undertow

JBoss EAP 7에 새롭게 도입된 undertow는 무엇일까요?

JBoss EAP  7에 새롭게 도입된 undertow는 자바 언어로 작성된 웹서버입니다. 이미 많은 웹서버가 있는데 또 다른 웹서버를 개발하게된 이유는 무엇일까요?
그것은 웹의 발전에 따라 웹서버에 새로운 기능들이 요구되기 때문입니다.
Undertow는 웹서버에 대한 새로운 요구 사항과 유즈케이스들을 수용할 수 있도록 유연하고 효율적으로 설계하였습니다.
Undertow는 가볍기 때문에 임베드 가능하고 웹 애플리케이션 서버에 적합합니다.
뛰어난 성능 뿐만 아니라 다양한 엔터프라이즈 자바 기술들을 제공합니다.
효율적인 반응형 Non-Blocking API 뿐만아니라 친숙한 전통한 Blocking API 를 제공합니다.
혁신적인 새로운 API 뿐만아니라 기존의 표준 API도 함께 제공합니다. 대규모 동적 웹애플리케이션을 실행할 수있고, 또한 기본적인 웹서버를 대체할 수 있을 만큼 가볍습니다.
특히 클라우드와 컨테이너 환경 그리고 마이크로서비스 아키텍처에 필요한 웹서버와 웹 애플리케이션 서버로 활용될수 있도록 개발하였습니다.
Undertow는  Apache License, Version 2.0를 따른 오픈소스 입니다.

Undertow 는 무엇인가요?

JBoss EAP7 또는 Wildfly 에서는 JBoss EAP6 (JBoss AS7) 이전 버전에서 사용하던 tomcat 기반의 JBossWeb 대신
Undertow를 사용합니다. Undertow는 웹서버와 서블릿 컨테이너 기능을 제공합니다.

Java Servlet 3.1 표준과 WebSocket 을 구현하고 Http Upgrade를 지원합니다.

또한 서블릿 배포 환경에서 고성능 Non-Blocking 핸들러를 사용할 수 있습니다.

Undertow vs JBossWEB

Undertow의 I/O 부분은 JBoss 프로젝트 중 하나인 XNIO를 이용하여 처리합니다. 
Undertow는 Java로 작성된 유연하면서 고성능의 웹서버이며 NIO기반의 blogcking / Non-blocking API를 제공합니다.
Undertow는 컴퍼지션 아키텍처를 제공하여 작은 단위의 용도를 갖는 핸들러들를 연결하여 웹서버를 구축 할 수 있다. 
컴포지션 아키텍처는 Full Java EE Servlet 3.1 컨테이너에서 부터 Low Level의 Non-blocking 핸들러 또는 그 중간 수준의 기능을 선택을 할 수 있는 유연성을 제공해 준다.
Undertow는 쉽게 사용할 수 있는 높은 수준의 Builder API를 통해 완전히 임베딩 할 수 있도록 설계되어 있다. Undertow의 라이프 사이클은 임베딩 애플리케이션에서 완벽하게 제어 할 수 있다.

Undertow 특징은 ?

  • Lightweight
    •  Undertow는 Core 라이브러리가 1.3MB 정도로 매우 작으며, 런타임에서 가볍고 동작합니다.
    • 단순한 임베드 웹서버일 경우에는 10MB 이하의 힙 사이즈에서도 동작합니다.
  • Http 업그레이드 지원
    • Undertow를 사용하면 HTTP Upgrade를 사용하여 HTTP상에서 동작하는 다양한 프로토콜을 다중화합니다.
      • EJB와 JMS 등 자체 프로토콜을 사용하는 서비스들을 Http를 통해 연결하여 리슨 포트수를 줄였습니다.
      • 이를 통해 클라우드 환경에서 사용되는 포트의 수를 줄여 동일한 시스템에서 더 많은 서버를 실행할 수 있다.
      • VM 이나 컨테이너 환경에서 네트워크 포트관리가 어려울때 매우 유용합니다.
  • 웹소켓 지원
    • Undertow 는 JSR-356 을 포함한 웹소켓을 완벽하게 지원한다.
  • Servlet 3.1 지원
    • Undertow는 임베드 Servlet 을 포함한 Servlet 3.1 을 지원한다.이것은 servlet 과 native undertow non-blocking  핸들러를 결합하여 배포할 수 있게 한다.
  • 손쉬운 임베딩
    • 작은 코드로도 애플리케이션에서 undertow를 포함시킬 수 있으며, 스탠드얼론으로 실행할 수 있다.
  • 유연성
    • undertow 서버는 핸들러 체인을 통해 설정할 수 있다. 이것은 필요한 기능을 추가하고 제거하는데 있어서 사용하지 않은 것들에 대해서 신경 쓸 필요가 없게 해준다.

Show me the code

이 예제는 Async IO를 사용하는 간단한 Hello World 서버입니다. 예제를 실행하기 위해 필요한 라이브러리는 undertow-core 뿐입니다.

<dependency>
  <groupid> io.undertow < / groupid >
  <artifactid> undertow-core < / artifactid >
  <version> 1.0.0.Beta25 < / version >
< / dependency >

Git 로 부터 Hello Server 다운로드 하기

[admin@t510 gits]$ git clone https://github.com/emag/undertow-practice.git

Git 에서 받은 소스 중 “HelloWorldServer.java” 파일의 내용은 다음과 같다.

public class HelloWorldServer {

    public static void main(final String[] args) {
        Undertow server = Undertow.builder()
                .addHttpListener(8080, "localhost")
                .setHandler(new HttpHandler() {
                    @Override
                    public void handleRequest(final HttpServerExchange exchange) throws Exception {
                        exchange.getResponseHeaders().put(Headers.CONTENT_TYPE, "text/plain");
                        exchange.getResponseSender().send("Hello World");
                    }
                }).build();
        server.start();
    }
}

Hello Server Maven 빌드 하기

$ mvn clean compile exec:java -Dexec.mainClass=org.emamotor.undertow.practice.HelloWorldServer

Red Hat JBoss EAP 소개 페이지로 이동

References & Related Links

거침없이 배우는 JBoss10점
전준식 엮음/지&선(지앤선)