4.Q&A主题
一、特性简介
Vert.x能做什么?
Polyglot Support
•Java
•Ruby
•JavaScript
•Groovy
•Ceylon
•Scala(in progress)
开发模型/线程模型
Verticle之间进行通信: Event Bus
逻辑单元:Verticle(Actor-like)
Event Loop线程:处理事件(不能阻塞!)
Worker线程:可执行阻塞任务
Verticle 线程安全
异步开发模式
异步开发模式
Event Bus
Vert.x的神经系统(各组件之间通信)
•每个消息都会被发送至某个地址(address)
•消息会在消息接收者绑定的Handler中进行处理
•多种消息模式
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原生代码
Vert.x WebHelper Handler
Vert.x Web另一种思路:类似于Play Framework 2
Action: Request[A] => Result
Vert.x Web
Vert.x KueVert.x Kue
是一个使用Vert.x开发的优先级工作队列,数据存储使用的是Redis。Vert.x Kue是Automattic/kue(Node.js)的Vert.x实现版本。
再谈Event Bus
•MessageProducer
•Interceptor
•MessageConsumer
•Flow Control
•集群模式实现原理
•消息模型
Event Bus 消息模型
•Request/Response
Clustered Event Bus实现原理
•基于TCP
•底层通过Cluster Manager同步ServerID
•消息协议:一种简单的Wire Protocol
Flow Control in Vert.x
拦截器本质是一个Handler
VERTX异步RPC
Asynchronous RPCVert.x 提供原生支持异步RPC的组件Vert.x Service Proxy
自动生成:CheckoutServiceVertxEBProxy, CheckoutServiceVertxProxyHandler
Vert.x Codegen
Vert.x Codegen本质上是一个注解处理器(APT),编译时处理注解并根据模板生成相应的代码。
.–生成JSON Converter
.–生成其它语言的代码/Rx版本的代码
.–生成服务代理类及服务代理处理器
使用时需要在Maven/Gradle中进行相应的配置
Asynchronous RPC 原理
•底层通过Clustered Event Bus进行通信
•通过Vert.x Codegen生成服务代理类
VERT.X
Microservice
Microservice
•Service Discovery (服务发现)
•Circuit Breaker (断路器)
•API Gateway
•Event Sourcing (事件溯源模式)
Micro-Shop 总览
不同组件之间如何通信?
•AsyncRPC (via Event Bus)
•REST
•Message (via Event Bus)
•自定义
Service Discovery(Registry)
•用服务记录(Record)代表某一个服务,里面保存着服务的名称、类型、位置以及其它元数据
•创建好服务记录后即可发布服务(publish)
•需要调用服务时,可以从服务发现组件获取服务记录,然后创建对应的服务实例
•可以自定义ServiceImporter导入服务,或ServiceExporter导出服务
服务记录存储在哪里?
不同的ServiceDiscoveryBackend代表不同的存储机制
•默认存储在LocalMap(单机模式)/DistributedMap(集群模式,具体取决于Cluster Manager)
•Vert.x也提供RedisBackend ——将服务记录存储于Redis中
•ZooKeeperBackend (3.4.0特性)
Circuit Breaker
Event Sourcing
Event Sourcing的优点DDD/CQRS/Event Sourcing
•我们可以从过去的事件序列中组建出任意时刻的数据状态
•每个过去的事件都得以保存,因此这使得补偿事务成为可能
•我们可以从事件存储中获取事件流,并且以异步、响应式风格对其进行变换和处理
•事件存储同样可以当作为数据日志
API Gateway
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)
API Gateway请求分发的另外一些情况
•HTTP(S) -> Event Bus:使用request/response消息模型与服务进行通信
•缺陷:Event Bus需要支持地址匹配(类似于路由,目前已列入wishlist)
•HTTP(S) -> 其他协议:实现协议转换接口(比如实现对应的Event Bus Bridge)
API Gateway
结合Circuit Breaker
VerticleFailover
HA模式下,Verticle挂了以后会在集群内的其他节点redeploy
Vert.x Auth(JDBC/JWT/Mongo/Shiro/OAuth2)
•如何与API Gateway结合?
•如何简化权限验证的逻辑?
权限管理
•得到Principal以后,将其通过Header传递至下层服务中
•封装一个requireLogin路由处理包装来简化权限验证
•若传入的principal不合法或不存在,直接返回401
•相应的路由处理函数里面可以获取Principal:
Rx-fiedAPIs in Vert.x
Vert.x Rx API 返回的Observable本质上是一种Single(Emit once)与Future类似Rx-fiedAPIs in Vert.x
Rx-fiedAPIs in Vert.x
•getConnectionObservable(): Observable
•getConnection(handler): voidReactive!
如何与其它框架/库整合?
.异步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
点击打开链接