@contribute
2016-06-05T10:57:40.000000Z
字数 2392
阅读 2138
翻译
当你构建一个vert.x应用时,你可能想将某个功能独立出来并为其他应用可用。
那就是服务代理的目的。它让你在event bus上暴露一个服务,一旦其他组件知道服务的发布地址时,就能使用这个服务。这些都是有vert.x服务代理完成的。然而,vert.x的服务客户端不能你的浏览器或node.js中使用。vert.x SockJS服务代理产生服务客户端,通过这个客户端你可以从浏览器或node.js 应用中使用服务。这些客户端依靠sorckJS bridge 来传递event bus与SockJS之间的通信。
使用Vert.x SockJS服务代理,需要添加以下依赖:
<dependency><groupId>io.vertx</groupId><artifactId>vertx-sockjs-service-proxy</artifactId><version>3.2.1</version></dependency><dependency><groupId>io.vertx</groupId><artifactId>vertx-service-proxy</artifactId><version>3.2.1</version></dependency>
compile 'io.vertx:vertx-sockjs-service-proxy:3.2.1'compile 'io.vertx:vertx-service-proxy:3.2.1'
前面一节讲述了如何使用java创建一个服务代理。然而,你可以使用基于SockJS的代理直接从浏览器或Node.js中消费你的服务。
为了让代理能与服务交互,首先,你需要配置 SockJS bridge。如果想了解 SockJS bridge的细节可以参考此链接。
SomeDatabaseService service = new SomeDatabaseServiceImpl();ProxyHelper.registerService(SomeDatabaseService.class, vertx, service,"database-service-address");Router router = Router.router(vertx);// Allow events for the designated addresses in/out of the event bus bridgeBridgeOptions opts = new BridgeOptions().addInboundPermitted(new PermittedOptions().setAddress("database-service-address")).addOutboundPermitted(new PermittedOptions().setAddress("database-service-address"));// Create the event bus bridge and add it to the router.SockJSHandler ebHandler = SockJSHandler.create(vertx).bridge(opts);router.route("/eventbus/*").handler(ebHandler);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服务地址:
<script src="http://cdn.sockjs.org/sockjs-0.3.4.min.js"></script><script src="vertx-eventbus.js"></script><script>var eb = new EventBus('http://localhost:8080/eventbus');eb.onopen = function() {var SomeDatabaseService =require('vertx-database-js/some_database_service-proxy.js');var svc = new SomeDatabaseService(eb, "database-service-address");// use the service};</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");// use the service};