Vert.x 소개

1. 개요

이 기사에서는 Vert.x에 대해 논의하고 핵심 개념을 다루며 간단한 RESTfull 웹 서비스를 만들 것입니다.

툴킷에 대한 기본 개념을 다루는 것으로 시작하여 천천히 HTTP 서버로 이동 한 다음 RESTfull 서비스를 빌드합니다.

2. Vert.x 정보

Vert.x는 Eclipse 개발자의 오픈 소스, 반응 형 및 다중 언어 소프트웨어 개발 툴킷 입니다.

반응 형 프로그래밍은 변경이나 이벤트에 응답하는 비동기 스트림과 관련된 프로그래밍 패러다임입니다.

마찬가지로 Vert.x는 이벤트 버스를 사용하여 애플리케이션의 다른 부분과 통신하고 이벤트를 사용할 수있을 때 처리기에 비동기 적으로 전달합니다.

Java, Groovy, Ruby, Python 및 JavaScript와 같은 여러 JVM 및 비 JVM 언어를 지원하기 때문에 다중 언어라고 부릅니다.

3. 설정

Vert.x를 사용하려면 Maven 종속성을 추가해야합니다.

 io.vertx vertx-core 3.4.1 

최신 버전의 종속성은 여기에서 찾을 수 있습니다.

3. 정점

Verticles는 Vert.x 엔진이 실행하는 코드 조각입니다. 툴킷은 우리가 원하는대로 확장하고 구현할 수있는 많은 추상 버티 클 클래스를 제공합니다.

다국어이므로 지원되는 언어로 버티 클을 작성할 수 있습니다. 애플리케이션은 일반적으로 동일한 Vert.x 인스턴스에서 실행되는 여러 버티 클으로 구성되며 이벤트 버스를 통해 이벤트를 사용하여 서로 통신합니다.

JAVA에서 버티 클을 생성하려면 클래스가 io.vertx.core.Verticle 인터페이스 또는 하위 클래스 중 하나를 구현해야합니다 .

4. 이벤트 버스

Vert.x 애플리케이션의 신경계입니다.

반응하는 버티 클은 메시지 나 이벤트를받을 때까지 휴면 상태로 유지됩니다. 정점은 이벤트 버스를 통해 서로 통신합니다. 메시지는 문자열에서 복잡한 객체에 이르기까지 무엇이든 될 수 있습니다.

메시지 처리는 이상적으로는 비동기 적이며 메시지는 이벤트 버스에 대기하고 제어는 보낸 사람에게 반환됩니다. 나중에 듣는 버티 클에서 대기열에서 제외됩니다. 응답은 Future콜백 메서드를 사용하여 전송됩니다 .

5. 간단한 Vert.x 애플리케이션

버티 클이 있는 간단한 애플리케이션을 만들고 vertx 인스턴스를 사용하여 배포 해 보겠습니다 . 버티 클을 만들기 위해

버티 클 을 만들기 위해 io.vertx.core.AbstractVerticle 클래스를 확장 하고 start () 메서드를 재정의합니다 .

public class HelloVerticle extends AbstractVerticle { @Override public void start(Future future) { LOGGER.info("Welcome to Vertx"); } }

시작 () 메소드가 호출 될 것이다 vertx의 verticle 배포 할 때 인스턴스입니다. 이 메서드는 io.vertx.core.Future 를 매개 변수로 사용하며, 이는 버티 클 의 비동기 배치 상태를 발견하는 데 사용할 수 있습니다.

이제 버티 클을 배포하겠습니다.

public static void main(String[] args) { Vertx vertx = Vertx.vertx(); vertx.deployVerticle(new HelloVerticle()); }

마찬가지로, AbstractVerticle 클래스 에서 stop () 메서드를 재정의 할 수 있습니다.이 메서드 는 버티 클을 종료하는 동안 호출됩니다.

@Override public void stop() { LOGGER.info("Shutting down application"); }

6. HTTP 서버

이제 버티 클을 사용하여 HTTP 서버를 가동 해 보겠습니다.

@Override public void start(Future future) { vertx.createHttpServer() .requestHandler(r -> r.response().end("Welcome to Vert.x Intro"); }) .listen(config().getInteger("http.port", 9090), result -> { if (result.succeeded()) { future.complete(); } else { future.fail(result.cause()); } }); }

HTTP 서버를 생성하기 위해 start () 메서드를 재정의하고 여기 에 요청 핸들러를 첨부했습니다. RequestHandler를 () 메소드는 서버 요청을 수신 할 때마다 호출된다.

마지막으로 서버는 포트에 바인딩되고 AsyncResult 핸들러는 연결 또는 서버 시작 성공 여부에 관계없이 future.complete () 또는 future.fail () 을 사용하여 listen () 메서드에 전달됩니다. 오류.

참고 : config.getInteger () 메서드는 외부 conf.json 파일 에서로드되는 HTTP 포트 구성 값을 읽습니다 .

서버를 테스트 해 보겠습니다.

@Test public void whenReceivedResponse_thenSuccess(TestContext testContext) { Async async = testContext.async(); vertx.createHttpClient() .getNow(port, "localhost", "/", response -> { response.handler(responseBody -> { testContext.assertTrue(responseBody.toString().contains("Hello")); async.complete(); }); }); }

테스트를 위해 JUnit과 함께 vertx-unit을 사용합시다. :

 io.vertx vertx-unit 3.4.1 test 

여기에서 최신 버전을 얻을 수 있습니다.

버티 클 이 배포되고 단위 테스트 의 setup () 메서드 에서 버텍스 인스턴스에 있습니다 .

@Before public void setup(TestContext testContext) { vertx = Vertx.vertx(); vertx.deployVerticle(SimpleServerVerticle.class.getName(), testContext.asyncAssertSuccess()); }

마찬가지로 vertx 인스턴스는 @AfterClass tearDown () 메서드 에서 닫힙니다 .

@After public void tearDown(TestContext testContext) { vertx.close(testContext.asyncAssertSuccess()); }

것을 알 수 @BeforeClass 설정 () 메소드가 소요 TestContext의 인수를. 이는 테스트의 비동기 동작을 제어하고 테스트하는 데 도움이됩니다. 예를 들어 버티 클 배치는 비동기식이므로 기본적으로 올바르게 배치되지 않으면 아무것도 테스트 할 수 없습니다.

We have a second parameter to the deployVerticle() method, testContext.asyncAssertSuccess(). This is used to know if the server is deployed correctly or any failures occurred. It waits for the future.complete() or future.fail() in the server verticle to be called. In the case of a failure, it fails the test.

7. RESTful WebService

We have created an HTTP server, lets now use that to host an RESTfull WebService. In order do so we will need another Vert.x module called vertx-web. This gives a lot of additional features for web development on top of vertx-core.

Let's add the dependency to our pom.xml:

 io.vertx vertx-web 3.4.1 

We can find the latest version here.

7.1. Router and Routes

Let's create a router for our WebService. This router will take a simple route of GET method, and handler method getArtilces():

Router router = Router.router(vertx); router.get("/api/baeldung/articles/article/:id") .handler(this::getArticles);

The getArticle() method is a simple method that returns new Article object:

private void getArticles(RoutingContext routingContext) { String articleId = routingContext.request() .getParam("id"); Article article = new Article(articleId, "This is an intro to vertx", "baeldung", "01-02-2017", 1578); routingContext.response() .putHeader("content-type", "application/json") .setStatusCode(200) .end(Json.encodePrettily(article)); }

A Router, when receives a request, looks for the matching route, and passes the request further. The routes having a handler method associated with it to do sumthing with the request.

In our case, the handler invokes the getArticle() method. It receives the routingContext object as an argument. Derives the path parameter id, and creates an Article object with it.

In the last part of the method, let's invoke the response() method on the routingContext object and put the headers, set the HTTP response code, and end the response using the JSON encoded article object.

7.2. Adding Router to Server

Now let's add the router, created in the previous section to the HTTP server:

vertx.createHttpServer() .requestHandler(router::accept) .listen(config().getInteger("http.port", 8080), result -> { if (result.succeeded()) { future.complete(); } else { future.fail(result.cause()); } });

Notice that we have added requestHandler(router::accept) to the server. This instructs the server, to invoke the accept() of the router object when any request is received.

Now let's test our WebService:

@Test public void givenId_whenReceivedArticle_thenSuccess(TestContext testContext) { Async async = testContext.async(); vertx.createHttpClient() .getNow(8080, "localhost", "/api/baeldung/articles/article/12345", response -> { response.handler(responseBody -> { testContext.assertTrue( responseBody.toString().contains("\"id\" : \"12345\"")); async.complete(); }); }); }

8. Packaging Vert.x Application

To package the application as a deployable Java Archive (.jar) let's use Maven Shade plugin and the configurations in the execution tag:

    io.vertx.core.Starter com.baeldung.SimpleServerVerticle      ${project.build.directory}/${project.artifactId}-${project.version}-app.jar  

In the manifestEntries, Main-Verticle indicates the starting point of the application and the Main-Class is a Vert.x class which, creates the vertx instance and deploys the Main-Verticle.

9. Conclusion

이 소개 기사에서는 Vert.x 툴킷과 기본 개념에 대해 논의했습니다. Vert.x 및 RESTFull WebService를 사용하여 HTTP 서버를 생성하는 방법을보고 vertx-unit을 사용하여 테스트하는 방법을 보여주었습니다 .

마지막으로 응용 프로그램을 실행 가능한 jar로 패키지했습니다.

코드 조각의 전체 구현은 GitHub에서 사용할 수 있습니다.