Vertx.vertx()实例

一、构造方法

1. VertxImpl构造方法 选择 transports protocol , default select 模型

if (options.getPreferNativeTransport()) {
Transport nativeTransport = Transport.nativeTransport();
if (nativeTransport != null && nativeTransport.isAvailable()) {
transport = nativeTransport;// 使用netty-transport-native epoll-ET 或 Kqueue
} else {
transport = Transport.JDK;// java.nio (linux下 epoll-LT)
}
} else {
transport = Transport.JDK;// java.nio (linux下 epoll-LT)
}

native transports protocol

transports TCP UDP SCTP UDT
jdk-NIO X X X X
netty-native-epoll X X — —
OIO X X X X
PS : select 模型是线性扫描所有 FD , 时间复杂度O(n), 轮训机制.
epoll 模型基于callback机制 , k 活跃数 时间复杂度O(k).
试用场景: 大量FD 基本都是活跃状态,select 比 epoll 优秀,没有epollctl的回調开销,
反之有大量idle , dead状态 , epoll更优秀

2. BlockedThreadChecker线程,检查所有线程阻塞, 观察者模式

//默认Timer每 1 seconds检查一次 , 默认warn时间 5 seconds
checker = new BlockedThreadChecker(options.getBlockedThreadCheckInterval()
, options.getWarningExceptionTime()); //守护线程,监听所有阻塞线程,遍历扫描(container) WeakHashMap 弱引用,
//ContextImpl.runCloseHooks 执行结束置为null,使GC线程自动回收资源, 防止内存泄漏
timer = new Timer("vertx-blocked-thread-checker", true);
timer.schedule(...);
 

3. eventloop线程池

eventloop线程本质是对netty eventloop的封装.
eventLoopGroup = transport.eventLoopGroup(options.getEventLoopPoolSize()
,eventLoopThreadFactory, NETTY_IO_RATIO);
// 默认 2 * number of cores ,linux下依赖 /proc/self/status 做计算 acceptorEventLoopGroup = transport.eventLoopGroup(
, acceptorEventLoopThreadFactory, );
//负责客户端连接,线程1,单进程服务线程为1即可,否则造成资源浪费
note: eventloop线程checker默认最大阻塞时间 2 seconds,处理时间越长,eventloop事件堆积 就越多,影响服务正常响应,切不可阻塞,阻塞任务可换成worker线程池运行

4. worker线程池

worker线程池是J.U.C包下的FixedThreadPool,默认default 20

ExecutorService workerExec=Executors.newFixedThreadPool(
options.getWorkerPoolSize(),new VertxThreadFactory("vert.x-worker-thread-"
,checker, true, options.getMaxWorkerExecuteTime()));

note: worker主要用来处理耗时任务, 阻塞同步的调用而设计,checker默认超时时间 60 seconds, 执行行为两种, 串行(采用数据结构队列,FIFO) ; 并行 .

5.internal 线程池

internal线程池是J.U.C包下的FixedThreadPool,默认default 20

ExecutorService internalBlockingExec = Executors.newFixedThreadPool(
options.getInternalBlockingPoolSize()
,new VertxThreadFactory("vert.x-internal-blocking-"
,checker, true, options.getMaxWorkerExecuteTime()));

note: 内部使用的线程池,主要用来将阻塞代码异步化

5.初始化加载模块

//创建文件解析器,会创建一个 cache 目录,默认当前执行目录建立隐藏文件夹.vertx,
//使用 kill -15 <pid> 使进程触发ShutdownHook清理 cache目录文件和目录
fileResolver = new FileResolver(this, options.isFileResolverCachingEnabled()); /**
* 创建地址解析器,会读取/etc/resolv.conf DNS配置文件,
* resolv.conf手册地址:http://www.man7.org/linux/man-pages/man5/resolv.conf.5.html
*/
addressResolver = new AddressResolver(this, options.getAddressResolverOptions()); //创建部署Verticle管理器
deploymentManager = new DeploymentManager(this); //启用集群cluster,创建集群管理器
clusterManager = getClusterManager(options); //集群状态下创建HA管理器(高可用)
haManager = new HAManager(this, deploymentManager, clusterManager, options.getQuorumSize(), options.getHAGroup(), haEnabled); //创建并且启动事件总线,local和cluster模式实现不同
createAndStartEventBus(options, resultHandler); //创建sharedData实例,共享数据,local和cluster模式实现不同
sharedData = new SharedDataImpl(this, clusterManager); //创建抽象层的文件系统模块,AsyncFileImpl 依赖 java nio AsynchronousFileChannel
// private final FileSystem fileSystem = getFileSystem();
//不同操作系统call调用有兼容问题,最好开发环境和发布环境一致
Utils.isWindows() ? new WindowsFileSystem(this) : new FileSystemImpl(this) //初始化度量指标
metrics = initialiseMetrics(options);

5. static 块

static {
// 关闭netty的资源泄露器检查,有性能的一定开销
ResourceLeakDetector.setLevel(ResourceLeakDetector.Level.DISABLED);
// 默认使用 Jdk deflater/inflater
System.setProperty("io.netty.noJdkZlibDecoder", "false");
}

二、其它模块

//创建DNSclient
DnsResolverProvider provider = new
DnsResolverProvider(this,addressResolverOptions); //创建异步的httpClient,协议包括 HTTP_1_0 , HTTP_1_1 , HTTP_2 和 HTTPS
new HttpClientImpl(this, options); //创建httpServer, 默认协议协商版本 HTTP/2 , HTTP/1.1 , 支持 https
//(SNI:多证书单服务需要集成KeyCertOptions自己实现)
new HttpServerImpl(this, serverOptions); //创建tcp服务端,支持 tls
new NetServerImpl(this, options); //创建tcp客户端,支持 tls
new NetClientImpl(this, options); //创建udp服务
DatagramSocketImpl.create(this, options); //额外 CLI(command-line interface) , cli 模块

框图

REQUIRED MODEL

FREE MODEL

整体框图

Vertx.vertx()初始框图和模块的更多相关文章

  1. vertx实例的fileSystem文件系统模块

    初始化 //根据OS区分实现 System.getProperty("os.name").toLowerCase(); Utils.isWindows() ? new Window ...

  2. vertx模块HAManager高可用

    HAManager public HAManager(VertxInternal vertx, DeploymentManager deploymentManager, ClusterManager ...

  3. vertx模块DeploymentManager部署管理器

    DeploymentManager public DeploymentManager(VertxInternal vertx) { this.vertx = vertx; loadVerticleFa ...

  4. vertx.io 与nodejs 一个简单的性能比较

    vertx.io 与node 都是可以进行js运行的一个引擎,但是vertx 支持的语言相对于node 多,可以查看官网.今天下网上查询相关的信息 时来了解到vertx.io 性能比node 好,于是 ...

  5. vertx核心类之VertxImpl

    在Vert.x中,Vertx接口是最为重要的一个接口,vertx-core的基础功能都在此接口中提供.这篇文章中我们就来分析一下Vertx接口体系的内部实现以及创建流程.本文对应Vert.x的版本为  ...

  6. vertx简单客户端创建

    import java.util.HashMap;import java.util.Map; import com.yunva.vertx.test.vertproject.util.JsonUtil ...

  7. vertx简单服务创建

    import java.util.HashMap;import java.util.Map; import org.slf4j.Logger;import org.slf4j.LoggerFactor ...

  8. Kotlin & Vertx 构建web服务

    感想 Kotlin 是一门好语言,值得大家了解一下. Vertx 是一个好框架,也值得大家了解一下. Kotlin 写过js,也写过一点点go,主力一直是java.用了kotlin,貌似找到了常用语言 ...

  9. Kotlin Vertx

    Kotlin & Vertx Kotlin 是一门好语言,值得大家了解一下. Vertx 是一个好框架,也值得大家了解一下. Kotlin 写过js,也写过一点点go,主力一直是java.用了 ...

随机推荐

  1. chattr文件锁

    chattr文件锁 chattr 和lsattr [root@1 ~]# whereis chattr #---查看chattr命令 chattr: /usr/bin/chattr /usr/shar ...

  2. CodeForces 1151C Problem for Nazar

    题目链接:http://codeforces.com/problemset/problem/1151/C 题目大意: 有一个只存奇数的集合A = {1, 3, 5……2*n - 1,……},和只存偶数 ...

  3. 栈(LIFO)

    1 栈的定义 栈是限定在表尾进行插入和删除操作的线性表. 2 栈的特点 1)栈是特殊的线性表,线性表也具有前驱后继性: 2)栈的插入和删除操作只能在表尾即栈顶进行: 3)后进先出. 3 栈的实现及关键 ...

  4. luogu5316

    P5316 恋恋的数学题 题目背景 恋恋是个可爱的女孩子,最近她沉迷了做数学题. 题目描述 现在恋恋正在处理的题目十分简单:现在有k \space (2\leq k\leq 4)k (2≤k≤4)个数 ...

  5. [模板] 积性函数 && 线性筛

    积性函数 数论函数指的是定义在正整数集上的实或复函数. 积性函数指的是当 \((a,b)=1\) 时, 满足 \(f(a*b)=f(a)*f(b)\) 的数论函数. 完全积性函数指的是在任何情况下, ...

  6. python中self和cls的区别

    1.self表示一个具体的实例本身.如果用了staticmethod,那么就可以无视这个self,将这个方法当成一个普通的函数使用. 2.cls表示这个类本身. >>> class ...

  7. Spring MVC 使用介绍(五)—— 注解式控制器(一):基本介绍

    一.hello world 相对于基于Controller接口的方式,基于注解方式的配置步骤如下: HandlerMapping 与HandlerAdapter 分别配置为RequestMapping ...

  8. Spring MVC 使用介绍(十一)—— 跨域与静态资源访问

    一.跨域 服务端须在响应中添加相应响应头,从而允许跨域,具体可通过 public class CorsFilter extends OncePerRequestFilter { @Override p ...

  9. C. Multiplicity 简单数论+dp(dp[i][j]=dp[i-1][j-1]+dp[i-1][j] 前面序列要满足才能构成后面序列)+sort

    题意:给出n 个数 的序列 问 从n个数删去任意个数  删去的数后的序列b1 b2 b3 ......bk  k|bk 思路: 这种题目都有一个特性 就是取到bk 的时候 需要前面有个bk-1的序列前 ...

  10. 【CF1132F】Clear the String(动态规划)

    [CF1132F]Clear the String(动态规划) 题面 CF 题解 考虑区间\(dp\). 增量考虑,每次考虑最后一个字符和谁一起删去,然后直接转移就行了. #include<io ...