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

本指南介绍如何使用Vert.x构建响应式应用,包括异步网络应用的基本API、事件总线通讯、微服务架构等内容。

第一章 介绍

版权声明:本文为博主自主翻译,转载请标明出处。 https://blog.csdn.net/elinespace/article/details/80373294

该指南是Vert.x异步编程的一个入门介绍,主要针对那些熟悉主流、非异步Web开发框架和库(如Java EE、Spring)的开发者。

1.1 关于该手册

我们假定读者已经熟悉Java编程语言及其生态系统。

我们将以一个Wiki Web应用作为开始,它开始采用关系数据库和服务端页面渲染;然后我们通过几个步骤逐步演进该应用,直到它成为一个现代的单页应用,并且拥有实时Web的特征【注意,术语“实时”在Web技术环境中的广泛使用不应与专业操作系统中的硬或软实时混淆】。在这个过程中,你将学会:

  1. 设计一个Web应用,它通过模板进行服务端页面渲染,并且使用关系型数据库持久化数据。
  2. 清晰的隔离每个技术组件,使之成为一个可复用的事件处理单元,称为verticle。
  3. 为了方便Verticle设计,而抽取Vert.x服务。Verticle可以在同一个JVM进程中或集群中的分布式节点之间无缝通讯。
  4. 测试异步操作代码。
  5. 与公开HTTP/JSON Web API的第三方服务集成。
  6. 公开HTTP/JSON Web API。
  7. 采用HTTPS的安全和访问控制,针对Web浏览器会话的用户认证以及针对第三方客户端应用的JWT Token。
  8. 通过流行的RxJava库及其相关的Vert.x集成,采用响应式编程重构部分代码。
  9. 采用AngularJS的单页应用的客户端编程。
  10. 基于SockJS,使用统一Vert.x事件总线集成的实时Web编程。

该文档和示例代码的源文件位于https://github.com/vert-x3/vertx-guide-for-java-devs。我们欢迎问题报告、反馈和Pull Request。

1.2 什么是Vert.x

Eclipse Vert.x是一个基于JVM构建响应式应用的工具包。
——Vert.x网站

Eclipse Vert.x(接下来的文档中我们仅称为Vert.x)是Eclipse基金会下的一个开源项目。Vert.x于2012年由Tim Fox发起。

Vert.x不是一个框架,而是一个工具包:它的核心库定义了编写异步网络应用的基本API,你可以为应用程序选择有用的模块(如数据库链接、监控、认证、日志、服务发现、集群支持等)。Vert.x基于Netty项目——一个基于JVM的高性能异步网络库。如果需要,Vert.x允许你访问Netty内部,但是通常情况下你会受益于Vert.x提供的高级API,而且与原始Netty相比并不牺牲性能。

Vert.x不强制要求打包方式或者构建环境。由于Vert.x Core本身只是一个普通的JAR库,所以它可以嵌入到应用程序内部,无论这些应用是打包为一组JAR、一个包含所有依赖的单独的JAR、或者即使被部署到流行的组件和应用容器。

由于Vert.x设计用于异步通信,因此它可以处理更多的并发网络连接,且比诸如Java Servlet或者java.net.socket类等同步API使用更少的线程。Vert.x可以用于广泛的应用程序:大容量消息/事件处理、微服务、API网关、移动应用HTTP API,等。Vert.x及其生态提供了构建端到端响应式应用的各种技术工具。

尽管可能听起来Vert.x只适用于要求苛刻的应用,本指南同样说明Vert.x对于更多传统的Web应用也工作良好。正如我们将看到的,代码将保持相对容易理解,但是,如果应用程序需要面对流量的突然峰值,那么代码已经使用可扩展的基本组件编写:事件的异步处理。

最后,值得一提的是,Vert.x是多语言的,它支持广泛的流行的JVM语言:Java、Groovy、Scala、Kotlin、JavaScript、Ruby及Ceylon。当Vert.x支持一种语言时,它的目标并不只是提供访问API,还要确保在每种目标语言中,特定语言的API是符合语言习惯的(如,使用Scala future替换Vert.x future)。使用不同的JVM语言开发Vert.x应用程序的不同技术部分是非常有可能的。

1.3 Vert.x核心概念

在Vert.x中有两个关键的概念需要学习:

  1. 什么是Verticle
  2. 事件总线如何让Verticle之间通讯

1.3.1 线程和编程模型

许多网络库和框架依靠一个简单的线程策略:每个网络客户端在链接时被分配一个线程,这个线程处理这个客户端的请求,直到链接断开。这是Servlet以及使用java.io和java.net包编写网络代码的情况。虽然这种“同步I/O”线程模型具有简单易懂的优点,但是当存在太多并发链接时,它会损害可伸缩性,因为系统线程并非廉价,并且在高负载的情况下,操作系统内核在线程调度管理上花费显著的时间。在这种情况下,我们需要转移到“异步I/O”,Vert.x则为“异步I/O”提供了坚实的基础。

Vert.x中的部署单元称为Verticle。一个Verticle通过一个事件循环(EventLoop)处理接收到的事件,这些事件可以是任何事情,如接收网络缓冲、调度事件或由其它Verticle发送的消息。事件循环(EventLoop)是异步编程模型中是特有的:
这里写图片描述
每个事件应在合理的时间内进行处理,以免阻塞事件循环(EventLoop)。这意味着当在事件循环(EventLoop)中执行时,不能进行线程阻塞操作,类似在一个GUI中处理事件(如通过执行一个缓慢的网络请求可以冻结Java/Swing界面)。如我们在本指南接下来看到的,Vert.x在事件循环(EventLoop)的外部提供了处理阻塞操作的机制。在任何情况下,事件循环(EventLoop)执行事件的时间过长时,Vert.x会在日志中输出警告,这是可配置的,以满足特定应用需求(如当工作于较慢的IoT ARM板时)。

每个事件循环(EventLoop)连接到一个线程。默认情况下,Vert.x为每个CPU内核线程赋予2个事件循环(EventLoop)。这直接导致了常规的Verticle总是在同一个线程中处理事件,因此不需要使用线程协调机制来操作Verticle状态(如Java类属性)。

Verticle可以被传递一些配置信息(如证书、网络地址等),而且Verticle可以被多次部署:
这里写图片描述
到达的网络数据从接收线程中接收,然后作为事件被传递给相应的Verticle。当一个Verticle打开了网络服务器并且被部署了多次时,那么事件会按照轮询的方式分发到Verticle实例,这对于在大量并发网络请求时最大化CPU使用率是非常有用的。最后,Verticle拥有一个简单的启动/停止生命周期,Verticle可以部署其它Verticle。

1.3.2 事件总线

在Vert.x中,Verticle构成了代码部署的技术单元。Vert.x事件总线是在不同Verticle之间通过异步消息传递进行通讯的主要工具。例如,假设我们有一个Verticle用于处理HTTP请求,一个Verticle用于管理数据库访问。事件总线允许HTTP Verticle发送一个请求到数据库Verticle,执行一个SQL查询,并响应HTTP Verticle:
这里写图片描述
事件总线允许传递任何类型的数据,然而JSON是首选的交换格式,因为它允许不同语言编写的Verticle之间进行通讯,并且更一般地,JSON是一种流行的通用半结构化数据封送处理文本格式。

消息可以发送到任意自由字符串组成的目的地。事件总线支持以下通讯方式:

  1. 端到端的消息
  2. 请求——响应消息
  3. 发布/订阅用于广播消息

事件总线允许Verticle之间透明的通讯,不只是在同一个JVM进程中:

  • 当网络集群启动时,事件总线是分布式的,因此消息可以被发送到运行于其它应用节点的Verticle。
  • 事件总线可以通过一个简单的TCP协议访问,以便第三方应用进行通讯。
  • 事件总线还可以通过通用消息桥公开(如AMQP、Stomp)。
  • SockJS桥接允许Web应用通过运行在浏览器中的JavaScript与事件总线无缝通讯,与任何Verticle一样接收与发布消息。
内容概要 本资源是一套完整可运行的 Qt Widgets 批量图片压缩桌面工具源码,基于 Qt5/C++ 从零开发,专为初学者设计,分步实现图片批量处理全套功能。工具支持多选单张图片、直接读取整个文件夹内所有 JPG/PNG 图像,可自定义输出图片分辨率、调节 JPG0~100 区间压缩质量,自带锁定宽高比防拉伸变形功能;批量处理完成后自动统计每张图片压缩前后文件体积,计算整体压缩缩小比例,直观展示压缩效果。 适用人群 Qt/C++ 零基础初学者,学习 QImage 图像绘图、文件目录遍历、UI 交互开发; 需要本地批量处理图片的办公、设计、自媒体从业者; 想要学习图片缩放、JPG 压缩、本地文件 IO、进度条交互的开发学习者。 使用场景 自媒体批量压缩配图,降低图片体积节省上传流量; 摄影、设计批量统一图片尺寸,批量轻量化相册图片; 程序开发学习:QFileDialog 文件选择、QDir 文件夹遍历、QImage 缩放保存、QSlider 参数联动、批量循环界面防卡顿、文件大小格式化转换全套 Qt 图像开发实战案例。 工具核心功能清单 双模式导入图片:手动多选单张图片 / 一键读取整个文件夹全部图片; 自定义输出宽高分辨率,支持锁定原始宽高比,避免图片拉伸变形; 滑块调节 JPG 压缩质量 0~100,平衡图片清晰度与文件占用大小; 自定义输出保存目录,批量生成压缩后的图片文件; 实时进度条展示处理进度,循环中刷新界面,程序不会假死卡顿; 自动统计每张图片压缩前后体积,换算 KB/MB 直观展示; 批量完成弹窗汇总:图片总数、成功数量、单张大小对比、整体压缩节省空间比例; 完整模块化代码,功能拆分清晰,每段代码附带详细注释,新手可分步拆解学习。 其他说明 开发环境:Qt Creator + Qt5.15 MSVC,Windows 平台可直接编译运行; 源码结构清晰,功能
Trivy(发音)是一款全面且多用途的安全扫描工具。Trivy 配备了用于检测安全问题的扫描器,以及可发现这些问题的目标对象。 目标对象(Trivy 可扫描的内容): 容器镜像 文件系统 Git 仓库(远程) 虚拟机镜像 Kubernetes 扫描器(Trivy 可在目标对象中发现的内容): 正在使用的操作系统软件包和软件依赖项(SBOM) 已知漏洞(CVE) IaC 问题和配置错误 敏感信息和密钥 软件许可证 Trivy 支持大多数主流编程语言、操作系统和平台。完整列表请参见[扫描覆盖范围]页面。 要了解更多信息,请访问 Trivy 主页 了解功能亮点,或访问 文档站点 获取详细信息。 快速开始 获取 Trivy Trivy 可通过大多数常见的分发渠道获取。完整的安装选项列表请参见[安装]页面。以下是一些常用示例: brew install trivy docker run aquasec/trivy 从 https://github.com/aquasecurity/trivy/releases/latest/ 下载二进制文件 更多方式请参见[安装] Trivy 已与许多流行平台和应用程序集成。完整的集成列表请参见[生态系统]页面。以下是一些常用示例: GitHub Actions Kubernetes operator VS Code 插件 更多方式请参见[生态系统] 预览版构建 每次推送到主分支时,都会生成预览版构建(Docker Hub、GitHub、ECR 镜像以及 二进制文件)。 请注意:预览版构建可能存在严重错误,因此不建议在生产环境中使用。 基本用法 trivy <target> [--scanners <scanner1,scanner2>] <subject> 示例: trivy image python:3.4-alpine
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值