# vertx-demo **Repository Path**: t0mZ/vertx-demo ## Basic Information - **Project Name**: vertx-demo - **Description**: vertx demo - **Primary Language**: Java - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 3 - **Forks**: 0 - **Created**: 2019-12-26 - **Last Updated**: 2022-08-05 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README vertx - vertx是reactive模式事件驱动(event loop)的非阻塞框架, 支持多种语言实现, 目标是使reactive应用编写更简单. 提供了许多模块用于集成使用. 功能十分强大, 可以轻松实现web微服务/集群高可用/消息/授权认证等. 主要应用场景为io密集型, 对于计算密集型应用不适合使用. #### 核心 - vertx ```text vertx实例是vertx应用的核心, 一般一个应用只需要一个vertx实例, 也可以根据需要创建多个,多个实例通过event bus通信. vertx提供了VertxOptions和DeploymentOptions类来实现vertx的配置. vertx是基于事件驱动模式的框架, 核心体现:don't call us, we'll call you. 任何事件触发时将会有事件处理器处理. vertx实例维护多个event loop, 默认具体根据cpu核心决定,也可以手动配置重写. ``` - 黄金法则: don't block(不要阻塞执行) ```text vertx api本身没有任何操作会阻塞线程执行, 可以通过少量的线程实现高并发应用. 所以, 编写代码不应阻塞线程执行,当应用的操作阻塞超过几秒后,vertx会打印警告信息(可以通过VertxOptions配置关闭). 尽可能的不要在handler中处理过于耗时的操作. 将会导致event loop阻塞,影响其他事件分发. ``` - Verticles ```text verticle是一个简单 可伸缩 类actor模型的并发模型, 可以使用该模型编写自己的verticle, 继承AbstractVerticle. verticle通过vertx实例部署和启动, vertx实例默认维护N(cpu * 2)个event loop, 同一个vertx实例支持部署多个不同语言 实现的多个verticle, 一个应用其实就是多个verticle运行在同一个vertx上的集合, 不同的verticle之间通过event bus通信. verticle类型: 1. standard 类型, 最常用的类型, 所有handler执行使用同一个event loop线程池, 且同一时间只会有一个线程在执行,所以不存在竞争问题(默认) ,上下文: EventLoopContext基于NettyEventLoop实现 2. worker 类型, 使用worker pool中的线程, 实例执行同一时间只会使用一个线程(通过DeploymentOptions的setWork(true)启用该类型), 上下文: WorkerContext基于ExecutorService的实现 3. multi-threaded worker 类型, 使用worker pool中的线程,实例同时通过多线程并行执行. 该类型被设计用于同时消费event bus中的消息 , 像vertx clients/servers(tcp/http..)不能在该类型中创建, 否则报错.(除了2中的设置,额外设置workPoolSize instance配置), 上下文: 继承自WorkerContext context 上下文, vertx创建时创建, 与event loop绑定, 最终的verticle执行环境就是context, 在verticle内执行的方法最终都会在context中执行, 因为context与event-loop的绑定关系,所以在一个verticle内执行的handler最终都是在相同event-loop. verticle类型分别对应着不同的context实现 ``` - Event Bus ```text vertx的事件总线, 相当于vertx的神经系统. 每个vertx实例对应一个event bus, 通过event bus可以实现应用不同部分之间的消息通信, 无论是否在同一个vertx实例还是多个vertx实例(集群), 不同语言实现的 vertx间也是可以的. event bus事件总线是多服务器间分布式端到端消息系统. 支持 pub/sub point2point request-response模式消息通信. 基本的使用包含注册handler, 移除handler, send\publish消息 组成: - Addressing 通信地址,就是一个字符串, 没有schema要求, 任何有效的字符串都可以使用, 比如: a.b.c - Handlers 消息处理器, 注册到addressing上, 用于处理消息, 多个handler可以注册到同一个addressing, 一个handler也可以注册到多个地址. - pub/sub 发布订阅模式, 发布的消息会被注册到该地址的所有handler接收到 - p2p / req-resp 点对点/请求响应模式, 消息发布到某个地址, 只会被路由到注册的handler中的一个, 多个handler默认采用round-robin模式, 接收到消息后可以选择回复给发布者(request-response模式), 发布者在发送其他消息, 相当于一个对话可以一直延续. - message 消息类型, 允许任何原始的或简单的消息类型,例如: json\string\buffer等, 推荐使用json, 此外支持codec,对消息进行encode/decode操作. 消息顺序与发送顺序相同 对于消息投递, vertx会尽最大可能投递, 但是如果event bus部分失败或者失败也会导致消息丢失, 如果不允许丢失, 需要自己实现错误重试机制. ``` #### 命令行参数 命令行参数支持vertx(需下载),和java -jar(需要使用Launcher启动vertx) - vertx.cacheDirBase 、 vertx.disableFileCaching ```text vertx 可以对文件系统文件进行读写操作,还有classpath中的资源文件css/html/js等。为了提高读取性能,vertx会将读取的文件缓存到一个文件夹,后续直接从缓存中获取。 默认缓存在启动命令执行所在的目录.vertx文件夹内,可以指定缓存位置:java -jar my-fat.jar vertx.cacheDirBase=/tmp/vertx-cache 但是当编写css、js、html等资源文件时,会导致一直使用缓存无法使用最新的文件,此时可以禁用-Dvertx.disableFileCaching=true,该参数指定文件每次都更新缓存,使用最新的原文件。 每次更新缓存会牺牲一些性能,用于开发环境。 ``` #### 参考 - [vertx-doc](https://vertx.io/docs/) - [java-manual](https://vertx.io/docs/vertx-core/java/)