VERT.X介绍(续)

Posted 幸福Yo

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了VERT.X介绍(续)相关的知识,希望对你有一定的参考价值。

1、摘要

Vert.x最大的特点就在于异步(底层基于Netty),通过事件循环(EventLoop)来调起存储在异步任务队列(CallBackQueue)中的任务,大大降低了传统阻塞模型中线程对于操作系统的开销。因此相比较传统的阻塞模型,异步模型能够很大层度的提高系统的并发量。

Vert.x除了异步之外,还提供了非常多的吸引人的技术,比如EventBus,通过EventBus可以非常简单的实现分布式消息,进而为分布式系统调用,微服务奠定基础。除此之外,还提供了对多种客户端的支持,比如RedisRabbitMQKafka等等。

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也被更多的开发者所接受。

2Vertx能干什么

Java能做的,Vert.x都能做。主要讨论,Vert.x善于做哪些事情!

1Web开发,Vert.x封装了Web开发常用的组件,支持路由、Session管理、模板等,可以非常方便的进行Web开发。

2TCP/UDP开发,Vert.x底层基于Netty,提供了丰富的IO类库,支持多种网络应用开发。不需要处理底层细节(如拆包和粘包),注重业务代码编写。

3)提供对WebSocket的支持,可以做网络聊天室,动态推送等。

4Event Bus(事件总线)是Vert.x的神经系统,通过Event Bus可以实现分布式消息,远程方法调用等等。正是因为Event Bus的存在,Vert.x可以非常便捷的开发微服务应用。

5)支持主流的数据和消息的访问

   RedisMongoDBRabbitMQkafka

  (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的一些小工具。

  1. metrics

    这个可以用来统计整个Vert.x内部的一些指标信息,比如HTTP请求数,TCP接受或者发送的流量等等,具体可以看官方文档,通过这个接口我们可以实时的统计Vert.x内部性能信息。

  2. vertx-test-unit

    Vert.x提供了专门针对异步代码的单元测试框架。

    通过redeploy这个参数可以动态的热部署整个verticle,这个对开发调试时非常有用。

  3. 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介绍(续)的主要内容,如果未能解决你的问题,请参考以下文章

VERT.X介绍

活动预告Vert.x开发框架介绍

Vert.x 响应式 Web 框架介绍使用

Vert.x系列04 - 你意想不到的那些路由规则

Vert.x Java开发指南 第一章 介绍

浅谈 Vert.x 的Context 对象