首页 > 编程知识 正文

python异步web框架,开源异步事件框架

时间:2023-05-04 17:35:59 阅读:175527 作者:3412

Vert.x是一个基于JVM、轻量级、高性能的APP应用平台,非常适合最新的移动终端后台、互联网和企业APP应用架构。 Vert.x基于完全异步Java服务器Netty,扩展了许多有用的功能

3358 www.Sina.com/:https://github.com/ver t-x 3

http://www.Sina.com/: http://vertx.io /

github

Vert.x出生于2011年。 当时叫node.x,后来由于某种原因改名为Vert.x。 经过三年多的发展,现已3.3.3版,社区越来越活跃,在最新的官网Vertx.io上,作者用一句话对其进行了介绍,是JVM上的Reative开发工具包。 Vert.x是迄今为止见过的功能最强大、第三方库依赖最多的Java框架,它只依赖于Netty4和Jacskon。 此外,如果需要构建分布式的Vert.x,则依赖于一个名为HazelCast的分布式框架。 请注意,Vert.x3必须基于Java8。 由于基于JVM,Vert.x可以用其他语言实现业务。

Vert.x是异步且没有块的网络框架,其参照对象为node.js。 基本上node.js能做的事,Vert.x能做。 由于Vert.x利用Netty4的EventLoop构建了单线程事件循环,因此在运行Vert.x的业务中无法进行CPU密集型运算,整个线程将被阻塞。

官网

1、同时支持多种编程语言——目前支持Java、Scala、JavaScript、Ruby、Python、Groovy、Clojure、Ceylon等。 对于程序员来说,直接的好处是可以使用各种语言丰富的LIB。 另外,也不会为编程语言的选定而烦恼

2、异步无锁编程——经典的多线程编程模型可以满足很多Web开发场景,但随着移动互联网并发连接数的快速增长,多线程并发控制模型的性能难以扩展,同时实现并发锁目前,Reactor异步编程模型已经开始流行,而Vert.x是这种异步无锁编程的首选项之一;

3、丰富的IO支持——目前,Vert.x异步模型支持TCP、UDP、文件系统、DNS、事件总线、Sockjs等;

良好的分布式开发支持——Vert.x可以通过EventBus事件总线轻松编写分布式去耦程序,具有良好的可扩展性

4、生态系统日趋成熟,——Vert.x进入Eclipse基金会门下,异步驱动已经支持Postgres、MySQL、MongoDB、Redis等常用组件,在一些Vert.x的生产环境中

介绍:提供事件驱动的编程模型,在使用Vert.x作为服务器的情况下,程序员只需编写事件处理器event handler即可。 如果TCP套接字中有数据,则event handler可以理解创建的调用并在以下情况下被激活: '事件总线事件处理程序

作为服务层处理逻辑层,基本上对应的传统Java中的域模型处理层。 各种服务呼叫和对数据层的呼叫几乎是自上而下的层。 在传统模型中,这一层基本上是同步调用,即使有异步调用,也是与业务逻辑分离的异步。 完全异步会破坏业务逻辑,导致混乱。 代码的说明很难。 到这里就知道了

1、自身为异步体系,不适合描述顺序逻辑性强的业务

2、由于异步问题,对数据层的访问也必须异步,导致业务模型的进一步碎片化

特性:也就是说,程序入口在各种语言中的实现方式可能不同。 例如,Java必须继承AbstractVerticle抽象类

有两种类型的verticle :基于事件环路的I/O密集型和CPU密集型工作器verticle。 另一方面,verticle彼此的相互通信只能通过Eventbus来实现,既可以应对point to point的通信,也可以应对publish subscribe的通信方式。

重要接口

org.vertx.java.core.Handler

Vert.x运行时的核心接口用于结果回调处理,大多数逻辑代码在此执行。 所以没有必要解释。

Vert.x是基于事件的

这个名词的意思是基于Vert.xAPI构建的可执行程序。 在本节中,您将很容易理解继承了org.vertx.Java.platform.verticle的Java类和其他语言的脚本

Context界面表示一个可执行单元的上下文。

这里的上下文只干一件事情就是处理Handler里的内容void runOnContext(Handler<Void> action);,

在Vert.x里有两种上下文,即EventLoop与Worker,而Worker又会分按顺序执行的Worker与多线程Worker.这里我们就先看成两类EventLoop与Worker,什么是EventLoop呢.
在Vert.x里所有的事件包括IO都是依赖于Netty的EventLoop接口,而这个接口在Netty里会一定的频率调用.即当发生IO事件时,Netty会按时间比率分配CPU资源去响应这个事件.
在Vert.x里你可以简单的理解为IO相关的事件就可以了,用了一个特定的线程池来响应这类请求.而Worker在Vert.x里默认是一套按顺序执行的Handler,即按照先来先到的顺序依次执行,此类的请求是另一个线程池执行.


所有业务逻辑其实都会跑在Netty里的EventLoop上,而EventLoop通过循环事件队列来执行所有的业务逻辑,这样可以把一些I/O操作频繁的事件及时从CPU上剥离开来,最后通过注册一个回调Handler来处理所有的事件回调


org.vertx.java.core.Vertx
这个其实就是API,非Vert.x扩展者,能用到的所有的东西都在这里了.基于上面的三个接口,其实就能抽象出一个异步的模型,通过Vertx接口调用一个API,API内部会持有一个Context,在API本身的非业务逻辑执行完后,将Handler传入Context执行.这大概就是整个Vert.x内部执行的流程,三个接口抽象出一个世界这便是软件设计的哲学.

重要概念

Verticle

基于Vert.x框架实现的代码包,就是一个Verticle,简单点说,一个可以被Vert.x框架执行的代码调用了Vert.xAPI的代码就是一个Verticle.他可以用Scala Clojure JS Ruby等语言实现.多个Verticle实例可以并行的被执行.一个基于Vert.x的服务也许需要多个verticles来实现,而且要部署在多台服务器上.他们之间通过vert.x事件进行通信.你可以之间通过vert.x命令启动,也可以将verticle包装成vert.x modules.

Module

Vert.x应用由一个或多个modules来实现.一个模块呢由多个verticles来实现.你可以把module想象出一个个Java package.里面可能是特定业务的实现,或者公共的服务实现(那些可以重用的服务).Vert.x编写好的module,可以发布到maven的仓库里.以zip包装成二进制格式.或者发布到vert.x module 注册中心.实际上这种以模块方式的开发,支撑着整个Vert.x生态系统.Module更多的信息,我需要单独开一个系列来讲解.

Event Bus

它是Vert.X的核心,在集群中容器之间的通信,各个Verticle之间的通讯都是经过Event Bus来实现的,后期会推出一篇专门关于这个的文章,敬请等待。

Shared Data

它是Vert.X提供的一个简单共享Map和Set,用来解决各个Verticle之间的数据共享

框架图


实例:

public class HelloWorldEmbedded {public static void main(String[] args) { // Create an HTTP server which simply returns "Hello World!" to each request. Vertx.vertx().createHttpServer().requestHandler(req -> req.response().end("Hello World!")).listen(8080); }}
启动一个verticle

vertx.deployVerticle(DingtalksrvVertical.class.getName(), deploymentOptions, result -> { if (result.succeeded()) { String deployId = result.result(); System.out.println("Dingtalksrv 部署成功 [" + deployId + "]"); future.complete(); } else { System.out.println("Dingtalksrv 部署失败 " + result.cause().getMessage()); future.fail(result.cause()); } });
启动服务

HttpServerOptions options = createOptions(); server = vertx.createHttpServer(options); server.requestHandler(mainRouter::accept); server.listen(result -> { if (result.succeeded()) { } else { } });mainRouter = Router.router(vertx);mainRouter.mountSubRouter("/api", router);Router router = Router.router(vertx);router.route(HttpMethod.POST, "/hello").handler(HelloHandler()::handleRequest);


异步封装

executor.executeBlocking((Future<T> f) -> { try { jdbc_routine(); } f.complete(); } catch (SQLException e) { f.fail(e); } }, handler);
Vert.x3支持很多常用工具:metrics、热部署、consul、kafka、mongo、redis等

有兴趣可以到github上查看相应组件

Vert.x的执行单元叫verticle。即程序的入口,每个语言可能实现的方式不一样,比如Java需要继承一个AbstractVerticle抽象类

verticle分两种,一种是基于EventLoop的适合I/O密集型的,还有一种是适合CPU密集型的worker verticle。而verticle之间相互通信只能通过Eventbus,可以支持point to point 的通信,也可以支持publish & subscribe通信方式。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。