vertx应用实战Vert.x Blueprint


1.Vert.x 特性简介
2.Vert.x Blueprint 实战
3.Vert.x 未来展望

4.Q&A主题

一、特性简介

Vert.x能做什么?

Polyglot Support

•Java

•Ruby

•JavaScript

•Groovy

•Ceylon

•Scala(in progress)

开发模型/线程模型
Verticle之间进行通信: Event Bus
逻辑单元:Verticle(Actor-like)
Event Loop线程:处理事件(不能阻塞!)

Worker线程:可执行阻塞任务

vertx应用实战Vert.x Blueprint_第1张图片

vertx应用实战Vert.x Blueprint_第2张图片

Verticle 线程安全

vertx应用实战Vert.x Blueprint_第3张图片

vertx应用实战Vert.x Blueprint_第4张图片

异步开发模式

vertx应用实战Vert.x Blueprint_第5张图片

异步开发模式

vertx应用实战Vert.x Blueprint_第6张图片

Event Bus
Vert.x的神经系统(各组件之间通信)
•每个消息都会被发送至某个地址(address)
•消息会在消息接收者绑定的Handler中进行处理

•多种消息模式

vertx应用实战Vert.x Blueprint_第7张图片

Event Bus Clients && Bridges
•Go
•C
•C#
•Python
•SockJS(浏览器端/Node.js)
•TCP
•AMQP
•Stomp

•Camel

Reactive Pattern

Vert.x默认都是基于回调的API ——Nightmare!

•Observable(Rx-fiedAPIs)

•Vert.x Sync (Fiber)

•Future(map/compose)

二、Vert.x Blueprint 实战
•2.1 Vert.x Web 开发简化
•2.2 Event Bus 消息模式、原理及高阶应用
•2.3 异步RPC
•2.4 微服务设计与应用(服务发现、Circuit Breaker、API Gateway)
•2.5 Vert.x Rx应用

•2.6 整合其他框架

Vert.x Blueprint

•TodoBackend

•Vert.x Kue

•Micro-Shop Microservice

http://vertx.io/blog/vert-x-blueprint-tutorials/

Vert.x Web

•REST Services/Web Application

结合异步服务冗余代码多如何简化开发?

•封装Helper Handler

•封装Future-based Routing Handler

•封装基于注解的Vert.x Web

Vert.x Web原生代码

vertx应用实战Vert.x Blueprint_第8张图片

Vert.x WebHelper Handler

vertx应用实战Vert.x Blueprint_第9张图片

Vert.x Web另一种思路:类似于Play Framework 2

vertx应用实战Vert.x Blueprint_第10张图片

Action: Request[A] => Result

Vert.x Web

vertx应用实战Vert.x Blueprint_第11张图片

Vert.x KueVert.x Kue

vertx应用实战Vert.x Blueprint_第12张图片

是一个使用Vert.x开发的优先级工作队列,数据存储使用的是Redis。Vert.x Kue是Automattic/kue(Node.js)的Vert.x实现版本。

vertx应用实战Vert.x Blueprint_第13张图片

再谈Event Bus

•MessageProducer

•Interceptor

•MessageConsumer

•Flow Control

•集群模式实现原理

•消息模型

vertx应用实战Vert.x Blueprint_第14张图片

vertx应用实战Vert.x Blueprint_第15张图片


vertx应用实战Vert.x Blueprint_第16张图片

Event Bus 消息模型

vertx应用实战Vert.x Blueprint_第17张图片

•Request/Response

Clustered Event Bus实现原理

•基于TCP

•底层通过Cluster Manager同步ServerID

•消息协议:一种简单的Wire Protocol

vertx应用实战Vert.x Blueprint_第18张图片

vertx应用实战Vert.x Blueprint_第19张图片

Flow Control in Vert.x

vertx应用实战Vert.x Blueprint_第20张图片

Event Bus 拦截器可以实现链式拦截vertx应用实战Vert.x Blueprint_第21张图片


拦截器本质是一个Handler我们可以通过message()方法获取包含的消息并进行处理,然后调用next()方法执行下一个拦截器(或进行消息的处理)

VERTX异步RPC

Asynchronous RPCVert.x 提供原生支持异步RPC的组件Vert.x Service Proxy

vertx应用实战Vert.x Blueprint_第22张图片

vertx应用实战Vert.x Blueprint_第23张图片

自动生成:CheckoutServiceVertxEBProxy, CheckoutServiceVertxProxyHandler

Vert.x Codegen

Vert.x Codegen本质上是一个注解处理器(APT),编译时处理注解并根据模板生成相应的代码。

.–生成JSON Converter

.–生成其它语言的代码/Rx版本的代码

.–生成服务代理类及服务代理处理器

使用时需要在Maven/Gradle中进行相应的配置

Asynchronous RPC 原理

•底层通过Clustered Event Bus进行通信

•通过Vert.x Codegen生成服务代理类

vertx应用实战Vert.x Blueprint_第24张图片


VERT.X

Microservice

vertx应用实战Vert.x Blueprint_第25张图片

Microservice

•Service Discovery (服务发现)

•Circuit Breaker (断路器)

•API Gateway

•Event Sourcing (事件溯源模式)

Micro-Shop 总览

vertx应用实战Vert.x Blueprint_第26张图片

不同组件之间如何通信?

•AsyncRPC (via Event Bus)

•REST

•Message (via Event Bus)

•自定义

vertx应用实战Vert.x Blueprint_第27张图片

Service Discovery(Registry)

•用服务记录(Record)代表某一个服务,里面保存着服务的名称、类型、位置以及其它元数据

•创建好服务记录后即可发布服务(publish)

•需要调用服务时,可以从服务发现组件获取服务记录,然后创建对应的服务实例

•可以自定义ServiceImporter导入服务,或ServiceExporter导出服务

服务记录存储在哪里?

不同的ServiceDiscoveryBackend代表不同的存储机制

•默认存储在LocalMap(单机模式)/DistributedMap(集群模式,具体取决于Cluster Manager)

•Vert.x也提供RedisBackend ——将服务记录存储于Redis中

•ZooKeeperBackend (3.4.0特性)

Circuit Breaker

vertx应用实战Vert.x Blueprint_第28张图片

Event Sourcing

vertx应用实战Vert.x Blueprint_第29张图片[(A123456, 4),(A1763515, 1)]

vertx应用实战Vert.x Blueprint_第30张图片

Event Sourcing的优点DDD/CQRS/Event Sourcing

•我们可以从过去的事件序列中组建出任意时刻的数据状态

•每个过去的事件都得以保存,因此这使得补偿事务成为可能

•我们可以从事件存储中获取事件流,并且以异步、响应式风格对其进行变换和处理

•事件存储同样可以当作为数据日志

API Gateway

vertx应用实战Vert.x Blueprint_第31张图片

API Gateway

•针对Failure设计,实现容错

•请求的分发,协议的转换

•重要组件,需要保证高可用(HA)

•权限管理

•心跳检测

•性能?

API Gateway分发请求(Reverse Proxy)

.Prepare: 每个REST Endpoint在发布的时候都会在元数据内存储对应的api.name

.请求格式:/api/{api.name}/xxx

.过程:首先解析请求路径对应的api.name,然后从服务发现层获取此API对应的所有REST服务记录列表;接着根据一定的负载均衡算法从其中选出一个服务记录,构造服务实例,然后进行请求的转发。

API Gateway

分发请求(Reverse Proxy)

vertx应用实战Vert.x Blueprint_第32张图片

API Gateway请求分发的另外一些情况

•HTTP(S) -> Event Bus:使用request/response消息模型与服务进行通信

•缺陷:Event Bus需要支持地址匹配(类似于路由,目前已列入wishlist)

•HTTP(S) -> 其他协议:实现协议转换接口(比如实现对应的Event Bus Bridge)

API Gateway

结合Circuit Breaker

vertx应用实战Vert.x Blueprint_第33张图片

VerticleFailover

HA模式下,Verticle挂了以后会在集群内的其他节点redeploy

vertx应用实战Vert.x Blueprint_第34张图片


Vert.x Auth(JDBC/JWT/Mongo/Shiro/OAuth2)

•如何与API Gateway结合?

•如何简化权限验证的逻辑?

权限管理

•得到Principal以后,将其通过Header传递至下层服务中


•封装一个requireLogin路由处理包装来简化权限验证


•若传入的principal不合法或不存在,直接返回401

•相应的路由处理函数里面可以获取Principal:

vertx应用实战Vert.x Blueprint_第35张图片

Rx-fiedAPIs in Vert.x

vertx应用实战Vert.x Blueprint_第36张图片

Vert.x Rx API 返回的Observable本质上是一种Single(Emit once)与Future类似Rx-fiedAPIs in Vert.x

Rx-fiedAPIs in Vert.x

•getConnectionObservable(): Observable

 •getConnection(handler): voidReactive!

vertx应用实战Vert.x Blueprint_第37张图片

如何与其它框架/库整合?

.异步API:Context#runOnContextExample:Netflix Hystrix(Async)IMPORTANT: 要遵循Vert.x的线程模型!

.同步API:Vertx#executeBlockingExample :MyBatisORM

三、未来展望

New Components

•Vert.x Kafka Client (Stream based)

•Vert.x ZooKeeperCluster

•Vert.x Consul Client

•Vert.x ScalaAnd maybe many more…

•Vert.x Configuration Service

点击打开链接


你可能感兴趣的:(vertx)