VERT.X介绍(续)
Posted 幸福Yo
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了VERT.X介绍(续)相关的知识,希望对你有一定的参考价值。
1、摘要
Vert.x最大的特点就在于异步(底层基于Netty),通过事件循环(EventLoop)来调起存储在异步任务队列(CallBackQueue)中的任务,大大降低了传统阻塞模型中线程对于操作系统的开销。因此相比较传统的阻塞模型,异步模型能够很大层度的提高系统的并发量。
Vert.x除了异步之外,还提供了非常多的吸引人的技术,比如EventBus,通过EventBus可以非常简单的实现分布式消息,进而为分布式系统调用,微服务奠定基础。除此之外,还提供了对多种客户端的支持,比如Redis,RabbitMQ,Kafka等等。
Vert.x异步也带来了编码上的复杂性,想要编写优美的异步代码,就需要对lambda表达式、函数式编程、Reactive等技术非常熟悉才行,否则很容易导致你的代码一团糟,完全没有可读性。另外,异步模型的性能调优、异常处理与同步模型有很大差异,网络中相关资料较少,使用中遇到问题排查困难,这也是目前国内架构师不愿意选择Vert.x的原因。
Vert.x运行在Java虚拟机上,支持多种编程语言,Vert.x是高度模块化的,同一个应用,你可以选择多种编程语言同时开发。在Vert.x 2版本,也就是基于JDK7,还没有lambda的时候,一般来讲,使用javascript作为开发语言相对较多,到Vert.x3的时代,因为JDK8的出现,Java已经作为Vert.x主流的开发语言,而Vert.x也被更多的开发者所接受。
2、Vertx能干什么
Java能做的,Vert.x都能做。主要讨论,Vert.x善于做哪些事情!
(1)Web开发,Vert.x封装了Web开发常用的组件,支持路由、Session管理、模板等,可以非常方便的进行Web开发。
(2)TCP/UDP开发,Vert.x底层基于Netty,提供了丰富的IO类库,支持多种网络应用开发。不需要处理底层细节(如拆包和粘包),注重业务代码编写。
(3)提供对WebSocket的支持,可以做网络聊天室,动态推送等。
(4)Event Bus(事件总线)是Vert.x的神经系统,通过Event Bus可以实现分布式消息,远程方法调用等等。正是因为Event Bus的存在,Vert.x可以非常便捷的开发微服务应用。
(5)支持主流的数据和消息的访问
Redis、MongoDB、RabbitMQ、kafka 等
(6)分布式锁,分布式计数器,分布式map的支持
3、应用示例
(1)搭建Vert.x Web服务器代码示例
pom.xml文件引入web扩展包
<dependency>
<groupId>io.vertx</groupId>
<artifactId>vertx-web</artifactId>
<version>3.9.0</version>
</dependency>
RestfulVerticle
public void start() {
// 实例化一个路由器出来,用来路由不同的rest接口
Router router = Router.router(vertx);
// 增加一个处理器,将请求的上下文信息,放到RoutingContext中
router.route().handler(BodyHandler.create());
// 处理一个post方法的rest接口
router.post("/post/:param1/:param2").handler(this::handlePost);
// 处理一个get方法的rest接口
router.get("/get/:param1/:param2").handler(this::handleGet);
router.route("/assets/*").handler(StaticHandler.create("assets"));
// 创建一个httpserver,监听8080端口,并交由路由器分发处理用户请求
vertx.createHttpServer().requestHandler(router::handle).listen(8080);
}
// 处理post请求的handler
private void handlePost(RoutingContext context) {
JsonObject obj1 = context.getBodyAsJson();
System.out.println(obj1);
// 从上下文获取请求参数,类似于从httprequest中获取parameter一样
String param1 = context.request().getParam("param1");
String param2 = context.request().getParam("param2");
if (isBlank(param1) || isBlank(param2)) {
// 如果参数空,交由httpserver提供默认的400错误界面
context.response().setStatusCode(400).end();
}
JsonObject obj = new JsonObject();
obj.put("method", "post").put("param1", param1).put("param2", param2);
// 申明response类型为json格式,结束response并且输出json字符串
context.response().putHeader("content-type", "application/json").end(obj.encodePrettily());
}
private void handleGet(RoutingContext context) {
// 从上下文获取请求参数,类似于从httprequest中获取parameter一样
String param1 = context.request().getParam("param1");
String param2 = context.request().getParam("param2");
// 如果参数空,交由httpserver提供默认的400错误界面
if (isBlank(param1) || isBlank(param2)) {
context.response().setStatusCode(400).end();
}
JsonObject obj = new JsonObject();
obj.put("method", "get").put("param1", param1).put("param2", param2);
context.response().putHeader("content-type", "application/json").end(obj.encodePrettily());
}
private boolean isBlank(String str) {
if (str == null || "".equals(str))
return true;
return false;
}
解析:
HttpServer:
http/https/websockets服务器,vert.x发布restful服务,不需要tomcat提供servlet容器,它自己就是一台性能强大的web服务器,并且原生支持负载均衡,后面我们会讲到。
Router类:
Router类可以理解为一个路由器,他接收httpserver带来的请求,并将不同的请求分发到不同的路由中,如果简单对比一下spring mvc的话,可以将router理解为spring mvc中的dispatcher。
route:
route代表一条路由,同样,对比spring mvc,相当于spring中的@RequestMapping,他指定了restful api的请求接口路径,并将其交给handler来处理该条路由。
Handler:
handler处理具体的路由请求,字面上讲就是处理某个具体的restful api。他与httpserver,router,route的关系可以用如下流程表示:
来自httpserver的request请求-->交由路由器做分发处理-->路由器匹配到具体的路由规则-->路由到最终的handler去处理请求
vert.x默认提供了很多处理器,包括但不局限于以下:
AuthHandler 处理权限校验支持
BodyHandler 提供所有请求上下文
CookieHandler 提供cookie支持
SessionHandler 提供session支持
RoutingContext:
请求上下文,可以理解为servlet中的httprequest和httpresponse
在RestfulVerticle.java的start方法里创建了一个Router对象。
router是Vert.x Web的基础,负责分发HTTP请求到handler(处理器),在Vert.x Web中还有两个很重要的概念。
Routes-定义请求的分发
Handlers-这是实际处理请求并且返回结果的地方。Handlers可以被链接起来使用。
router::accept,它表示引用一个方法(这里是引用router的accept方法)。当接收到一个请求的时候,告诉vert.x从router里调用accept方法。
将访问“/assets/*”的请求,route到“assets”目录下的资源,默认访问index.html。
4、辅助工具
Vert.x3常用工具
最后在提一下几个Vert.x3的一些小工具。
metrics
这个可以用来统计整个Vert.x内部的一些指标信息,比如HTTP请求数,TCP接受或者发送的流量等等,具体可以看官方文档,通过这个接口我们可以实时的统计Vert.x内部性能信息。
vertx-test-unit
Vert.x提供了专门针对异步代码的单元测试框架。
通过redeploy这个参数可以动态的热部署整个verticle,这个对开发调试时非常有用。
EventLoopChecker
Vert.x3内置了EventLoopChecker这个动态监测所有EventLoop线程的工具,默认EventLoop被阻塞了2秒钟的时候会触发报警,如果持续阻塞则会直接打印那一块的异常栈到日志里,非常方便开发者来检查自己的异步代码。
4、引用的网址
https://blog.csdn.net/king_kgh/article/details/80772657
https://blog.csdn.net/lizhou828/article/details/93297153
以上是关于VERT.X介绍(续)的主要内容,如果未能解决你的问题,请参考以下文章