Vert.x SockJS 服务代理

当您编写一个Vert.x应用时,可能会需要在某个地方隔离一个功能,并且让这个功能在程序中的其他部分也可用。这就是服务代理的主要目的。 服务代理能在事件总线上公开一个 服务 ,只要知道发布服务的 地址 ,就能在任何的Vert.x组件中使用这个服务。这就是Vert.x服务代理可以实现的功能。 但是,Vert.x服务代理生成的客户端没办法直接在浏览器或Node.js应用中使用。 而Vert.x SockJS服务代理生成的客户端就可以在浏览器或Node.js应用中使用。 这些客户端依赖SockJS桥来将Vert.x事件总线中的事件传出/传入SockJS。

使用Vert.x SockJS 服务代理

要使用Vert.x SockJS 服务代理,需要添加如下依赖

  • Maven(在您的 pom.xml 文件中添加):

<dependency>
 <groupId>io.vertx</groupId>
 <artifactId>vertx-sockjs-service-proxy</artifactId>
 <version>4.4.0</version>
</dependency>
<dependency>
 <groupId>io.vertx</groupId>
 <artifactId>vertx-service-proxy</artifactId>
 <version>${vertx.version}</version>
</dependency>
  • Gradle(在您的 build.gradle 文件中添加):

compile 'io.vertx:vertx-sockjs-service-proxy:4.4.0'
compile 'io.vertx:vertx-service-proxy:${vertx.version}'

请注意!由于服务代理机制依赖于代码生成,所以对 服务接口 进行修改后需要先重新编译源码让代码生成器重新生成代理类代码。

在更进一步之前,我们建议您去查阅 服务代理文档.

在浏览器或者Node.js应用中调用您的服务

上一节展示了如何在Java中创建服务代理。然而,您可以使用基于SockJS的代理直接在浏览器或node.js应用中调用服务。

首先,您需要配置SockJS桥,让服务代理与服务进行通信。关于SockJS桥的更多详细内容请参考 vertx-web:

SomeDatabaseService service = new SomeDatabaseServiceImpl();
new ServiceBinder(vertx)
  .setAddress("database-service-address")
  .register(SomeDatabaseService.class, service);

Router router = Router.router(vertx);
// 允许指定地址的事件通过EventBus桥输入/输出
SockJSBridgeOptions opts = new SockJSBridgeOptions()
    .addInboundPermitted(new PermittedOptions()
        .setAddress("database-service-address"))
    .addOutboundPermitted(new PermittedOptions()
        .setAddress("database-service-address"));

// 创建EventBus桥并添加到路由中
router.mountSubRouter("/eventbus", SockJSHandler.create(vertx).bridge(opts));

vertx.createHttpServer().requestHandler(router).listen(8080);

一旦配置了SockJS桥,使用JavaScript开发的其他程序就可以直接与您的服务进行交互。在服务编译期间,将生成一个JS代理模块,其名称如下: module_name-js/server-interface_simple_name + -proxy.js。 举个例子,如您的接口命名为 MyService,代理模块就会被命名为 my_service-proxy.js。 复述一次,您可以从浏览器或node.js使用此代理模块。

生成的代理是一个与CommonJS,AMD和Webpack兼容的JavaScript模块。使用该代理只需EventBus桥和服务EventBus地址实例化即可。

<script src="http://cdn.sockjs.org/sockjs-0.3.4.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/vertx/3.4.2/vertx-eventbus.min.js"></script>
<!-- 这是生成出来的服务代理 -->
<script src="vertx-database-js/some_database_service-proxy.js"></script>
<script>
  var eb = new EventBus('http://localhost:8080/eventbus');
  eb.onopen = function () {
    var svc = new SomeDatabaseService(eb, "database-service-address");
    // 使用服务
  };
</script>

对于node.js应用,请按照下述方式使用:

var EventBus = require('vertx3-eventbus-client');
var SomeDatabaseService = require('../../some_database_service-proxy');

var eb = new EventBus('http://localhost:8080/eventbus/');
eb.onopen = function () {
  var svc = new SomeDatabaseService(eb, "database-service-address");
  // 使用服务
};