使用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 = new NioEventLoopGroup(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 definedservices把一個應用程序分成各個獨立的解耦的組件提供服務。(definedmeans 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 beautomatedin their ownpipeline 組件在自己的環境下自動部署。
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.
源碼:https://github.com/cescoffier/vertx-microservices-workshop
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/
總結
以上是生活随笔為你收集整理的使用Vertx构建微服务的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 阳光惠生活怎么用积分抵扣年费(阳光高清图
- 下一篇: 小米wifi如何解除禁止联网(MIUI1