使用Apache Ignite的Service grid作為微服務開發架構, 通常是如下定義和實作Service的:
本文将實作如下樣式的Service,使其異步化:
目前ignite對上邊這樣的異步的service方法并沒有remote支援。當調用端與服務部署再同一節點時,ignite會發起一個本地方法調用,這樣是沒有問題的,但是當服務部署端與調用端在不同節點時,ignite通過發起一個distributed task,将調用通過消息方式釋出到服務部署節點,由于服務實作是異步的,通常來說,會傳回一個未完成狀态的CompletionStage,後續當真正complete的時候,調用端的CompletionStage并不會被notify,即調用端永遠無法得到真正的調用結果。
為了能夠支援CompletionStage的遠端狀态專遞,我們需要對ignite進行如下改動:
這段代碼做了如下的事情:檢測當服務方法傳回值是一個CompletionStage的時候,則建立一個CompletableFuture作為代理對象傳回給調用端。随後監聽服務的遠端調用的結果,并且用這個結果來更新這個CompletableFuture。到這裡,調用端的service proxy的改造就完成了。接下來,我們還需要改造服務節點這一端:
這裡做的事情是:當在服務部署節點上拿到執行結果的時候,如果發現服務傳回結果是一個CompletionStage,那麼處理這個CompletionStage的exceptionally和thenAccept, 把結果發送給remote的調用端。
就這樣,通過簡單的改裝,我們使ignite有了處理異步服務方法調用的能力。下邊我們實作一個服務來看看改裝結果:
然後将服務部署在Service grid中:
然後啟動一個用戶端節點進行服務調用:
輸出結果:
可以看到先輸出了sync的結果,大約3秒後輸出async的結果。