HttpClient使用
HttpClient能在Verticle和嵌入地使用。当在Verticle中使用时,Verticle将使用自己的客户端实例。很多的一般的客户端不会在不同的Vert.x上下文中共享,因为这样会导致不期望的行为。例如,一个长连接将在打开的连接的请求上下文上调用客户端处理器,随后的请求将使用相同的上下文。当这发生时,Vert.x发现并记录告警:
Reusing a connection with a different context:an HttpClient is probably shared between different Verticles
HttpClieng可以嵌入非Vert.x线程,如单元测试或者纯java的main方法:客户端处理会被不同的Vert.x线程和上下文调用,这样的上下文是跟据需要创建的。在产品环境下,不推荐此用法。
服务共享
多个HTTP服务器侦听同一个端口时,Vert.x使用round-robin策略进行协调。让我在一个verticle中像这样创建一个HTTP服务器:
io.vertx.examples.http.sharing.HttpServerVerticle
vertx.createHttpServer().requestHandler(request-> {
request.response().end("Hello from server " + this);
}).listen(8080);
此服务正侦听在8080端口。所以此Verticle用下面代码实例化了多次
vertx runio.vertx.examples.http.sharing.HttpServerVerticle -instances 2
会发生什么?如果两个verticles绑定到相同端口,你也许会收到一个SOCKET异常。幸运的是,Vert.x为了处理了这种情况。当在已经存在的服务器的同一地址端口上布署另外服务器,实际上Vert.x不会去在侦听一同一主机/端口上创建新的服务器。Vert.x仅绑定一次socket。当收到一个请求并调用服务器处理器时采用轮循策略。
让我们想象下面的客户端:
vertx.setPeriodic(100, (l) -> {
vertx.createHttpClient().getNow(8080, "localhost","/", resp -> {
resp.bodyHandler(body -> {
System.out.println(body.toString("ISO-8859-1"));
});
});
});
Vert.x将请求顺序地委托给服务器:
Hello from i.v.e.h.s.HttpServerVerticle@1
Hello from i.v.e.h.s.HttpServerVerticle@2
Hello from i.v.e.h.s.HttpServerVerticle@1
Hello from i.v.e.h.s.HttpServerVerticle@2
所以服务器可以在可获得的运算核心上进行伸缩,第个运算核心上Vert.x Verticle实例保持严格单线程,所以不必编写负载均稀器这样的技巧就能将你服务器扩展到你的多核机器上。
通过Vert.x使用HTTPS
Vert.x http服务器和客户端可以像net服务器一样被配置使用HTTPS。请参考使用SSL配置网络服务器获取更多信息。
WebSockets
WebSockets是一项技术,它允许全双工的Socket-正如HTTP服务器和HTTP客户端(通常指浏览器)之间的连接。(这里全双工指的是服务器可以向客户端推数据)。Vert.x客户端与服务器均支持WebSockets
服务器端WebSockets
有两种方式处理服务器端WebSockets。
WebSocket处理器
第一种方法是向server实例提供WebSocket处理器(websocketHandler)。在与服务器建立WebSocket连接时,处理器带着ServerWebSocket对象被调用。
server.websocketHandler(websocket -> {
System.out.println("Connected!");
});
也可调用reject方法拒绝webSocket
server.websocketHandler(websocket -> {
if(websocket.path().equals("/myapi")) {
websocket.reject();
} else{
// Dosomething
}
});
升级到WebSocket
第二种处理WebSockets的方法是将HTTP处理客户端HTTP升级请求,在服务器上调用upgrade请求
server.requestHandler(request -> {
if(request.path().equals("/myapi")) {
ServerWebSocket websocket = request.upgrade();
// Dosomething
} else{
//Reject
request.response().setStatusCode(400).end();
}
});
服务器WebSocket
ServerWebSocket实例让你接收WebSocket握手的HTTP请求头,路径,查询和URI。