Vert.x 3: SockJS 服務代理
Vert.x 3: 服務代理
Vert.x 3: Node和瀏覽器端事件總線重連html
經過SockJS服務代理, 咱們能夠從瀏覽器或Node.js來調用事件總線上的服務. 原文位置在: https://github.com/developerw... 這裏備用java
咱們已經演示過如何在Java中實現服務代理來調用服務, 這篇文章闡述如何在瀏覽器或Node.js中來調用服務. 這對異構系統的集成來說是很是方便的. 好比你有一個Java編寫的在事件總線上的二維碼服務(傳遞參數生成二維碼), 咱們須要在Node.js端或瀏覽器端生成一個二維碼. 那麼這時, SockJS服務代理就很是有用了, 你不須要手工去解析消息, SockJS服務代理自動爲你解析消息並調用遠程服務, 就像調用本地函數同樣.node
爲了讓代理和服務進行通訊,首先咱們須要配置SockJS橋.python
package com.totorotec.service.qrcode; import io.vertx.core.AbstractVerticle; import io.vertx.ext.bridge.PermittedOptions; import io.vertx.ext.web.Router; import io.vertx.ext.web.handler.sockjs.BridgeOptions; import io.vertx.ext.web.handler.sockjs.SockJSHandler; import java.util.List; /** * Vert.x-Web 包含內置的SockJS套接字處理器, 被稱爲事件總線橋, 它有效地把服務器端Vert.x事件總線 * 擴展到了客戶端Javascript */ public class QrcodeServiceBridge extends AbstractVerticle { @Override public void start() throws Exception { super.start(); // 初始化路由器 Router router = Router.router(vertx); // 套接字處理 SockJSHandler sockJSHandler = SockJSHandler.create(vertx); // 橋選項 BridgeOptions options = new BridgeOptions(); options.addInboundPermitted(new PermittedOptions().setAddress(QrcodeService.SERVICE_ADDRESS)); options.addOutboundPermitted(new PermittedOptions().setAddress(QrcodeService.SERVICE_ADDRESS)); // 橋接 sockJSHandler.bridge(options); // 設置路由 router.route("/eventbus/*").handler(sockJSHandler); // 監聽 8080 端口 vertx.createHttpServer().requestHandler(router::accept).listen(8080); } }
一旦完成SockJS橋的設置, 咱們就能夠在瀏覽器或Node.js中與後端服務通訊了. 在服務編譯階段, 編譯過程會自動生成JS代理模塊. 生成的JS代理模塊命名規則爲: module_name-js/server-interface_simple_name + -proxy.js
. 例如若是你的服務接口名稱爲 QrcodeService, 那麼生成的代理模塊名稱爲 qrcode_service-proxy.js. 而後在瀏覽器或Node.js中引入(require)便可.git
生成的模塊是兼容 CommonJS, AMD 和 Webpack 的. 下面是一個瀏覽器端的例子:github
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>Test Qrcode Service in Browser</title> <script src="https://cdn.jsdelivr.net/npm/sockjs-client@1/dist/sockjs.min.js"></script> <script src="./vertx-eventbus.js"></script> <script src="./qrcode_service-proxy.js"></script> </head> <body> <div id="qrcode"></div> <script> var qrcodeStr; var eb = new EventBus('http://localhost:8080/eventbus'); eb.onopen = function () { var service = new QrcodeService(eb, "com.totorotec.servicefactory.qrcode-service"); service.getQrcode("https://www.qq.com", 380, "png", "dataurl", "/tmp/%s.%s", function (error, data) { if (error == null) { console.log(data.data); qrcodeStr = data.data document.getElementById("qrcode").innerHTML = qrcodeStr; } else { console.log(error); } }); }; </script> </body> </html>
下面的例子是說明了如何在Node.js環境中調用服務:web
var EventBus = require("vertx3-eventbus-client"); var eb = new EventBus("http://localhost:8080/eventbus"); eb.onopen = function () { // 導入代理模塊 var QrcodeService = require("./target/classes/qrcode-service-js/qrcode_service-proxy"); // 實例化服務對象 var service = new QrcodeService(eb, "com.totorotec.servicefactory.qrcode-service"); // 調用服務 service.getQrcode("https://gm.totorotec.com", 380, "png", "dataurl", "/tmp/%s.%s", function (data, error) { console.log(data); console.log(error); }); }
對於SockJS代理模塊的生成, 須要在Maven的POM中增長以下依賴, 而後執行 mvn compile 生成的SockJS代理模塊默認會放在 ./target/classes 目錄下. 名稱遵循前面說過的命名規則. 對於二維碼服務這個例子, 生成的SockJS代理的位置爲: target/classes/qrcode-service-js/qrcode_service-proxy.js:npm
<dependency> <groupId>io.vertx</groupId> <artifactId>vertx-sockjs-service-proxy</artifactId> <version>3.5.0</version> </dependency>
完整的例子查看倉庫: https://github.com/developerw...segmentfault
啓動服務後端
./redeploy.sh
在項目根目錄下運行 python -m SimpleHTTPServer 9999
, 瀏覽器地址輸入: http://localhost:9999, 打開文件 test-qrcode-service-browser.html 測試瀏覽器端獲取二維碼的dataURL.
一樣在根目錄下執行
node tests/test-qrcode-service.js
另外還有一個ES的 async/await
實現, 須要安裝 babel-cli
:
yarn add --dev babel-cli ./node_modules/.bin/babel-node ./tests/test-qrcode-service-promise.js