我現在要使用yarn的兩個接口,一個是application 清單,一個是根據appid擷取這個app的詳情。對應的接口大約如此:
基于httpclient的一個典型封裝如下:
更詳細的代碼可以參看我以前的開源項目裡的實作:httptransportservice.java
然而這種使用比較原始,不直覺。
大緻使用方法如下:
是以一般如果提供了http 接口的項目都會給你一個sdk,友善你做調用,幫你屏蔽掉http的細節。
總體而言你有如下幾種選擇:
直接使用上面的封裝
使用第三方sdk
自己再做一些封裝,轉化為普通的方法調用
第三種方案一般會是這樣:
雖然麻煩了些,但是調用者會比較幸福。
隻要三步,就可以實作第三個方案:
定義一個接口
擷取這個接口的引用
盡情使用
定義一個接口:
at 注解定義了 path路徑以及action method。 方法參數決定了傳遞的參數。
對于同一個http接口,你也可以定義多個方法。比如,
這樣你直接調用runningapps 就可以拿到特定狀态的應用,而無需傳遞參數。如果參數較多,你還可以指定哪些參數不傳,哪些傳。
接着初始化 yarncontroller,獲得對象的引用,代碼如下:
hostandport 是yarn的位址
firstmeetproxystrategy 指定如果後端有多個執行個體時的通路政策
restclient.transportservice 就是我上面的最基礎的封裝httptransportservice
理論上後面兩個參數可以不用傳遞
這個時候你就可以直接使用獲得的yarncontroller對象了。具體使用方式如下:
上面就是你要做的所有工作,系統自動幫你實作了http調用。
前面的放回結果是個list[sresponse]對象。我希望它是個bean對象。是以我定義一個bean類:
然後引入一個隐式轉換
result("apps")("app") //這樣就能拿到list[yarnapplication]
sreponseconvertor 給list[sreponse]對象添加了一個新的extract 方法。當然前提是list[sreponse] 裡是一個json格式的資料。
因為yarn的接口傳回的格式比較詭異,嵌套了兩層,第一層是apps,第二層是app,第三層才是具體的list對象。是以有了上面的複雜形态。那我如何簡化呢?每次調用都這麼搞,太複雜了。
那麼自己實作一個隐式轉換就行了,定義一個yarncontrollere類,
現在你可以很帥氣這樣調用了:
這樣我們就可以像rpc一樣通路一個http接口了。
核心代碼其實是這個: