TIP:java
這部分相應的代碼在step-3文件夾中(https://github.com/vert-x3/vertx-guide-for-java-devs)git
以前的重構是咱們從初始構建向前的一大步,咱們使用event bus的消息機制抽取了獨立可配置的verticles,並且咱們也看到能夠部署多個verticles實例來更好應對負載和利用cpu內核。github
在這個章節,咱們將看到怎麼設計和使用Vert.x服務,設計服務的主要優點能夠面向接口編程,而後把服務暴露出來,咱們也能夠用代碼生成工具來處理event bus的消息機制,來替換咱們以前章節介紹的那樣來本身手動編寫的部分。數據庫
咱們將會重構代碼,使用不一樣的包路徑:編程
io.vertx.guides.wiki將包含主要的verticle,io.vertx.guides.wiki.database是數據庫verticle和service,io.vertx.guides.wiki.http是Http 服務 verticle。數組
Maven配置修改微信
第一,咱們先把下面兩個依賴包加入到咱們項目中,尤爲咱們須要 vertx-service-proxy Apis:異步
咱們須要Vert.x代碼生成模塊,而且只是編譯時依賴(provided
scope)maven
而後咱們須要調整maven-compiler-plugin配置來使用code generation,這是經過一個javac註解的操做:ide
注意到自動生成的代碼在src/main/generate路徑下,而後一些集成開發環境好比IntelliJ IDEA 會自動加入到項目的classpath。
固然經過更新maven-clean-plugin來刪除這些生成的文件:
TIP:
完整的文檔關於Vert.x在http://vertx.io/docs/vertx-service-proxy/java/ 能夠看到
數據庫服務接口
定義一個服務接口就像定義其餘的java接口是同樣的,還須要咱們包含可使生成的代碼能夠工做的規則,和保證在Vert.x其餘的交互代碼正確。
開始咱們定義下面的接口:
1.ProxyGen註解用來觸發自動生成服務的客戶端鏈接代理。
2.Fluent註解是可選的,可是容許Fluent接口能夠返回服務的實例,這對代碼生成是很是有用的當服務被其餘的JVM語言消費的時候。
3.參數類型能夠是String,java基礎數據類型,JSON類型或者數組,任何枚舉類型或者java.util collection (List
/ Set
/ Map
) 。使用任意java類的方法是把它做爲Vert.x數據對象,使用@DataObject註解,最後使用其餘類型的就是服務應用類型。
4.既然服務提供異步的結果,服務方法的最後一個參數須要是Handler<AsyncResult<T>>,使用泛型T來適配任何自動的生成的代碼類型。
建立服務的實例和在event bus 的client代理的好的實踐是提供static方法,咱們定義了簡單的實現類和它的構造函數:
Vert.x code generator建立的proxy類帶有VertxEBProxy前綴,proxy類的構造方法須要一個Vert.x context對象和event bus地址。
NOTE:
以前的SqlQuery和ErrorCodes是內部類,如今抽取出來,是package-protected類型。
以前的WikiDatabaseVerticle實現直接提供了一個端口,如今最重要的不一樣是構造方法中支持異步的結果handler(報告初始化輸出)和他的服務方法(報告操做成功)。
下面是類的代碼:
在proxy代碼工做的最後一步:服務所在的包須要package-info.java指出定義的Vert.x模塊。
從數據庫verticle開放數據庫服務
數據庫的操做代碼多數移到WikiDatabaseServiceImpl中,WikiDatabaseVerticle如今包含兩個方法:start方法用來註冊服務和一個工具方法來加載SQL語句:
1.在這注冊服務
WikiDatabaseServiceVertxEBProxy用來接收event bus來的消息,而後轉發到WikiDatabaseServiceImpl。而後就想咱們前面的操做同樣:消息經過sction header發送調用某個特定的方法,參數被編碼成JSON格式。
獲取數據庫 service proxy
最後的步驟重構Vert.x是修改 HTTP server verticle獲取數據庫service proxy,而且使用它在handler中取代event bus。
第一,咱們須要在verticle開始的時候建立proxy:
1.咱們須要確認WikiDatabaseVerticle使用相同的event bus地址
而後,咱們須要用數據service的請求替換event bus請求
WikiDatabaseServiceVertxProxyHandler處理轉發調用event bus消息。
TIP
Vert.x service 沒有直接處理消息,而是被proxys去消費event bus的消息。
原文連接:http://vertx.io/docs/guide-for-java-devs/
個人微信公衆號: