Vert.x 3: SockJS 服務代理

Vert.x 3: SockJS 服務代理
Vert.x 3: 服務代理
Vert.x 3: Node和瀏覽器端事件總線重連html

SockJS 服務代理

經過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.js實現

一樣在根目錄下執行

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

參考資料

https://www.zybuluo.com/contr...

相關文章
相關標籤/搜索