最近在给Vert.x 4.x版本和3.5.0版本做监控探针的需求,应leader的要求,回顾总结一下Vert.x的一些技术点,包括但不限于和tomcat,springcloud的对比云云。
首先,谈一下做这个需求得到的一些技术上的提升和处理问题解决方法的提升还有事后诸葛亮对当时处理问题不够机智的一些反思。
1.反思:
Vert.x做为一个不温不火的一个框架,要写Vert.x的测试demo以及是用户常用的demo来说,网上资料很少,几乎很少有公司是大规模使用这个异步框架的,据内部消息而言,不少新兴的互联网造车企业是用的这个,比如:合众汽车(哪吒),上汽阿里智己汽车等是用的vert.x,当时花了很多时间去在GitHub上搜索对应的测试demo结果都无功而返,搞出来的测试demo都无法命中埋点。最绝望的时候给pinpoint的开发者发邮件,让其分享测试demo,买了Vert.x实战的书,确实这玩意儿不了解真的挺痛苦的,他的写法跟传统的springboot的controller完全不同。期间花了大量的时间去看书,看vert.x的官方文档。后面倒是在pinpoint github的提交记录上发现了 pinpoint的韩国开发同学把他们的测试demo发在了pinpoint开源上,这可真是眼瞎啊,后面在这个基础上 改造vert.x来适应 4.2.2和 3.5.0.幸好读了大量的官网资料和官网推荐的vert.x实战的书,花了大概半天的工夫把demo给完成了,有了demo 有了异步调用再去远程调试,这样难度就不再大了,后面在有如神助的情况下,完成了 4.x版本和3.5.0版本的兼容。同时还给pinpoint的同学提了bug,他们表示会在后续的版本修复我提的bug,瞬间觉得自己有点小牛逼,可以给开源的pinpoint贡献自己的代码了,哈哈哈哈,这里还留了个私心,还有个兼容的bug我照亮好久才解决掉,就没有给pinpoint的提,这样我们的竞品相对于他们的会有些优势。讲道理虽然不喜欢韩国棒子,但是人家的pinpoint写的是真的好,国内要是再多一些这样的开发就好了。
2.技术提升 Vert.x demo解析:
这里以4.2.2版本为例来聊一下Vert.x,如果读者用的是3.9.8,3.5.0的话,咋们也可以私下邮件聊下,在我不忙的时候,废话不多说,上代码:


```java
import io.vertx.core.*;
import io.vertx.core.http.*;
import io.vertx.core.net.SelfSignedCertificate;
import io.vertx.ext.web.Router;import java.util.concurrent.TimeUnit;public class Vertx4PluginTestStarter extends AbstractVerticle {public static void main(String[] args) {//创建和销毁一个Vertx,每完成一次都会做这个操作Vertx vertx = Vertx.vertx();vertx.deployVerticle(new Vertx4PluginTestStarter());}@Overridepublic void start(Promise<Void> startPromise) throws Exception {//这里是建一个服务端,设置对应的参数HttpServerOptions options = new HttpServerOptions();options.setIdleTimeout(10000);options.setSsl(true);SelfSignedCertificate selfSignedCertificate = SelfSignedCertificate.create();options.setKeyCertOptions(selfSignedCertificate.keyCertOptions());options.setTrustOptions(selfSignedCertificate.trustOptions());
//设置路由,这里设置路由的作用是可以访问多个URL,起简化代码的作用,这个也是Vert.x的核心内容Router router = Router.router(vertx);router.get("/").handler(routingContext -> {routingContext.response().end("Welcome pinpoint vert.x HTTP server test.");});router.get("/request").handler(routingContext -> {request(80, "www.baidu.com", "/");routingContext.response().setStatusCode(200).end("Request www://baidu.com:80/");});router.get("/request/local").handler(routingContext -> {request(8080, "localhost", "/cn/cn/user?username=mary");routingContext.response().end("Request http://localhost:8080/cn/cn/user?username=mary");});//调用www.baidu.comrouter.get("/request/local/zhicc/422").handler(routingContext -> {//建一个客户端去请求百度的地址HttpClientOptions options1 = new HttpClientOptions().setDefaultHost("baidu.com");// Can also set default port if you want...HttpClient client = vertx.createHttpClient(options1);client.request(HttpMethod.GET, "/", ar1 -> {if (ar1.succeeded()) {HttpClientRequest request = ar1.result();request.send(ar2 -> {if (ar2.succeeded()) {HttpClientResponse response = ar2.result();response.end();System.out.println("Received response with status code " + response.statusCode());}});}});//请求结束后,结束响应routingContext.response().end("Request www.baidu.com");});//调用Springboot http://localhost:8080/hellorouter.get("/request/local/springboot/422").handler(routingContext -> {//HttpClientOptions options2 = new HttpClientOptions().setDefaultHost("127.0.0.1:8080");// Can also set default port if you want...HttpClient client = vertx.createHttpClient();client.request(HttpMethod.GET,8089, "localhost", "/hello", ar1 -> {if (ar1.succeeded()) {HttpClientRequest request = ar1.result();// Send the request and process the responserequest.send(ar -> {if (ar.succeeded()) {HttpClientResponse response = ar.result();System.out.println("Received response with status code " + response.statusCode());} else {System.out.println("Something went wrong " + ar.cause().getMessage());}});}});routingContext.response().end("Request localhost:8080" );});router.get("/request/https").handler(routingContext -> {request(443, "aliyun.com", "/");routingContext.response().end("Request http://aliyun.com:80/");});router.get("/noresponse").handler(routingContext -> {});router.get("/close").handler(routingContext -> {routingContext.response().close();});router.get("/connection/close").handler(routingContext -> {routingContext.request().connection().close();});router.get("/executeBlocking").handler(routingContext -> {executeBlocking(routingContext.request(), 1);});router.get("/executeBlocking/wait10s").handler(routingContext -> {executeBlocking(routingContext.request(), 10);});router.get("/executeBlocking/request").handler(routingContext -> {executeBlockingRequest(routingContext.request());});router.get("/runOnContext").handler(routingContext -> {runOnContext(routingContext.request(), 1);});router.get("/runOnContext/wait10s").handler(routingContext -> {runOnContext(routingContext.request(), 10);});router.get("/runOnContext/request").handler(routingContext -> {runOnContextRequest(routingContext.request());});//这里是访问路径 localhost:18080/url(上面get的URL)vertx.createHttpServer().requestHandler(router).listen(18080, http -> {if (http.succeeded()) {startPromise.complete();System.out.println("HTTP server started on port 18080");} else {startPromise.fail(http.cause());}});}private void executeBlocking(HttpServerRequest request, final int waitSeconds) {vertx.executeBlocking(new Handler<Promise<Object>>() {@Overridepublic void handle(Promise<Object> objectFuture) {sleep(waitSeconds);request.response().end("Execute blocking.");}}, false, null);}private void executeBlockingRequest(HttpServerRequest request) {vertx.executeBlocking(new Handler<Promise<Object>>() {@Overridepublic void handle(Promise<Object> objectFuture) {request(80, "aliyun.com", "/");request.response().end("Execute blocking request.");}}, false, null);}private void runOnContext(HttpServerRequest request, final int waitSeconds) {vertx.runOnContext(aVoid -> {sleep(waitSeconds);request.response().end("Run on context");});}private void runOnContextRequest(HttpServerRequest request) {vertx.runOnContext(aVoid -> {request(80, "aliyun.com", "/");request.response().end("Run on context request.");});}private void sleep(int waiteSeconds) {try {Thread.sleep(TimeUnit.SECONDS.toMillis(waiteSeconds));} catch (InterruptedException e) {}}
//这块是pinpoint那边写的,结果会报错,会包连接closepublic void request(int port, String host, String uri) {final HttpClient client = vertx.createHttpClient();client.request(HttpMethod.GET, port, host, uri, new Handler<AsyncResult<HttpClientRequest>>() {@Overridepublic void handle(AsyncResult<HttpClientRequest> asyncResult) {System.out.println("## Result=" + asyncResult.result());System.out.println(host+":"+port +uri);}});}
//这块是我根据官方文档去修改的public void request1( String uri) {final HttpClient client = vertx.createHttpClient();client.request(HttpMethod.GET, uri, ar1 -> {if (ar1.succeeded()) {HttpClientRequest request = ar1.result();System.out.println(request.end());}});}}
3.对比tomcat和springcloud的优势和缺点(后续补充)
4.vert.x线程池监控后的一些思考
Vert.x的线程池分为vert.x-internal-blocking和vert.x-worker-thread这两种属于vert.x的内部线程池,顾名思义一个是内核阻塞线程池和工作线程池,还有个比较核心的但算不上线程池,叫eventLoopThreadGroup,eventLoop线程组,这个是利用netty,利用vert.x的eventLoopThreadFactory去创建线程,按照用户的需求,建立一定poolsize的线程组,达到了单线程异步非阻塞的效果。

Vert.x技术点总结相关推荐

  1. Vert.x(vertx) 实现TCP服务

    对于Java开发人员,想要实现一个http服务,非常简单,写个servlet,打成war包,放到tomcat下就能运行.但如果要实现一个tcp服务就没那么简单了,因为tcp是传输层协议,并不像http ...

  2. Vert.x(vertx) Web开发-路由

    在Vert.x 创建HTTP服务 中我们已经创建了一个简单的HttpServer,但这个HttpServer比较低级,对于请求参数解析.Session等常用功能都需要我们通过编码实现,也就是要重复造轮 ...

  3. Vert.x(vertx) 创建HTTP服务

    Vert.x底层通信框架依赖于Netty,并封装了对Http协议的支持,因此可以非常方便的进行Web开发,且不依赖于任何中间件.笔者所在的公司老系统使用的是SSM架构的项目,部署在Weblogic上, ...

  4. Vert.x(vertx) 连接MySQL、Oracle数据库

    Vert.x提供异步访问数据库的API,可能这里有朋友会有疑惑,直接使用我们之前的熟悉的Mybatis或者Hibernate不行吗,可行,但数据库操作是一个耗时操作,使用传统的同步模型,容易阻塞线程, ...

  5. Vert.x(vertx) 事件总线(EventBus)与 远程服务调用

    Event Bus(事件总线) 是Vert.x的神经系统,负责应用系统消息的传递.Vert.x各模块(Verticle)之间的相互调用就是通过Event Bus实现的,因此各Verticle之间是高度 ...

  6. Vert.x(vertx) 认证和授权详解(包含认证和授权在Web系统中的使用)

    每个线上系统几乎都是离不开认证和授权的,Vert.x提供了灵活.简单.便捷的认证和授权的支持.Vert.x抽象出了两个核心的认证和授权的接口,一个是AuthProvider,另一个是User.通过这两 ...

  7. Vert.x(vertx) 简明介绍

    摘要 Vert.x最大的特点就在于异步(底层基于Netty),通过事件循环(EventLoop)来调起存储在异步任务队列(CallBackQueue)中的任务,大大降低了传统阻塞模型中线程对于操作系统 ...

  8. Vert.x架构简述

    Vert.x 简介 Vert.x是一个工具集,用来在JVM上构建反应式应用.反应式的应用能够随着负载的增加而伸缩,也能够在故障中保持灵活. 传统的实现方式面临的问题 传统的实现高并发的方式是很多的线程 ...

  9. 【CSDN软件工程师能力认证学习精选】 Vert.x(vertx) 简明介绍

    CSDN软件工程师能力认证(以下简称C系列认证)是由中国软件开发者网CSDN制定并推出的一个能力认证标准.C系列认证历经近一年的实际线下调研.考察.迭代.测试,并梳理出软件工程师开发过程中所需的各项技 ...

最新文章

  1. 安卓重要组件#1--ListView创建及基本的使用方法
  2. 第二章 微服务网关基础组件 - zuul入门
  3. MySQL count(*)这么慢,我该怎么办?
  4. 小白入门angular-cli的第一次旅程(学习目标 1.路由的基础知识 参数订阅写法)
  5. 拖欠水费可能影响个人征信,大家怎么看?
  6. laravel mysql 锁表_Laravel中MySQL的乐观锁与悲观锁
  7. Python学习笔记之头部文件
  8. 是否有任何python库可以从自然语言中解析日期和时间?
  9. Java界面编程—事件的种类
  10. Vsphere日记01.ESXi5.5.install
  11. 屏蔽登录QQ后总是弹出的QQ网吧页面
  12. Linux 使用 ffmpeg 开发
  13. osgEarth 加载矢量shp数据
  14. (OS 10038)在一个非套接字上尝试了一个操作 的解决办法
  15. selenium如何执行网页脚本
  16. 织梦cms5.7搭配php哪个版本,DedeCMS V5.5正式版正式发布(Build-0912)
  17. 电子元件-发光二极管与数码管
  18. IDEA下Git标签使用
  19. Altium Designer15通用规则设置
  20. 关于自信的故事(卖石头的小故事)

热门文章

  1. pythonnet 详解,Python调用.net动态库实现过程解析
  2. Ubuntu mysql 修改密码失败的问题ERROR 1045 (28000): Access denied for user ‘debian-sys-maint‘@‘localhost‘
  3. luogu3645 [Apio2015]雅加达的摩天大楼 (分块+dijkstra)
  4. ScrollView 滚动视图控件
  5. 搭建网站,购买域名和虚拟空间共需花费多少?
  6. 电视连接后显示服务器异常,电视老显示链接服务器异常
  7. 报错:cannot overwrite directory ‘xxx‘ with non-directory
  8. python:实现余数定理算法(附完整源码)
  9. KATE编辑器的使用感受和设置问题
  10. 适用于中小企业的5种采购策略