[Vert.x] HTTP 서버 만들기

자 이번에는 Vert.x로 아주 간단한 HTTP 서버를 만들어봤습니다. 지금까지는 NetServer를 사용했었는데, 이번에는 HttpServer를 사용합니다.

흠.. vert.x 설명을 보면.. sinatra나 express 스타일의 웹 라우팅을 지원한다고 했는데.. 이건 좀 아닌것 같은 생각이 드네요. 이거 말고 다른 방법이 있는것일지도…

[vert.x] NetServer로 1대다 메시지 전송하기

이전까지 살펴본 Vert.x 예제는 Echo라는 개념으로 메아리처럼 자기가 한 말을 그대로 다시 (자기만) 돌려받는 기능이고, 이번에 살펴볼 예제는 메시지를 하나 받으면 (자신을 포함한) 여러 사용자에게 전달하는 기능입니다. 예제 이름은 영어로는 Fanout이나 One to Many Multiplexing이라고도 하네요.

이 예제에서 가장 중요한 클래스는 SharedData라는 클래스입니다. 이 애플리케이션을 실행하면 코어 갯수만큼 이 애플리케이션의 인스턴스가 기본으로 생기는데, 그 떄 만약 커넥션 정보를 담고 있는 Set이 서로 다르면 원하는대로 동작하지 않기때문에(Echo 처럼 동작하거나, 일부 클라이언트에만 메시지를 전달한다던가 하는 문제가 생기더군요.) Vertx 인스턴스가 공유해서 사용할 Set 객체를 만들어주는 SharedData라는 녀석을 사용해서 공유하는 객체를 만들어야합니다.

아. 그리고 하나 더. Vertx라는 클래스의 static 멤버 변수 instance라는 녀석이 독특합니다. 이 녀석은 아마도 여러 인스턴스 중 하나를 가리키는 녀석이겠죠. 이 객체를 이용해서 메시지를 전송합니다. 전송할 때 누구에게 보내는지 지정할 수 있는 sendToHandler를 사용합니다. 첫번째 매개변수는 socket이 연결될 때 받아둔 socket.writeHandlerID입니다. 두번째 매개변수는 전달할 메시지구요.

나머지 코드는 별게 없으니 패스.

[vert.x] EchoClient 데모

지난번에는 NetServer를 이용해서 EchoServer를 만들고 telnet으로 접속해서 메아리를 확인했었다. 이번에는 NetClient를 이용해서 자바로 EchoClient를 만들었다.

서버 코드도 다시 볼까?

서버를 다시 띄워보자. 서버를 띄우려면 빌드를 하고, target을 classes가 들어있는 빌드 루트 디렉토리라고 가정하고..

target> vertx run -main echo.EchoSever -cp classes

이렇게 실행하면 기본적으로 코어 갯수만큼 인스턴스를 생성해준다. 맥북 에어에서 4개의 인스턴스가 생겼다.

다음은 클라이언트를 실행할 차례다..

target> vertx run -main echo.EchoClient -cp classes -instances 1

이번에는 -instances 옵셥으로 인스턴스를 한개만 띄우도록 설정했다 안그러면 기본으로 클라이언트가 4개 떠버리고… 그랬다가는 아래와 같은 불상사가 발생한다.

물론, 이번에도 telnet으로 접속할 수 있다.

target> telnet localhost 8080

코드는 NetServer와 매우 유사하다.

먼저, NetClient 객체를 만들고 connect() 메서드 호출하면서, handle(NetSocket)만 구현하면 되는 Handler<NetSocket> 객체를 만들어서 넘긴다. 이런 객체를 콜백 객체나 함수 객체라고 불러도 되지 않을까 싶다.

handle() 메서드 안에서 본격적으로 연결된 뒤에 할 일을 하면 되는데, 일단 클라이언트가 서버로부터 메시지를 받았을 때 무슨일을 할지 dataHandler()라는 메서드를 호출하면서, 또 다시 함수 객체로 Handler 객체를 넘긴다.

그담엔 메시지를 하나 보내본다.

끝.

[vert.x] 설치와 실행

https://github.com/purplefox/vert.x/wiki/Installation-and-running

준비물

  • 현재 리눅스와 Mac OSX에서만 동작한다. 윈도 사용자는 버철박스나 VMWare로 리눅스를 깔고 사용할 수 있다.
  • JDK 1.7.0 이상

현재 Java와 Ruby API 지원

https://github.com/purplefox/vert.x/downloads 여기서 내려받고 압축을 푼 다음에 bin 디렉토리를 PATH에 추가하면 설치 끝.

실행

vertx 명령어 사용

고유 vertx 인스턴스에서 싱글 애플리케이션 실행하기

vertx run 사용

옵션

  • 언어 옵션: -java(기본값), -ruby, -groovy, -js
  • (필수 옵셥) 엔트리 포인트: -main 진입점 (자바의 경우 VertxApp 인터페이스 구현체를 설정하고 다른 언어는 진입점에 해당하는 스크립트 이름 설정)
  • (필수 옵션) 클래스패스: -cp 클래스패스 (클래스나 스크립트가 들어있는 곳)
  • 인스턴스 갯수: -instances 인스턴스갯수 (기본값은 코어 갯수)

자바 예제

vertx run -main org.acme.myapp.MyMain -cp myapp/classes

루비 예제

vertx run -ruby -main my_app.rb -cp lib

그루비 예제

서버 모드로 실행하기

멀티 태넌트 컨테이너 형태로 여러 vertx 인스턴스로 여러 애플리케이션을 실행할 수 있다. 각각의 애플리케이션은 별도의 클래스로더를 사용하기 때문에 다른 애플리케이션 인스턴스에 독립적이다.

서버 실행

vertx start

서버 종료

vertx stop

vertx 서버는 기본 포트로 25571을 사용하는데, vertx 서버를 여러개 띄울 때 이 포트를 설정할 수 있다. -port 옵션을 사용하면 된다.

포트 번호 주면서 서버 실행

vertx start -port 1234

특정 포트에 띄운 서버 종료

vertx stop -port 1234

서버에 애플리케이션 배포하기

vertx deploy 사용

옵션

  • vertx run에서 사용하던 옵션 전부 사용 가능
  • -name: 애프리케이션 이름
  • -port: 애플리케이션을 배포할 vertx의 포트

서버에 애플리케이션 내리기

vertx undeploy

클러스터 모드로 실행하기

vertx run이나 vertx start에 -cluster 옵션을 추가한다.

클러스터 모드로 실행하면 vertx가 글로벌 이벤트 버스를 형성한다. 기본으로 클러스터가 된 vertx는 25500 포트를 사용해서 클러스터의 다른 노드와 연결을 맺는다. 한 호스트에 클러스터를 여러개 띄울떄는 cluster-port 옵션을 사용한다.

 

[vert.x] NetServer 예제

Node.js에서 express 쓰는 듯한 기분으로 NetServer라는걸 쓰면 되는데, 2중 익명클래스는 참 난감하긴하다. 코드는 분명히 자바 코드인데, 자바 스크립트 코드처럼 보이네;; 이런 코드 구조가 언어를 막론하고 논블록킹 IO 코딩 스타일이 될지도 모르겠다. 이럴바엔 그냥 그루비로 작성하는게 좋을 것 같다. 자바로는 너무 지져분한듯. 자바 7에서 클로져가 빠진게 정말 아쉽넹;

vert.x가 지금은 아무런 문서가 없는 상태라서 거의 소스 코드만 가지고 분석해야 하는 상태다.

먼저, vert.x 애플리케이션은 VertxApp이라는 인터페이스를 구현해서 만든다. 이 인터페스에는 구현해야 할 메서드가 두개뿐이다. start()와 stop();

start()에서는 NetServer를 생성하고 각종 옵션을 설정하고 이벤트 핸들러를 등록해서 이벤트가 발생했을 때 수행할 작업을 정의한다. 지금은 별다른 옵션은 설정하지 않았다.

NetServer에 설정할 수 있는 옵션은 다음과 같다.

  • setSSL(boolean)
  • setKeyStorePath(String)
  • setKeyStorePassword(String)
  • setSendBuffSize(int)
  • setReceiveBuffSize(int)

NetServer의 클래스 계층 구조는 다음과 같다.

흠냐.. 저렇게 코딩한 코드를 컴파일하고 vertx로 다음과 같이 실행할 수 있다.

vertx run -main 실행할 클래스 -cp 클래스패스

메이븐프로젝트 기준으로, 만약에 echo라는 패키지에 EchoServer라는 클래스를 만들고 빌드하면, target/classes 밑에 echo라는 디렉토리가 생기고 그 안에 EchoServer.class파일이 생긴다.

target 디렉토리로 이동해서 다음과 같이 입력하면된다.

vertx run -main echo.EchoServer -cp classes

vertx를 실행하는 방법이 크게 두가지가 있는데, 그건 나중에 정리하기로하고 지금은 우선 저 방법으로 실행했다.

이제 다른 콘솔창에서 telnet으로 접속하여 Vert.x 서버에 접속해볼 수 있다.

telnet localhost 8080

코딩하는건 매우 쉬워보이는데… 문서가 없다보니 학습하기 어렵고, IDE 지원이 없다보니, 콘솔 작업을 해야되서 좀 불편하다.

알아서 코어 갯수만큼 인스턴스 딱 띄워주고, 컨커런시 모델도 좋긴한데… 기술이 암만 좋아도, 문서와 툴이 없으면 뜨기 어려울텐데.. 과연 뜰 것인가.. 잘 모르겠다. 이상태로는 어디에 써보자고 권하기도 힘든 상황일쎄.. 20, 30페이지짜리 레퍼런스라도 만들어주면 좋겠구만.. 에효..

자자.