当前位置: 首页 > news >正文

vertx源码_使用Vertx构建微服务-阿里云开发者社区

Vertx

Vert.x is a tool-kit for building reactive applications on the JVM.(Vertx是运行在JVM上用来构建reactive application的工具集)

Vertx Design

响应式的(Responsive):一个响应式系统需要在合理的时间内处理请求。

弹性的(Resilient):一个响应式系统必须在遇到异常(崩溃,超时, 500 错误等等)的时候保持响应的能力,所以它必须要为异常处理 而设计。

可伸缩的(Elastic):一个响应式系统必须在不同的负载情况下都要保持响应能力,所以它必须能伸能缩,并且可以利用最少的资源来处理负载。

消息驱动(Message driven):一个响应式系统的各个组件之间通过 异步消息传递 来进行交互。

支持多种语言:只要能运行在JVM上的语言,基本都支持。

简单的并发模型:就像写单线程代码一样简单,多线程并发由Vertx控制。

支持Event Bus:在同一个vertx集群,各个verticle 实例间可以通过event bus通信。同时也支持跨进程的TCP Event Bus (tcp-eventbus-bridge)

Vertx与Netty的关系:Vertx使用Netty处理所有的IO。

Vertx 术语

Verticle

Vertx部署和运行的代码。Verticles可以使用多种语言实现。

Vert.x Instance

Vert.x instance运行在JVM里,Verticle运行在Vert.x instance里。多个Verticles在一个Vert.x instance里异步执行。多个Vert.x instances可以通过Event Bus组成集群。

Concurrency

Standard Verticle:始终在同一个Event Loop线程上执行,同一个Verticle 中的逻辑可以避免资源竞争和死锁。

Worker Verticle:在worker threads上执行,Vertx保证最多同时只有一个worker thread在执行逻辑,避免竞争和死锁。但是在不同的时刻,可能由不同的线程在执行。

Multi-threaded worker verticle:和Worker Verticle类似,但是不保证线程安全,在同一时刻,可能由多个线程在执行。

Event-based Programming Model

使用“事件驱动”的模式去编写代码,采用异步回调handler的方式去处理事件,不能被阻塞!

Event Loops

Vert.x的核心线程池,默认每个Verticle运行在自己的Event Loop线程上,不能被阻塞!

Message Passing

不同的Verticle可以通过Event Bus通信,集群模式下不同主机上的Verticle也可以通过Event Bus通信,来实现distributed applications。

Shared data

不同的Verticle之间可以通过 Shared Data 共享数据。

Vert.x Architecture

Verticle 是执行单元,在同一个Vertx实例中可以同时执行多个Verticle。Verticle在event-loop线程上执行,多个Vert.x instances可以在多个host上执行,各个Verticles 通过event bus通信。

Vert.x Thread Pool

Vert.x 有三种线程池

Acceptor: 用来接收socket连接. 只要有一个服务port需要监听,就会有一个accept线程。

acceptorEventLoopGroup = new NioEventLoopGroup(1, acceptorEventLoopThreadFactory);

acceptorEventLoopGroup.setIoRatio(100);

Event Loops: 不断地轮询获取事件,并将获取到的事件分发到对应的事件处理器中进行处理,永远不要阻塞Event Loop线程。

eventLoopThreadFactory = new VertxThreadFactory("vert.x-eventloop-thread-", checker, false, options.getMaxEventLoopExecuteTime());

eventLoopGroup= newNioEventLoopGroup(options.getEventLoopPoolSize(), eventLoopThreadFactory);

eventLoopGroup.setIoRatio(NETTY_IO_RATIO);

Worker Threads: Worker线程池,它其实就是一种Fixed Thread Pool:

ExecutorService workerExec =Executors.newFixedThreadPool(options.getWorkerPoolSize(),new VertxThreadFactory("vert.x-worker-thread-", checker, true, options.getMaxWorkerExecuteTime()));

PoolMetrics workerPoolMetrics= isMetricsEnabled() ? metrics.createMetrics(workerExec, "worker", "vert.x-worker-thread", options.getWorkerPoolSize()) : null;

workerPool= new WorkerPool(workerExec, workerPoolMetrics);

Why is Hazelcast Used?

Vert.x 使用 Hazelcast 作为一个In-Memory Data Grid (IMDG). Hazelcast 是一个内嵌的组件。

如果使用集群模式,Vert.x 默认使用Hazelcast来管理在各个不同Host上的Instance通信。Hazelcast 也是一种分布式的存储,Hazelcast 是Vert.x Event Bus 在集群模式下的实现基础,也是Vertx分布式共享内存的Shared Map的基础。

微服务

什么是微服务?

split the application into a set of decoupled components providing defined services 把一个应用程序分成各个独立的解耦的组件提供服务。(defined means with a known interface or API)

allow the components communicate with whatever protocol the choose, often REST, but not necessarily 组件之间使用协议通信,通常是REST。

allow the components use whatever languages and technologies they want 组件可以用不同的语言和技术实现。

allow each component be developed, released and deployed independently 组件可独立的开发、发布和部署。

allow the deployments be automated in their own pipeline组件在自己的环境下自动部署。

allow the orchestration of the whole application be reduced to the barest minimum 让整个程序的依赖尽量最少。

一个微服务实例

The Micro-Trader Application

The application uses several types of services:

HTTP endpoint (i.e. REST API) - this service is located using an HTTP URL.

Service proxies - these are asynchronous services exposed on the event bus using an RPC interaction mechanism, the service is located using an (event bus) address.

Message sources - these are components publishing messages on the event bus, the service is located using an (event bus) address.

Reference:

http://vertx.io/docs/guide-for-java-devs/

http://vertx.io/docs/vertx-core/java/

https://www.cubrid.org/blog/inside-vertx-comparison-with-nodejs/

https://www.cubrid.org/blog/understanding-vertx-architecture-part-2

https://medium.com/@levon_t/java-vert-x-starter-guide-part-1-30cb050d68aa

https://medium.com/@levon_t/java-vert-x-starter-guide-part-2-worker-verticles-c49866df44ab

http://www.sczyh30.com/vertx-blueprint-microservice/cn/index.html

《Vert.x - From zero to (micro)-hero》http://escoffier.me/vertx-hol/

本文转自阿凡卢博客园博客,原文链接:http://www.cnblogs.com/luxiaoxun/p/7693640.html,如需转载请自行联系原作者

相关文章:

  • 固有属性指的是用户_用户画像-带你认清的你的用户
  • ai如何对齐两个图形边缘_UI设计中如何更好的运用排版法则
  • 世界地图新西兰_新西兰又被实名羡慕了!在这个榜单排名第1,美国才排第34!...
  • 字体感觉小了 引入的vant_Vant中使用rem
  • eplices开发android_Eclipse 安装(Neon 版本)
  • 加密狗模拟器_汽车驾驶模拟器新软件功能
  • 触摸屏开发_莱宝高科:暂无大规模扩充触摸屏产能计划,正开发OFM结构触摸屏...
  • 模拟黑洞图像_nasa绘制黑洞图像(这次我终于看到了! NASA模拟的黑洞高清令人震惊的画面,令人窒息!)...
  • github覆盖远程分支内容_Github快速上手笔记
  • 显示某年某月日历_一眼就沦陷!一款深藏中国文化古韵的日历应用
  • 深度装机大师一键重装_深度一键重装系统软件
  • idea jsp引用路径_JSP学习4
  • 于朦胧 机器人_《两世欢》上线,于朦胧演技成笑点:像个没有感情的走路机器人...
  • 无法加载 mysql 扩展_请检查您的 php 配置. - 文档_无法加载 mysql 扩展,请检查您的 PHP 配置 最新解决办法...
  • mysql可以运行oracle报错_Oracle启动报错ORA-03113解决
  • 【Under-the-hood-ReactJS-Part0】React源码解读
  • 【跃迁之路】【463天】刻意练习系列222(2018.05.14)
  • ES6 学习笔记(一)let,const和解构赋值
  • github从入门到放弃(1)
  • javascript 总结(常用工具类的封装)
  • Java多态
  • Laravel 中的一个后期静态绑定
  • LeetCode算法系列_0891_子序列宽度之和
  • MobX
  • PHP 7 修改了什么呢 -- 2
  • scrapy学习之路4(itemloder的使用)
  • ViewService——一种保证客户端与服务端同步的方法
  • vue 配置sass、scss全局变量
  • Vue学习第二天
  • windows-nginx-https-本地配置
  • 从0实现一个tiny react(三)生命周期
  • 关于 Cirru Editor 存储格式
  • 基于Android乐音识别(2)
  • 如何打造100亿SDK累计覆盖量的大数据系统
  • 一个SAP顾问在美国的这些年
  • 一些关于Rust在2019年的思考
  • nb
  • 【运维趟坑回忆录】vpc迁移 - 吃螃蟹之路
  • NLPIR智能语义技术让大数据挖掘更简单
  • ​LeetCode解法汇总2583. 二叉树中的第 K 大层和
  • "无招胜有招"nbsp;史上最全的互…
  • # Swust 12th acm 邀请赛# [ A ] A+B problem [题解]
  • $.ajax中的eval及dataType
  • ${factoryList }后面有空格不影响
  • (14)学习笔记:动手深度学习(Pytorch神经网络基础)
  • (2)(2.4) TerraRanger Tower/Tower EVO(360度)
  • (超详细)语音信号处理之特征提取
  • (附源码)spring boot网络空间安全实验教学示范中心网站 毕业设计 111454
  • (四)Android布局类型(线性布局LinearLayout)
  • (转)如何上传第三方jar包至Maven私服让maven项目可以使用第三方jar包
  • (转载)VS2010/MFC编程入门之三十四(菜单:VS2010菜单资源详解)
  • (自用)learnOpenGL学习总结-高级OpenGL-抗锯齿
  • .net 7 上传文件踩坑
  • .NET Core 中插件式开发实现
  • .NET LINQ 通常分 Syntax Query 和Syntax Method