惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

V
Visual Studio Blog
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
N
Netflix TechBlog - Medium
博客园 - 叶小钗
大猫的无限游戏
大猫的无限游戏
S
SegmentFault 最新的问题
V
V2EX
IT之家
IT之家
J
Java Code Geeks
Hacker News - Newest:
Hacker News - Newest: "LLM"
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
GbyAI
GbyAI
D
Docker
S
Secure Thoughts
Recent Announcements
Recent Announcements
Webroot Blog
Webroot Blog
Application and Cybersecurity Blog
Application and Cybersecurity Blog
云风的 BLOG
云风的 BLOG
博客园_首页
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
Security Archives - TechRepublic
Security Archives - TechRepublic
酷 壳 – CoolShell
酷 壳 – CoolShell
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
N
News | PayPal Newsroom
S
Security @ Cisco Blogs
I
InfoQ
Last Week in AI
Last Week in AI
SecWiki News
SecWiki News
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
W
WeLiveSecurity
T
Troy Hunt's Blog
Recent Commits to openclaw:main
Recent Commits to openclaw:main
H
Hackread – Cybersecurity News, Data Breaches, AI and More
Attack and Defense Labs
Attack and Defense Labs
美团技术团队
T
The Blog of Author Tim Ferriss
Google DeepMind News
Google DeepMind News
Martin Fowler
Martin Fowler
B
Blog
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
Scott Helme
Scott Helme
T
Tor Project blog
Know Your Adversary
Know Your Adversary
有赞技术团队
有赞技术团队
Hugging Face - Blog
Hugging Face - Blog
Recorded Future
Recorded Future
C
Cyber Attacks, Cyber Crime and Cyber Security
AI
AI
G
Google Developers Blog

Java技术经验分享

生产故障处理SOP分享 | Java技术经验分享 系统稳定性建设实践总结【转载】 | Java技术经验分享 valine访问leancloud国际版异常,评论失效修复 | Java技术经验分享 匆匆忙忙的2021 | Java技术经验分享 聊一下换工作 | Java技术经验分享 IoT系列(2):WIFI设备常见配网方案介绍 | Java技术经验分享 IoT系列(1):什么是物联网 | Java技术经验分享 Java8特性2 - StreamApi | Java技术经验分享 Java8特性1 - lambda表达式&函数式接口 | Java技术经验分享 设计模式(5)-适配器模式 | Java技术经验分享 设计模式(4)-建造者模式 | Java技术经验分享 设计模式(3)-原型模式与浅拷贝和深拷贝 | Java技术经验分享 设计模式(2)-工厂模式图文介绍 | Java技术经验分享 设计模式(1)-带你了解3类8种单例模式 | Java技术经验分享 Java时间处理5---Java8中时区相关类库介绍 | Java技术经验分享 Java时间处理4---Java8中LocalDate、LocalTime、LocalDateTime介绍 | Java技术经验分享 Java时间处理3---Java8中Instant、Duration、Period、Clock介绍 | Java技术经验分享 一些有意思的问答 | Java技术经验分享 Nacos系列博客说明 | Java技术经验分享 菜鸡程序员的2019年度总结 | Java技术经验分享 Java中“附近的人”实现方案讨论及代码实现 | Java技术经验分享 Java时间处理2----时区TimeZone类方法探究(Java8以前) | Java技术经验分享 Java时间处理1----Date和Calendar方法探究(Java8以前) | Java技术经验分享 FastJson中JSONString、JavaBean、JSONObject、JSONArray的转换关系及API示例 | Java技术经验分享 2019.11软考软件设计师归来心得体会及复习备考指南 | Java技术经验分享 你还没用过“约定式提交”吗?那你赶紧来补补知识吧 | Java技术经验分享 教你如何看懂UML中的类图及类图中的关系 | Java技术经验分享 设计模式总览 | Java技术经验分享 萌新入门Github请看这里,学不会远程教 | Java技术经验分享 Hexo的工作原理探究 | Java技术经验分享 Hexo-theme-butterfly修改调整记录教程 | Java技术经验分享 排序8:基数排序 | Java技术经验分享 排序7:归并排序 | Java技术经验分享 排序6:快速排序 | Java技术经验分享 排序5:冒泡排序 | Java技术经验分享 排序4:堆排序 | Java技术经验分享 排序3:选择排序 | Java技术经验分享 排序2:希尔排序 | Java技术经验分享 排序1:直接插入排序 | Java技术经验分享 推荐一款博客一文多发的良心工具OpenWrite | Java技术经验分享 近期学习计划 | Java技术经验分享 Nacos(九):Nacos集群部署和遇到的问题 | Java技术经验分享 Nacos(八):Nacos持久化 | Java技术经验分享 Nacos(七):Nacos共享配置 | Java技术经验分享 Nacos(六):多环境下如何“管理”及“隔离”配置和服务 | Java技术经验分享 Nacos(五):多环境下如何“读取”Nacos中相应的配置 | Java技术经验分享 Nacos(四):SpringCloud项目中接入Nacos作为配置中心 | Java技术经验分享 Nacos(三):Nacos与OpenFeign的对接使用 | Java技术经验分享 Nacos(二):SpringCloud项目中接入Nacos作为注册中心 | Java技术经验分享 Nacos(一):Nacos介绍 | Java技术经验分享 20190719小组分享 | Java技术经验分享 Java中equals和HashCode方法的分析 | Java技术经验分享 Java中==和equals方法的分析 | Java技术经验分享 Java中的自动拆装箱、装箱缓存 | Java技术经验分享 About-blog | Java技术经验分享 Java中的编译、反编译和反编译工具全家桶分享 | Java技术经验分享 finalize()的生命周期(执行过程) | Java技术经验分享 Java关键字之final、finally与finalize方法 | Java技术经验分享 Java中重写、重载 | Java技术经验分享 Java中面向对象的三大特征:继承、封装、多态 | Java技术经验分享 DockerFile介绍 | Java技术经验分享 Docker环境下安装Gitlab | Java技术经验分享 Docker中私有仓库的搭建流程 | Java技术经验分享 Centos7下两种方式安装Docker-CE | Java技术经验分享 Vert.x创建一个Http服务 | Java技术经验分享 Vert.x创建TCP服务端及客户端 | Java技术经验分享 Vert.x Core(二)- Event Bus(事件总线) | Java技术经验分享 Vert.x-Core(一)- 基础篇 | Java技术经验分享 SpringBoot项目中实现国际化 | Java技术经验分享 毕设选题项目本地运行环境搭建教程 | Java技术经验分享 Jupyter Notebooks的安装和使用介绍 | Java技术经验分享 算法笔试题:1元,5元,10元,20元,50元、100元面值人民币组合给定x元的问题 | Java技术经验分享 Quartz学习总结 | Java技术经验分享 SpringBoot2.x集成Redis | Java技术经验分享 SpringBoot2.x集成MongoDB | Java技术经验分享 [SpringCloud学习] - 浅谈微服务架构 | Java技术经验分享 基于hexo和coding免费搭建个人博客网站 | Java技术经验分享 Hello World | Java技术经验分享
Vert.x介绍 | Java技术经验分享
文章作者: LarsCheng · 2019-04-01 · via Java技术经验分享

Vert.x是基于Netty项目——一个基于JVM的高性能异步网络库,它的核心库定义了编写异步网络应用的基本API,你可以为应用程序选择有用的模块(如数据库链接、监控、认证、日志、服务发现、集群支持等),同时它也可以内嵌到现有的应用中(如springboot项目中)既能体验Vert.x的高效又兼顾spring的泛用性

vertx并不是针对特定应用的框架,它其实很大程度上就是netty的一个最佳实践的封装。在java上实现了类似于node.js的异步处理框架。

2 Vert.x是多语言的

Vert.x运行在Java虚拟机上,支持多种编程语言,Vert.x是高度模块化的,同一个应用,你可以选择多种编程语言同时开发。它支持广泛的流行的JVM语言:Java、Groovy、Scala、Kotlin、JavaScript、Ruby及Ceylon。

3 完善的生态体系

与我们熟悉的spring类似,Vert.x拥有完善的生态,使用vert.x可以完成一个应用的所有开发工作,可以实现一个完全异步处理的应用。它拥有类似于spring全家桶的生态体系,具体如下:

image

3.1 核心模块:Vert.x-core

Vert.x核心模块包含一些基础的功能,如HTTP,TCP,文件系统访问,EventBus、WebSocket、延时与重复执行、缓存等其他基础的功能,你可以在你自己的应用程序中直接使用。可以通过vertx-core模块引用即可。

3.2 支持web开发:Vert.x-Web

Vert.x Core 提供了一系列底层的功能用于操作 HTTP,对于一部分应用来是足够的。
Vert.x Web 基于 Vert.x Core,提供了一系列更丰富的功能以便更容易地开发实际的 Web 应用。

3.3 Vert.x提供多种数据访问的Api封装

Vert.x提供了对关系型数据库、NoSQL、消息中间件的支持,传统的客户端因为是阻塞的,会严重影响系统的性能,因此Vert.x提供了对以上客户端的异步支持。具体支持的数据访问如下:

  • MongoDB client
  • JDBC client
  • SQL common
  • Redis client
  • MySQL/PostgreSQLclient

3.5 微服务的支持:服务发现、熔断器

  • Vert.x Service Discovery:一个服务发现的基础组件,用来发布和发现各种类型的资源
  • Vert.x Circuit Breaker:是熔断器模式的Vert.x实现。可与springcloud种的Hystrix对比
  • Vert.x Config:提供了一种配置 Vert.x 应用的方式。

3.6 Vert.x整合了常用的消息驱动:Vert.x Integration

  • Vert.x Mail Client:提供了一简单STMP邮件客户端,所以你可以在应用程序中发送电子邮件
  • Vert.x STOMP Client & Server:提供了STOMP协议的实现包括客户端与服务端。
  • Vert.x JCA Adaptor:提供了Java连接器架构适配器,这允许同任意JavaEE应用服务器进行互操作。
  • Vert.x RabbitMQ Client:消息队里的客户端支持
  • Vert.x Kafka Client:消息队里的客户端支持
  • Vert.x Consul Client:google开源的一个使用go语言开发的服务发现、配置管理中心服务。内置了服务注册与发现框 架、分布一致性协议实现、健康检查、Key/Value存储、多数据中心方案。

3.7 身份验证和授权:

Vert.x提供了简单API用于在应用中提供认证和授权。

  • Auth common:通用的认证API,可以通过重写AuthProvider类来实现自己的认证
  • JDBC auth: 后台为JDBC的认证实现
  • JWT auth: 用JSON Web tokens认证实现
  • Shiro auth: 使用Apache Shiro认证实现
  • MongoDB auth: MongoDB认证实现
  • OAuth 2: Oauth2协义认证实现
  • htdigest auth: 这个是新增一种认证的支持

5 Vert.x、lambda、JDK8

Vert.x异步也带来了编码上的复杂性,想要编写优美的异步代码,就需要对lambda表达式、函数式编程、Reactive等技术非常熟悉才行,否则很容易导致你的代码一团糟,完全没有可读性。
在JDK8中引入了lambda表达式后,使用Java开发Vert.x应用就变得十分顺畅。

6 Vert.x核心概念

  • Verticle
    • Vert.x中的部署单元称为Verticle。Verticle是Vert.x中的一个核心概念。如果说Vertx是“应用”,那么Verticle就是应用中的一个服务。另一个更形象一点的比喻,如果说Vertx是一个机架,那么Veticle就是机架上的服务器。Verticle可以被传递一些配置信息(如证书、网络地址等),而且Verticle可以被多次部署,Verticle可以部署其它Verticle
    • verticle分两种,一种是基于EventLoop的适合I/O密集型的,还有一种是适合CPU密集型的worker verticle
  • EvenLoop
    • 事件循环(EventLoop)是异步编程模型中是特有的,一个Verticle通过一个事件循环(EventLoop)处理接收到的事件,这些事件可以是任何事情,如接收网络缓冲、调度事件或由其它Verticle发送的消息,事件循环(EventLoop)中执行时,不能进行线程阻塞操作

  • EvenBus
    • 事件总线(EvenBus)是在不同Verticle之间通过异步消息传递进行通讯的主要工具

其他介绍

Vert.x 的定义是 “用来在JVM上构建反应式(reactive)应用程序的工具箱”。

Vert.x并不是一个应用服务器,一个容器或者一个框架。 它也并不是一个JavaScript开发库。Vert.x是一个朴素的老的 jar文件,所以一个Vert.x应用程序实际上是一个使用这个 jar 文件的程序。 Vert.x并不强制一个打包的方式。所有Vert.x 模块(components) 都是朴素 平淡 的 jar 文件。 这将怎样影响你的应用程序呢?让我们想象你在使用一个项目构建工具,比方说Maven或者Gradle, 去建立你的应用,一个 Vert.x 应用程序,其实就是吧 vertx-core 加入到依赖项里。 你想使用其他的 Vert.x 组件吗?请把它+到你的依赖项里。这很简单,毫无负担,不是吗。 启动这个程序就是启动一个简单实现了 public static void main(String[] args) 的类。我们不需要任何特殊的IDE或者插件去安装和开始使用 Vert.x。

反应式、响应式编程、响应式系统

Vert.x 是 反应式 。它就是要用来建立反应式应用程序,或者更贴切的说法是反应式系统

再次,Vert.x 是一个事件驱动和非阻塞的。事件被投递到一个永不阻塞的事件循环(EventLoop) 里。Vert.x只使用非常少的线程。 有一些线程是事件循环, 它们在处理器(Handlers) 之间派发事件。如果你把某个线程阻塞了,事件将不能继续派发。这个执行模式将影响你如何写代码,不同于传统的阻塞代码,你的代码将是异步的和非阻塞的。

举一个例子,如果你要得到一个基于URL的资源,你需要这么做:

1
2
3
4
5
6
7
8
URL site = new URL("http://vertx.io/");
BufferedReader in = new BufferedReader(new InputStreamReader(site.openStream()));

String inputLine;
while ((inputLine = in.readLine()) != null) {
System.out.println(inputLine);
}
in.close();

但是用 Vert.x 的话,就很简单:

1
2
3
vertx.createHttpClient().getNow(80, "vertx.io", "", response -> {
response.bodyHandler(System.out::println);
});

对于异步编程的理解,比如ajax与Vert.x

1
2
3
4
5
6
7
8
9
10
11
12
13
//ajax代码
console.log("1");

$.ajax({
"url" : "/hello",
"type" : "post",
"dataType" : "json",
"success" : function(val) {
console.log("2");
}
});

console.log("3");
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
//vert.x代码
System.out.println("1")

WebClient
.create(vertx)
.postAbs(REQUEST_URL) // 这里指定的是请求的地址
.sendBuffer(buffer, res -> { // buffer是请求的数据

if (res.succeeded()) {
// 请求远程服务成功
System.out.println("2")

} else {
// 请求失败
resultHandler.handle(Future.failedFuture("请求服务器失败..."));
}
});

System.out.println("3")

学习资料

Vert.x 官方文档中文翻译

A gentle guide to asynchronous programming with Eclipse Vert.x for Java developers中文翻译版

Vert.x CSDN教程专栏

Vert.x 蓝图 - Micro-Shop 微服务实战