@contribute
2016-06-05T10:57:40.000000Z
字数 2392
阅读 2011
翻译
当你构建一个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 bridge
BridgeOptions 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
};