您好,登錄后才能下訂單哦!
本篇文章給大家分享的是有關(guān)SpringCloud升級2020.0.x版中OpenFeign簡介與使用實現(xiàn)思路是怎樣的,小編覺得挺實用的,因此分享給大家學(xué)習(xí),希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。
OpenFeign 的由來和實現(xiàn)思路
在微服務(wù)系統(tǒng)中,我們經(jīng)常會進(jìn)行 RPC 調(diào)用。在 Spring Cloud 體系中,RPC 調(diào)用一般就是 HTTP 協(xié)議的調(diào)用。對于每次調(diào)用,基本都要經(jīng)過如下步驟:
找到微服務(wù)實例列表并選擇一個實例
調(diào)用參數(shù)序列化
使用 Http 客戶端將請求發(fā)送出去
響應(yīng)處理,反序列化等等
除了這些公共邏輯,業(yè)務(wù)上只需要定義參數(shù),HTTP 方法,HTTP URI,響應(yīng)就可以,也就是使用接口就能定義:
interface HttpBin { @Get(uri = "/get") String get(@Param("param") String param); }
例如上面這個接口,就定義了一個 HTTP 請求,HTTP 方法為 GET,路徑是 /get
,參數(shù)是 param
,響應(yīng)為 String
類型。之后只要定義好公共邏輯,就能使用這個接口進(jìn)行調(diào)用了。
對于這些公共邏輯的實現(xiàn)設(shè)計,我們很自然的就能想到切面與動態(tài)代理。之前的章節(jié),我們提到過 JDK 中有針對接口的動態(tài)代理,其實就是實現(xiàn) java.lang.reflect.InvocationHandler
然后針對這個接口實現(xiàn)代理類。之后使用這個代理類進(jìn)行調(diào)用即可走入 InvocationHandler
中定義的邏輯。
以上,就是 OpenFeign 的設(shè)計實現(xiàn)思路與用途。
OpenFeign 是一個基于聲明式(通過類元數(shù)據(jù)定義,例如注解等)定義的 HTTP 請求客戶端。這個庫可以讓你通過注解來自動生成調(diào)用對應(yīng) HTTP 服務(wù)的客戶端,從代碼上看調(diào)用這個遠(yuǎn)程服務(wù)和調(diào)用本地服務(wù)方法一樣。OpenFeign 支持多種 HTTP 注解,包括 Feign 注解和 JAX-RS 注解,并且可以通過配置類似于插件的形式支持不同種類的注解。同時,還可以配置編碼器,解碼器,來編碼請求并解碼響應(yīng)。底層的 HTTP Client 也是可以配置的,你可以使用 Java 原生的 Http 鏈接,也可以使用 Apache HttpClient 還有 OkHttpClient 等等。
目前 OpenFeign 還在不斷迭代更新中,可以通過這個鏈接查看當(dāng)前的 RoadMap。當(dāng)前我們使用的是 OpenFeign 11,當(dāng)前實現(xiàn)中或者計劃中的特性包括:
響應(yīng)緩存,支持進(jìn)程內(nèi)或者跨進(jìn)程響應(yīng)緩存(實現(xiàn)中)
實現(xiàn)更完善的 URI 模板支持(實現(xiàn)中)
重構(gòu) Logger 日志 API(實現(xiàn)中)
重構(gòu) Retry 重試 API(實現(xiàn)中)
采集指標(biāo)相關(guān) API(下一步要實現(xiàn))
通過 CompletableFuture 作為基礎(chǔ)類,實現(xiàn)異步 API(當(dāng)前已經(jīng)有基本實現(xiàn),下一步完整實現(xiàn))
響應(yīng)式 API (下一步要實現(xiàn))
斷路器相關(guān)支持(計劃中)
我們先來看 OpenFeign 的使用,先不關(guān)心 Spring Cloud 環(huán)境下如何使用,這樣更能理解其底層原理。單獨使用 OpenFeign 分以下幾步:
定義遠(yuǎn)程 HTTP 調(diào)用 API 接口
創(chuàng)建 Feign 代理的 HTTP 調(diào)用接口實現(xiàn)
使用代理類進(jìn)行調(diào)用
具體例子是:
interface GitHub { /** * 定義get方法,包括路徑參數(shù),響應(yīng)返回序列化類 * @param owner * @param repository * @return */ @RequestLine("GET /repos/{owner}/{repo}/contributors") List<Contributor> contributors(@Param("owner") String owner, @Param("repo") String repository); /** * 響應(yīng)體結(jié)構(gòu)類 */ 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) { //創(chuàng)建 Feign 代理的 HTTP 調(diào)用接口實現(xiàn) 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 客戶端,并自定義了響應(yīng)解碼器,反序列化了響應(yīng)體。這就是 OpenFeign 的基本使用。
我們這一節(jié)詳細(xì)介紹了 OpenFeign 的設(shè)計思路以及 RoadMap,了解這些之后,我們再來詳細(xì)分析 Openfeign,就能理解其中的一些設(shè)計以及使用思路了。并且某些重構(gòu)中的特性,我們在使用中需要格外注意,不過也不必?fù)?dān)心,因為在 Spring Cloud 中使用 OpenFeign 的特性都是通過加入膠水項目依賴實現(xiàn)的,底層 API 重構(gòu)是膠水項目需要關(guān)心的事情。
以上就是SpringCloud升級2020.0.x版中OpenFeign簡介與使用實現(xiàn)思路是怎樣的,小編相信有部分知識點可能是我們?nèi)粘9ぷ鲿姷交蛴玫降?。希望你能通過這篇文章學(xué)到更多知識。更多詳情敬請關(guān)注億速云行業(yè)資訊頻道。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。