[关闭]
@contribute 2016-06-05T10:57:40.000000Z 字数 2392 阅读 1896

Vert.x SockJS Service Proxy

翻译


当你构建一个vert.x应用时,你可能想将某个功能独立出来并为其他应用可用。

那就是服务代理的目的。它让你在event bus上暴露一个服务,一旦其他组件知道服务的发布地址时,就能使用这个服务。这些都是有vert.x服务代理完成的。然而,vert.x的服务客户端不能你的浏览器或node.js中使用。vert.x SockJS服务代理产生服务客户端,通过这个客户端你可以从浏览器或node.js 应用中使用服务。这些客户端依靠sorckJS bridge 来传递event bus与SockJS之间的通信。

使用Vert.x SockJS服务代理

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

  1. <dependency>
  2. <groupId>io.vertx</groupId>
  3. <artifactId>vertx-sockjs-service-proxy</artifactId>
  4. <version>3.2.1</version>
  5. </dependency>
  6. <dependency>
  7. <groupId>io.vertx</groupId>
  8. <artifactId>vertx-service-proxy</artifactId>
  9. <version>3.2.1</version>
  10. </dependency>
  1. compile 'io.vertx:vertx-sockjs-service-proxy:3.2.1'
  2. compile 'io.vertx:vertx-service-proxy:3.2.1'

从浏览器或Node.js中使用服务。

前面一节讲述了如何使用java创建一个服务代理。然而,你可以使用基于SockJS的代理直接从浏览器或Node.js中消费你的服务。

为了让代理能与服务交互,首先,你需要配置 SockJS bridge。如果想了解 SockJS bridge的细节可以参考此链接

  1. SomeDatabaseService service = new SomeDatabaseServiceImpl();
  2. ProxyHelper.registerService(SomeDatabaseService.class, vertx, service,
  3. "database-service-address");
  4. Router router = Router.router(vertx);
  5. // Allow events for the designated addresses in/out of the event bus bridge
  6. BridgeOptions opts = new BridgeOptions()
  7. .addInboundPermitted(new PermittedOptions()
  8. .setAddress("database-service-address"))
  9. .addOutboundPermitted(new PermittedOptions()
  10. .setAddress("database-service-address"));
  11. // Create the event bus bridge and add it to the router.
  12. SockJSHandler ebHandler = SockJSHandler.create(vertx).bridge(opts);
  13. router.route("/eventbus/*").handler(ebHandler);
  14. vertx.createHttpServer().requestHandler(router::accept).listen(8080);

一旦配置了sockJS bridge,用JavaScript开发的应用就可以直接与你的服务通信。在这个服务的编译过程中会产生一个JS的代理模块,命名为:module_name-js/server-interface_simple_name + -proxy.js。例如:你的接口名为:MyService,那么你的代理模块名为:my_service-proxy.js.

产生的代理是一个JavaScript模块是与 CommonJS、AMD和Webpack兼容的。这个代理只需要实例化EventBus bridge和eventbus服务地址:

  1. <script src="http://cdn.sockjs.org/sockjs-0.3.4.min.js"></script>
  2. <script src="vertx-eventbus.js"></script>
  3. <script>
  4. var eb = new EventBus('http://localhost:8080/eventbus');
  5. eb.onopen = function() {
  6. var SomeDatabaseService =
  7. require('vertx-database-js/some_database_service-proxy.js');
  8. var svc = new SomeDatabaseService(eb, "database-service-address");
  9. // use the service
  10. };
  11. </script>

对于node.js应用,其使用如下:

  1. var EventBus = require('vertx3-eventbus-client');
  2. var SomeDatabaseService = require('../../some_database_service-proxy');
  3. var eb = new EventBus('http://localhost:8080/eventbus/');
  4. eb.onopen = function () {
  5. var svc = new SomeDatabaseService(eb, "database-service-address");
  6. // use the service
  7. };
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注