天天看點

五分鐘為HTTP接口提供Java/Scala SDK

我現在要使用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接口了。

核心代碼其實是這個: