【Vert.x初体验1】4行代码实现HTTP Server

Vert.x 4 学习笔记-HttpServer接口使用介绍与原理详解 Vert.x 4.x中的HttpServer是构建高性能Web服务的核心组件,基于Netty的异步特性和事件驱动模型。文章从基础使用、核心配置、请求处理流程和底层原理四个维度详细解析:1)创建服务器实例、设置请求处理器和启动监听;2)网络层、SSL/TLS、HTTP/2和WebSocket等关键配置项;3)请求生命周期、路由匹配和流式处理机制;4)底层Netty集成原理及性能优化策略,包括连接复用、缓冲区管理和压缩设置。通过合理配置可构建高并发、低延迟的Web服务。 阅读详情

4行代码

上古时代的Java程序员如果想写一个HTTP服务,需要按下面的步骤操作:

  • 编写Servlet, 实现doXXX()方法
  • 打成war包
  • 部署Tomcat
  • 将war包copy到指定目录下进行"部署"
  • 访问8080

一顿操作猛如虎,旁边的小弟小妹对你佩服的五体投地。

我可能只是想说一句Hello World而已,需要这么装X么?

到了中古时代,事情变的更麻烦了。虽然不需要直接写servlet, 但为了正确配置好"春天"这个框架,我们要写一箩筐XML文件,一不小心写错Tomcat就会一堆Error。由此就诞生了"面向XML编程"的段子。

到了近代,我们终于可以直接在main()方法里写代码了,但是之前还需要引入一堆xxx-starter和spring boot的打包插件,这样才能做到打出的jar包可以执行运行。不过本质还是Servlet没变,只是框架帮你隐藏了而已,感觉还是少了那么点意思。

来到当下,Vert.x来拯救我们了!来看看一个最简单的HTTP Server长啥样:

Vertx vertx = Vertx.vertx(); // (1)
vertx.createHttpServer() // (2)
      .requestHandler(req -> req.response().end("it works!")) // (3)
      .listen(8080); // (4)

只需要4行代码!而且,你不需要继承xxx-parent, 更不需要xxx-starter, 你只需要在pom.xml中添加一个依赖就搞定了:

<dependency>
    <groupId>io.vertx</groupId>
    <artifactId>vertx-web</artifactId>
    <version>3.5.4</version>
</dependency>

长久以来,很多人都一直在指责Java"又臭又长", 开发速度慢,运行时笨重,Tomcat更重,IDE难用(主要指Eclipse)等槽点,当然,他们说的都没错,错就错在Servlet。Servlet在当时(2001年)的编程环境下确实起到了Web开发大一统的作用,但慢慢的很多躁动的程序员们就会不满这种呆板笨重编程方式。好了扯远了,我们先来看看上面的几行代码都干了什么:

(1): 构造一个Vertx对象,这里暂时没什么好说的

(2): 创建了一个HttpServer对象

(3): 注册一个请求处理器,这里我们无论什么请求,只要来了就返回一个"it works!"字符串

(4): 让Server在8080端口上监听

是不是非常的直观?

我知道,做为一个有上进心的开发者,我们怎么能不关心你这几行代码能抗多少请求呢?业务代码写在哪?错误处理?先不要着急,以后会讲到的,这里只是想告诉大家,用Java写Http Server,其实还有更优雅的方式。

Verticle

Verticle是Vert.x里最重要的概念。之前我们在准备篇《C10K问题与Reactor模式》中讲过什么是Reactor, 这里的Verticle其实就是Reactor的一个实现,即事件循环。 只不过,Vert.x有一个"部署"的概念,每一个Verticle需要先进行部署,且Vert.x保证一个Verticle在整个Vertx生命周期内一定只由同一条线程来执行,这样就避免了线程安全问题。等等,这说的好像跟Netty里的EventLoop有点像?对,事实是,Vert.x底层就是Netty, Verticle直接就是使用Netty的EventLoop执行的。可能有人会问,为什么不直接用Netty? 哦,如果想用Netty的话,可以先去看看官网的Hello World需要多少行代码吧。

下面我们来看一下一个比较"正常"的Vert.x HTTP Server应该怎么写:

VertxOptions options = new VertxOptions();
        options.setEventLoopPoolSize(8);
        Vertx vertx = Vertx.vertx(options); // (1)

        DeploymentOptions depOps = new DeploymentOptions();
        depOps.setInstances(8);
        vertx.deployVerticle(HttpVerticle.class, depOps, ar -> { // (2)
            if (ar.succeeded()) {
                System.out.println("done deployment");

            } else {
                System.out.println(ar.cause());
            }
        });

(1): 我们在创建Vertx对象时设置了一个参数对象,把事件循环线程数设为8

默认值为 CPU核心数 * 2, 我用的是物理4核的macbook pro, 这里如果不设置会是16,因为有超线程技术加持。

(2): 这块可能看起来比较复杂,其实非常简单。前面说过Verticle需要部署,那么这就是编程式部署的代码了。调用deployVerticle()方法,第一参数是我们想要部署的Verticle对象本身(下面会给出代码); 第二个参数是部署参数,这里我们设置部署8个Verticle; 第三个参数用来注册一个回调方式,部署完成或失败时Vert.x会使用NIO线程调用此方法。

在Vert.x里会经常看到这种异步回调的方式,类似于Node.js, 前期需要适应一下。

接下来看看主解HttpVerticle长什么样:

 public static class HttpVerticle extends AbstractVerticle { // (0)
        @Override
        public void start(Future<Void> startFut) throws Exception {
            vertx.createHttpServer()
                    .requestHandler(req -> req.response().end("it works!"))
                    .listen(8080, result -> { // (1)
                        if (!result.succeeded()) { // (2)
                            System.out.println("failed to start server, msg = " + result.cause());
                            startFut.fail(result.cause()); // (3)
                        }
                    });
        }
    }

对,基本上就是之前我们的4行代码。

(0): 我们需要继承AbstractVerticle来编写自己的Verticle

(1): 监听8080端口也需要注册一个回调方法,这样才能知晓是否监听成功。

(2): 判断是否发生了错误

(3): 如果出错,调用方法参数中传过来的Future对象的fail()方法,作用是通知Vertx这个Verticle启动失败了,这样上面deployVerticle()中注册的回调里的失败逻辑才会被调用。

这里有朋友肯定会想,EventLoopPoolSize跟verticle的Instances到底应该设置多少合适呢?前面说了,一个Verticle总是由同一条NIO线程执行,如果NIO线程数与verticle数相同,那么Vertx会保证每一个verticle都会有一条专有线程执行;如果NIO > verticle, 那么会有NIO线程空闲; 如果 NIO < verticle, 那么会出现一个NIO线程负责执行多个verticle的情况。这里要注意的是,第三种情况也不会有线程安全问题,因为一个verticle还是总是由同一条线程执行的。

着急的程序员可能已经不满足于上面这种Hello World玩具代码了,他们想尽快把自己的业务代码塞进去。如果想发挥异步编程的全部实力,那么业务代码必须也要"异步"起来,即所有的阻塞调用,都要通过注册事件–>回调的方式执行,万万不可阻塞NIO线程。说白了,就是争取让NIO线程一直在干需要CPU发力的活,一刻也不能因为等待I/O而停下来。应该怎么办呢,下期再说。

simple-vertx-proxy-example:展示如何使用 Vert.x 3.0.0-SNAPSHOT 实现 HTTP 代理服务器的简单示例 Vert.x 代理示例 先决条件 Maven >= 3.0 Java >= 1.8 用于 core/apex/codetrans 的 Vert.x 'master' 分支的当前快照 跑步 mvn clean package exec:java 测试 运行后,此应用程序侦听端口 8080 并将请求代理到 curl http://localhost:8080/r/java 立即下载

相关推荐

Vert.x的Http和TCP实战

Vert.x系列: Vert.x介绍:https://blog.csdn.net/haoranhaoshi/article/details/89279096 Vert.x实战一:Vert.x通过Http发布数据:https://blog.csdn.net/haoranhaoshi/article/details/89284847 Vert.x实战二:TCP通信:https://blog.csdn.net/haoranhaoshi/article/details/89296522 Vert.x实战三:TCP客户端之间以角色通过服务端转接通信:https://mp.csdn.net/postedit/89296606 Vert.x实战四:TCP客户端之间以角色和同一角色连接顺序通过服务端转接通信:https://blog.csdn.net/haoranhaoshi/article/details/89296665 Vert.x实战五:TCP客户端之间以ID通过服务端转接通信:https://blog.csdn.net/haoranhaoshi/article/details/89296754 Vert.x实战六:TCP客户端之间以功能名通过服务端转接通信:https://blog.csdn.net/haoranhaoshi/article/details/89296841 Vert.x实战七:TCP设置超时断开:https://blog.csdn.net/haoranhaoshi/article/details/89296986 Vert.x的TCP服务端和客户端配置:https://blog.csdn.net/haoranhaoshi/article/details/89297022 --------------------- 作者:风铃峰顶 来源:优快云 原文:https://blog.csdn.net/haoranhaoshi/article/details/89296606 版权声明:本文为博主原创文章,转载请附上博文链接!

Vert.x(vertx) 创建HTTP服务

Vert.x底层通信框架依赖于Netty,并封装了对Http协议的支持,因此可以非常方便的进行Web开发,且不依赖于任何中间件。笔者所在的公司老系统使用的是SSM架构的项目,部署在Weblogic上,每年花在中间件上的钱就非常多,现在全面改造为Vert.x,中间件的费用直接就省了。另外不依赖中间件,编程会变得非常灵活,定制性非常强,安全性也会得到一定层度的提高。 对于实现一个简单的web服务,有...

happyfly的博客 1万+

Vert.x 4 核心手册中文版

Vert.x 内核小巧轻便. 你只需使用你想要的部分. 它还可以完全嵌入到您现有的应用程序中--我们不会强迫您以特殊的方式构建应用程序,以便您可以使用 Vert.x. Vert.x核心为以下事情提供功能: 编写TCP客户端和服务器 编写HTTP客户端和服务器,包括对WebSockets的支持 事件总线 共享数据 - -本地映射和集群分布式映射 周期性和延迟动作 部署和取消部署Verticles 数据报套接字 DNS客户端 文件系统访问 高可用性 本地传输 集群

vertx访问html,Vert.x HTTP 服务器与客户端

编写HTTP 服务器与客户端Vert.x让编写非阻塞的HTTP 服务器与客户端变得非常轻松。创建HTTP 服务器缺省状况:HttpServer server = vertx.createHttpServer();配置HTTP 服务器HttpServerOptions options = new HttpServerOptions().setMaxWebsocketFrameSize(1000000...

weixin_42162171的博客 797

HAL库STM32CubeMX+DHT11温湿度传感器模块化驱动与OLED显示实战

本文详细介绍了基于HAL库和STM32CubeMX开发DHT11温湿度传感器模块化驱动的实战过程。通过精确的时序控制和模块化封装,实现了传感器数据采集,并结合OLED显示模块实时展示温湿度信息,为嵌入式开发者提供了完整的解决方案。

h6j7k8l9p0的博客 1131

基于分段线性近似的Softmax硬件加速器设计

本文深入探讨了基于分段线性近似的Softmax硬件加速器设计。针对深度学习模型中Softmax函数在硬件实现时指数运算成本高昂的问题,提出用分段线性拟合替代传统泰勒展开,通过一次乘加操作高效完成计算,并详细分析了输入范围压缩、精度与硬件资源权衡、以及包含地址生成、参数查找、乘加计算和归一化的完整硬件架构。该方法在保证精度的同时,显著提升了AI边缘芯片的推理速度和能效。

weixin_28278377的博客 312

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

在Vert.x 创建HTTP服务 中我们已经创建了一个简单的HttpServer,但这个HttpServer比较低级,对于请求参数解析、Session等常用功能都需要我们通过编码实现,也就是要重复造轮子,非常不方便。 Vert.x提供了Web开发组件vertx-web,提供了一堆Web开发中常用的功能。比如参数封装,路由,国际化,认证和授权,session和cookie以及模板等,可以非常方便的...

happyfly的博客 2万+

lerobot VLA--SmolVLA代码的讲解

2.图像resize至正方形224x224,图像长宽比不变,其他区域用黑色补充,标记为mask=1,若占位图像(摄像头缺失),则 创建全-1像素的占位图像 标记为mask=0,image为[1, 3, 512, 512],img_mask为True,masks列表长度为2,img_masks为2,因为我这里两个相机。文本嵌入:通过embed_language_tokens() 被转换为嵌入表示,lang_emb 是语言的嵌入,包含了语言的语法和语义信息。1.像素值[0,1]->[-1,1]

caokaifa的博客 4064

聊聊PowerJob的RemoteEngine

本文主要研究一下PowerJob的RemoteEngine。

go4it 329

Claude Code、Codex、Gemini CLI、OpenCode 和 OpenClaw 配置管理太麻烦?试试这个统一管理工具

还在为 Claude Code、Codex、Gemini CLI 等 AI CLI 配置烦恼?🤯 这款桌面工具支持五大助手统一管理,一键切换 50+ 服务商,MCP 和 Skills 集中管理 🛠️,跨平台支持,让你的 AI 编程更高效 ⚡

XiaoqiangClub的博客 912

独家开源|RK3588 平台 YOLOv5 Android 源码级解析:NPU 量化、多线程与目标跟踪实战

本文将带你完成一个完整的AI视觉项目:在搭载RK3588芯片的Android开发板上运行实时目标检测与跟踪应用。实战目标:成功运行官方YOLOV5摄像头实时检测案例技术深度:深入理解RKNN开发框架和源码实现核心技能:掌握NPU推理、多线程并发、目标跟踪等关键技术。

m0_71589036的博客 193

Vert.x(vertx) 实现TCP服务

对于Java开发人员,想要实现一个http服务,非常简单,写个servlet,打成war包,放到tomcat下就能运行。但如果要实现一个tcp服务就没那么简单了,因为tcp是传输层协议,并不像http那样,有类似tomcat的中间件给我们封装底层的网络协议,封装线程的交互。要实现一个tcp服务,只能自己动手处理网络和线程问题,这是非常考验编程功底的事情,而且如果团队人员素质不高,项目周期要求较短的...

happyfly的博客 1万+

【100%通过率】华为OD机试真题 Python 实现【网上商城优惠活动 / 模拟商场优惠打折II】

某网上商场举办优惠活动,发布了满减、打折、无门槛3种 优惠券,分别为: 1:每满100元优惠10元,无使用数限制,如100~199元可以使用1张减10元,200~299可使用2张减20元,以此类推; 2:92折券,1次限使用1张,如100元,则优惠后为92元, 3:无门槛5元优惠券,无使用数限制,直接减5元。

MISAYAONE的博客 9369

tomcat老运行之前错代码_【Vert.x初体验】4行代码实现HTTP Server

4行代码上古时代的Java程序员如果想写一个HTTP服务,需要按下面的步骤操作:编写Servlet, 实现doXXX()方法打成war包部署Tomcat将war包copy到指定目录下进行"部署"访问8080一顿操作猛如虎,旁边的小弟小妹对你佩服的五体投地。我可能只是想说一句Hello World而已,需要这么装X么?到了中古时代,事情变的更麻烦了。虽然不需要直接写servlet, 但为了正确配置好...

weixin_39849894的博客 103

爬虫进阶必备:深入理解requests.Session(),提升爬虫效率与稳定性

前两天,有个朋友跟我吐槽,说自己写了个爬虫爬取某个电商网站的商品信息,刚开始跑得好好的,爬了大概几百页之后,突然就开始报错了。HTTP状态码一会儿429,一会儿403,最离谱的是有些页面明明登录了却显示未登录状态。他排查了半天也没找到原因,最后把代码发给我看。 我扫了一眼代码,发现一个典型问题:他每次请求都新建一个requests.Session(),甚至有些请求直接用了requests.get()。这就好比每次进超市都要重新注册会员,每次都重新跟服务器“握手”,不翻车才怪。 其实,这就是我们今天要聊的

2201_76125261的博客 1227

贝叶斯(Bayes)决策理论

在博文【模式识别PR和模式的概念】介绍了相关的模式识别与模式的概念。在本节描述所要讨论的问题之前,再提一下对于待识别的物理对象的描述问题。假设一个待识别的物理对象用其d个属性观察值描述,称之为d个特征,这组成一个d维的特征向量,而这d维待征所有可能的取值范围则组成了一个d维的特征空间。一般地,机器实现自动分类有两大类方法:一种是模板匹配方法,另一种是对特征空间划分为子空间(每类的势力范围)的方法。

松子茶的专栏 3万+

Vert.x Java开发指南——第四章 重构为Vert.x服务

第四章 重构为Vert.x服务 与我们最早的实现相比,前面的重构已经是向前一大步,因为我们提取出了独立且可配置的Verticle,并且在事件总线之上使用异步消息进行链接。我们还看到,我们可以同时部署一个指定Verticle的几个实例,以便更好地处理负载以及更好地利用CPU内核。 在这一节,我们将看到如何设计和使用Vert.x服务。服务的主要优势是,它定义了一个接口用于执行Verticle公开的...

边城白衣的博客 3388

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

# vert.x学习笔记

标签: 技术架构1. 自定义启动文件server.groovy分析(用到的vertx方法) use GroovyShell to execute scripts to extend chain handler new GroovyShell(binding, compileConf) 设置定时任务 vertx.setPeriodic(interval) 启动httpserver v

u010943460的专栏 3820

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Vert.x网络编程实战:HTTP、TCP与WebSocket

Vert.x网络编程实战:HTTP、TCP与WebSocket 【免费下载链接】vert.x Vert.x is a tool-kit for building reactive applications on the JVM 项...

gitblog_00300的博客 617

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

基于 Java + Vert.x实现简易的RPC 框架

本篇文章主要是用Java和Vert.x设计一个简易版本的RPC框架什么是RPC框架RPC(Remote Procedure Call),即远程过程调用,是一种远程通信协议,允许程序在不同计算机之间进行通讯和交互的机制或方法,可以通过网络从远程计算机程序上请求服务,而客户端不需要了解底层网络技术的细节。RPC框架的主要目的是让远程服务调用看起来像是本地调用一样简单和透明。RPC的主要特点:透明性:RPC 提供了一种透明的方式来进行远程调用,使客户端能够像调用本地函数一样调用远程服务。

hy040812的博客 1149

Vert.x 与Springboot集成

众所知周,Vert.x是一个异步无阻塞的网络框架,其参照物是node.js。基本上node.js能干的事情,Vert.x都能干。Vert.x利用Netty4的EventLoop来做单线程的事件循环,所以跑在Vert.x上的业务不能做CPU密集型的运算,这样会导致整个线程被阻塞。 Springboot是应用非常广泛的java快速开发框架,它提供了与数据库,websocket,消息系统等等各种集成。 业务中已经使用了springboot,如果又有需要使用vert.x,最好是将这两者集成,而不是Vert.x单独作

m0_67400973的博客 1254

Vert.x服务网格探索:Istio与Vert.x微服务集成方案

在现代微服务架构中,服务网格已成为构建可靠、可观测且安全分布式系统的关键组件。本文将深入探讨如何将流行的服务网格解决方案Istio与Vert.x微服务框架相结合,为你的微服务应用提供强大的服务治理能力。Vert.x是一个高性能的异步应用框架,特别适合构建响应式微服务系统,而Istio则提供了服务间通信的完整解决方案。 [![Vert.x微服务架构](https://raw.gitcode.com

gitblog_00420的博客 434

Vert.x Java开发指南——第三章 重构为独立可重用的Verticle

第三章 重构为独立可重用的Verticle 版权声明:本文为博主自主翻译,转载请标明出处。 https://blog.csdn.net/elinespace/article/details/80377709 相应的代码位于本指南代码仓库的step-2目录下 通过第一次迭代,我们得到了一个可工作的Wiki应用。然而它的实现存在以下问题: HTTP请求处理和数据库访问代码交织在相...

边城白衣的博客 3369

Vert.x 之 HelloWorld

本文将会建立一个基本的HTTP服务器,并监听8080端口,对于任何发往该服务器以及端口的请求,服务器会返回一个Hello World字符串。 首先新建一个Maven项目,一个基本的Maven项目目录结构如下所示: ├── pom.xml ├── src │ ├── main │ │ ├── java │ │ └── resources │...

weixin_30783913的博客 135

OAuth2身份认证实战:Vert.x微服务安全架构设计与实现

在当今微服务架构盛行的时代,**身份认证与授权**已成为保障系统安全的核心环节。Vert.x Blueprint Micro-Shop项目为我们展示了一个完整的**OAuth2身份认证**解决方案,通过**Keycloak身份服务器**实现了企业级的微服务安全架构。本文将深入解析如何在Vert.x微服务中实现**OAuth2安全认证**,为开发者提供实用的**微服务安全设计**指南。 ## 🛡

gitblog_01009的博客 677

Vert.x开发指南

Vert.x开发指南作者:chszs,转载需注明。博客主页:http://blog.csdn.net/chszs一、介绍Vert.x是一个异步应用程序开发框架,可用于开发异步、可伸缩、高并发的Web应用。其目的在于为JVM提供一个Node.js的替代方案。开发者可以通过它使用JavaScript、Ruby、Groovy、Java,甚至是混合语言来编写应用。使用Vertx.x框架,可以用JavaSc

chszs的专栏 2万+
上一篇: 比较两个大文本文件的差异并输出增量和减量
下一篇: 使用Vert.x + SpringBoot编写业务系统
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值