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