Vert.x核心模块 HTTP客户端推送 (十【5】)
来源:互联网 发布:表白失败知乎 编辑:程序博客网 时间:2024/06/05 18:58
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。- Vert.x核心模块 HTTP客户端推送 (十【5】)
- Vert.x核心模块 HTTP客户端推送 (九【4】)
- Vert.x 核心模块 HTTP websocket(十一【6】)
- Vert.x 核心模块 DNS(十五)
- Vert.x核心模块(十七) 命令行
- Vert.x 核心模块 特性介绍(一)
- Vert.x 核心模块 内核组件Verticle(二)
- Vert.x 核心模块 编写TCP服务器端(五)
- Vert.x核心模块 访问文件系统(十三)
- Vert.x 核心模块 UDP数据报访问(十四)
- Vert.x 内核模块 编写HTTP服务器(六【1】)
- Vert.x 内核模块 编写HTTP服务器(七【2】)
- Vert.x 内核模块 编写HTTP服务器(八【3】)
- Vert.x学习笔记(一) Vert.x 核心包
- Vert.x 核心模块(十六) 流 线程安全 SPI OSGi
- Vert.x 内核模块 Buffer( 四 )
- Vert.x Web 模块(一)
- Vert.x Web模块(二)
- 关于第三方so包的问题
- 安装Djang时遇到的一个小问题
- python核心编程第二版,第2章课题作业 2-11
- TextView添加下滑线
- spring mvc 响应界面跳转的几种方式
- Vert.x核心模块 HTTP客户端推送 (十【5】)
- 数据库工具 Navicat_Premium
- 小白日记15:kali渗透测试之弱点扫描-漏扫三招、漏洞管理、CVE、CVSS、NVD
- Android 监听网络连接状态
- TextView控制字的个数
- Spring MVC 学习笔记1:Spring 框架
- 补全默认Tableview的cell分割线最前面15的空缺
- c 指针与首地址
- Java与MySQL之间的连接