1. 程式人生 > >擼了一個 Feign 增強包

擼了一個 Feign 增強包

![](https://i.loli.net/2020/07/28/uA1BmwnQNs3GXHS.jpg) # 前言 最近準備將公司的一個核心業務系統用 `Java` 進行重構,大半年沒寫 `Java` ,`JDK` 都更新到 14 了,考慮到穩定性等問題最終還是選擇的 `JDK11`。 在整體架構選型時,由於是一個全新的系統,所以沒有歷史包袱,同時團隊中也有多位大牛坐鎮,因此我們的選項便大膽起來。 最終結果就是直接一把梭,直接上未來的大趨勢:`Service Mesh`,直接把什麼 `SpringCloud`、`Dubbo` 這類分散式框架全部幹掉。 本次的重點不是討論 `Service Mesh` 是什麼、能解決什麼問題、為什麼選擇它,畢竟我也在學習階段,啥時候整明白線上也穩定了再和大家來交流。 # 問題 既然方向定了就開始實際擼碼了,不過剛一開始就驗證了”理想很豐滿、現實很骨感“; 由於我們去掉了 `SpringCloud` 和 `Dubbo` 這類框架,服務的註冊、發現、負載均衡等需求全部都下沉到 `Service Mesh` 中提供了。 但對於開發來說依然希望可以呼叫本地方法的方式來呼叫遠端服務,這在 `SpringCloud` 這類框架中是很容易實現的,框架本身就有很好的支援。 回到我們這個場景,需求其實很簡單,就是想達到 `SpringCloud` 中的 `Feign` 這樣的宣告式+註解的方式呼叫。 ![](https://i.loli.net/2020/07/28/xnIo8mQbjHfURZg.jpg) ```java @Autowired private StoreClient client ; Store store = client.update(1, store) ``` 使用 `spring-cloud-openfeign` 這個包其實就能實現上述的需求了,但這樣會引入一些我們根本不會使用的 `SpringCloud` 的相關依賴,讓人感覺”不乾淨了“;同時也和 `Service Mesh` 的理念相反,其中的一大目的就是要降低這類框架的侵入性。 --- 其實 `spring-cloud-openfeign` 的核心就是 [Feign](https://github.com/OpenFeign/feign),本身它也是可以開箱即用的,所以便嘗試看 `Feign` 自己是否支援這樣的用法。 ![](https://i.loli.net/2020/07/28/TXLH9rFSNyp1x4I.jpg) 通過官方文件可以得知:是可以定義介面的形式來呼叫遠端介面的,但它本質上是不依賴其他庫便可以使用,所以它本身是沒有和 `Spring` 整合也是合情合理,但也就造成了沒有現成庫可供我們使用。 > 我們自然是不想寫上圖紅框處的程式碼的,希望所有介面直接注入就可以使用。 # 使用 因此結合以上的需求便有了這個庫 [feign-plus](https://github.com/crossoverJie/feign-plus) 它的使用流程其實就是翻版的 `spring-cloud-openfeign`: ```java @FeignPlusClient(name = "github", url = "${github.url}") public interface Github { @RequestLine("GET /repos/{owner}/{repo}/contributors") List