SpringCloud升級2020.0.x版之OpenFeign簡介與使用實現思路
本系列代碼地址:https://github.com/JoJoTec/spring-cloud-parent
OpenFeign 的由來和實現思路
在微服務系統中,我們經常會進行 RPC 調用。在 Spring Cloud 體系中,RPC 調用一般就是 HTTP 協議的調用。對於每次調用,基本都要經過如下步驟:
- 找到微服務實例列表並選擇一個實例
- 調用參數序列化
- 使用 Http 客戶端將請求發送出去
- 響應處理,反序列化等等
除瞭這些公共邏輯,業務上隻需要定義參數,HTTP 方法,HTTP URI,響應就可以,也就是使用接口就能定義:
interface HttpBin { @Get(uri = "/get") String get(@Param("param") String param); }
例如上面這個接口,就定義瞭一個 HTTP 請求,HTTP 方法為 GET,路徑是 /get
,參數是 param
,響應為 String
類型。之後隻要定義好公共邏輯,就能使用這個接口進行調用瞭。
對於這些公共邏輯的實現設計,我們很自然的就能想到切面與動態代理。之前的章節,我們提到過 JDK 中有針對接口的動態代理,其實就是實現 java.lang.reflect.InvocationHandler
然後針對這個接口實現代理類。之後使用這個代理類進行調用即可走入 InvocationHandler
中定義的邏輯。
以上,就是 OpenFeign 的設計實現思路與用途。
OpenFeign 簡介
OpenFeign 是一個基於聲明式(通過類元數據定義,例如註解等)定義的 HTTP 請求客戶端。這個庫可以讓你通過註解來自動生成調用對應 HTTP 服務的客戶端,從代碼上看調用這個遠程服務和調用本地服務方法一樣。OpenFeign 支持多種 HTTP 註解,包括 Feign 註解和 JAX-RS 註解,並且可以通過配置類似於插件的形式支持不同種類的註解。同時,還可以配置編碼器,解碼器,來編碼請求並解碼響應。底層的 HTTP Client 也是可以配置的,你可以使用 Java 原生的 Http 鏈接,也可以使用 Apache HttpClient 還有 OkHttpClient 等等。
目前 OpenFeign 還在不斷迭代更新中,可以通過這個鏈接查看當前的 RoadMap。當前我們使用的是 OpenFeign 11,當前實現中或者計劃中的特性包括:
- 響應緩存,支持進程內或者跨進程響應緩存(實現中)
- 實現更完善的 URI 模板支持(實現中)
- 重構 Logger 日志 API(實現中)
- 重構 Retry 重試 API(實現中)
- 采集指標相關 API(下一步要實現)
- 通過 CompletableFuture 作為基礎類,實現異步 API(當前已經有基本實現,下一步完整實現)
- 響應式 API (下一步要實現)
- 斷路器相關支持(計劃中)
OpenFeign 基本使用
我們先來看 OpenFeign 的使用,先不關心 Spring Cloud 環境下如何使用,這樣更能理解其底層原理。單獨使用 OpenFeign 分以下幾步:
- 定義遠程 HTTP 調用 API 接口
- 創建 Feign 代理的 HTTP 調用接口實現
- 使用代理類進行調用
具體例子是:
interface GitHub { /** * 定義get方法,包括路徑參數,響應返回序列化類 * @param owner * @param repository * @return */ @RequestLine("GET /repos/{owner}/{repo}/contributors") List<Contributor> contributors(@Param("owner") String owner, @Param("repo") String repository); /** * 響應體結構類 */ class Contributor { String login; int contributions; public Contributor() { } public String getLogin() { return login; } public void setLogin(String login) { this.login = login; } public int getContributions() { return contributions; } public void setContributions(int contributions) { this.contributions = contributions; } } } public static void main(String[] args) { //創建 Feign 代理的 HTTP 調用接口實現 GitHub github = Feign.builder() //指定解碼器為 FastJsonDecoder .decoder(new FastJsonDecoder()) //指定代理類為 GitHub,基址為 https://api.github.com .target(GitHub.class, "https://api.github.com"); List<GitHub.Contributor> contributors = github.contributors("OpenFeign", "feign"); } /** * 基於 FastJson 的反序列化解碼器 */ static class FastJsonDecoder implements Decoder { @Override public Object decode(Response response, Type type) throws IOException, DecodeException, FeignException { //讀取 body byte[] body = response.body().asInputStream().readAllBytes(); return JSON.parseObject(body, type); } }
在上面這個例子中,我們定義瞭訪問 GET https://api.github.com/repos/{owner}/{repo}/contributors
這個接口的 OpenFeign 客戶端,並自定義瞭響應解碼器,反序列化瞭響應體。這就是 OpenFeign 的基本使用。
我們這一節詳細介紹瞭 OpenFeign 的設計思路以及 RoadMap,瞭解這些之後,我們再來詳細分析 Openfeign,就能理解其中的一些設計以及使用思路瞭。並且某些重構中的特性,我們在使用中需要格外註意,不過也不必擔心,因為在 Spring Cloud 中使用 OpenFeign 的特性都是通過加入膠水項目依賴實現的,底層 API 重構是膠水項目需要關心的事情。
到此這篇關於SpringCloud升級2020.0.x版之OpenFeign簡介與使用實現思路的文章就介紹到這瞭,更多相關SpringCloud OpenFeign簡介與使用內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- 一文教你如何使用原生的Feign
- 剖析SpringCloud Feign中所隱藏的坑
- Spring Cloud OpenFeign 遠程調用
- 一篇文章教你如何在SpringCloud項目中使用OpenFeign
- 使用FeignClient設置動態Url