Vert.x — это основанная на событиях среда приложения, основанная на событиях полиглота, которая работает на виртуальной машине Java (минимальная поддерживаемая версия JAVA 7). Как и Node.js, Vert.x является асинхронным и масштабируемым и позволяет разработчикам создавать современные и эффективные веб-приложения.
Будучи полиглотом, Vert.x может использоваться во многих вариантах, среди которых: JavaScript, CoffeeScript, Ruby, Python, Groovy и Java. Чтобы обеспечить асинхронность и масштабируемость, Vert.x построен на Netty, используя схему реактора, используя пугающее количество обработчиков.
Целью данной статьи является демонстрация мощного сочетания Scala и Vert.x — аналога Java, предоставляемого для сравнения.
Примечание: исходный код размещается на GitHub как часть lang-scala https://github.com/ouertani/vert.x/tree/master/vertx-lang/vertx-lang-scala
Vert.x поддерживает множество компонентов:
WebSocket
HttpServer
Распределенная шина событий
TCP-сервер, SockJS, … здесь не представлен.
I — WebSocket
Web Socket — это функция HTML 5, обеспечивающая полнодуплексную связь. Для старых браузеров, которые не поддерживают WebSocket, Vert.x предоставляет SockJS как готовый компонент.
Для запуска следующего примера проверьте: https://github.com/ouertani/vert.x/blob/master/vertx-examples/src/main/javascript/websockets/ws.html и сохраните его в скомпилированном lib
версия каталога Java
import org.vertx.java.core.Handler;
import org.vertx.java.core.buffer.Buffer;
import org.vertx.java.core.http.HttpServerRequest;
import org.vertx.java.core.http.ServerWebSocket;
import org.vertx.java.deploy.Verticle;
public class SampleWebSocket extends Verticle {
public void start() {
vertx.createHttpServer().websocketHandler(new Handler<ServerWebSocket>() {
public void handle(final ServerWebSocket ws) {
if (ws.path.equals("/myapp")) {
ws.dataHandler(new Handler<Buffer>() {
public void handle(Buffer data) {
ws.writeTextFrame(data.toString()); // Echo it back
}
});
} else {
ws.reject();
}
}
}).requestHandler(new Handler<HttpServerRequest>() {
public void handle(HttpServerRequest req) {
if (req.path.equals("/")) req.response.sendFile("ws.html"); // Serve the html
}
}).listen(8080);
}
}
scala version
import org.vertx.java.core.buffer.Buffer;
import org.vertx.java.core.http.HttpServerRequest;
import org.vertx.java.core.http.ServerWebSocket;
import org.vertx.scala.deploy.Verticle
import org.vertx.scala.core._
class SampleWebSocket extends Verticle (
_.getVertx().createHttpServer().websocketHandler{
ws:ServerWebSocket => ws.path match {
case "/myapp" => ws.dataHandler{data : Buffer => ws.writeTextFrame(data.toString())}
case _ => ws.reject();
}}
.requestHandler{req : HttpServerRequest => req.path match {case ("/") => req.response.sendFile("ws.html")}}
.listen(8080)
)()
II-HttpWebServer
Vert.x позволяет легко писать полнофункциональные, высокопроизводительные и масштабируемые серверы HTTP и HTTPS.
В следующем примере запускается Http-сервер, прослушивающий порт 8080 и регистрирующий все полученные запросы.
Джава
import org.vertx.java.core.Handler;
import org.vertx.java.core.http.HttpServer;
import org.vertx.java.core.http.HttpServerRequest;
import org.vertx.java.core.logging.Logger;
import org.vertx.java.deploy.Verticle;
public class SampleHttpWebServer extends Verticle {
public void start() {
HttpServer server = vertx.createHttpServer();
final Logger log = getContainer().getLogger();
server.requestHandler(new Handler<HttpServerRequest>() {
public void handle(HttpServerRequest request) {
log.info("A request has arrived on the server!");
}
}).listen(8080, "localhost");
}
}
Scala
import org.vertx.java.core.http. { HttpServerRequest => JHttpServerRequest}
import org.vertx.scala.deploy.Verticle
import org.vertx.scala.core._
class SampleWebServer extends Verticle ( x =>
x.getVertx().createHttpServer().withRequestHandler{_ : JHttpServerRequest =>
x.info("A request has arrived on the server!")}
.listen(8080, "localhost")
)()
III-HttpClient
Vert.x также предоставляет HttpClient API для взаимодействия с серверной частью. В следующих примерах создается и отправляется запрос GET, затем регистрируется ответ сервера.
Джава
import org.vertx.java.core.Handler;
import org.vertx.java.core.http.HttpClient;
import org.vertx.java.core.http.HttpClientRequest;
import org.vertx.java.core.http.HttpClientResponse;
import org.vertx.java.core.logging.Logger;
import org.vertx.java.deploy.Verticle;
public class SampleHttpClient extends Verticle {
@Override
public void start() throws Exception {
HttpClient client = vertx.createHttpClient().setHost("127.0.0.1");
final Logger log = getContainer().getLogger();
HttpClientRequest request = client.post("/some-path/", new Handler<HttpClientResponse>() {
public void handle(HttpClientResponse resp) {
log.info("Got a response: ");
}
});
request.end();
}
}
Scala
import org.vertx.scala.deploy.Verticle
import org.vertx.scala.core._
class SampleWebClient extends Verticle (v =>
v.getVertx.createHttpClient().setHost("127.0.0.1").setPort(8080)
.andGetNow("/") {_ => v.info("Got a response: " )}
)()
IV-EventBus Шина
событий похожа на позвоночник, ее можно использовать для соединения распределенных узлов и для поддержки взаимодействия между различными вертикалами, даже написанными на разных языках.
Джава
import org.vertx.java.deploy.Verticle;
import org.vertx.java.core.eventbus.EventBus;
public class SampleEventBus extends Verticle {
@Override
public void start() throws Exception {
EventBus eb = vertx.eventBus();
eb.send("path", "ping1");
eb.send("path", "ping2");
}
}
Scala
import org.vertx.scala.deploy.Verticle
import org.vertx.scala.core._
class SampleEventBus extends Verticle ( x => {
val point = x ! ("path")
point >> ("ping 1")
point >> ("ping 2")
}
)()
Заключение В
этой статье были представлены основные принципы работы с Vert.x с использованием языка scala и короткие примеры. Надеюсь, скоро появится полная языковая поддержка Scala.
Оставайтесь с нами, в следующем посте вы узнаете больше о Vert.x со Scala.
источник: http://blog.zenika.com/index.php?post/2013/02/11/fun-with-scala-and-vert-x