SpringCloud升級(jí)2020.0.x版之OpenFeign簡(jiǎn)介與使用實(shí)現(xiàn)思路

本系列代碼地址:https://github.com/JoJoTec/spring-cloud-parent
OpenFeign 的由來(lái)和實(shí)現(xiàn)思路
在微服務(wù)系統(tǒng)中,我們經(jīng)常會(huì)進(jìn)行 RPC 調(diào)用。在 Spring Cloud 體系中,RPC 調(diào)用一般就是 HTTP 協(xié)議的調(diào)用。對(duì)于每次調(diào)用,基本都要經(jīng)過(guò)如下步驟:
- 找到微服務(wù)實(shí)例列表并選擇一個(gè)實(shí)例
- 調(diào)用參數(shù)序列化
- 使用 Http 客戶端將請(qǐng)求發(fā)送出去
- 響應(yīng)處理,反序列化等等
除了這些公共邏輯,業(yè)務(wù)上只需要定義參數(shù),HTTP 方法,HTTP URI,響應(yīng)就可以,也就是使用接口就能定義:
interface HttpBin {
@Get(uri = "/get")
String get(@Param("param") String param);
}
例如上面這個(gè)接口,就定義了一個(gè) HTTP 請(qǐng)求,HTTP 方法為 GET,路徑是 /get,參數(shù)是 param,響應(yīng)為 String 類(lèi)型。之后只要定義好公共邏輯,就能使用這個(gè)接口進(jìn)行調(diào)用了。
對(duì)于這些公共邏輯的實(shí)現(xiàn)設(shè)計(jì),我們很自然的就能想到切面與動(dòng)態(tài)代理。之前的章節(jié),我們提到過(guò) JDK 中有針對(duì)接口的動(dòng)態(tài)代理,其實(shí)就是實(shí)現(xiàn) java.lang.reflect.InvocationHandler 然后針對(duì)這個(gè)接口實(shí)現(xiàn)代理類(lèi)。之后使用這個(gè)代理類(lèi)進(jìn)行調(diào)用即可走入 InvocationHandler 中定義的邏輯。
以上,就是 OpenFeign 的設(shè)計(jì)實(shí)現(xiàn)思路與用途。
OpenFeign 簡(jiǎn)介
OpenFeign 是一個(gè)基于聲明式(通過(guò)類(lèi)元數(shù)據(jù)定義,例如注解等)定義的 HTTP 請(qǐng)求客戶端。這個(gè)庫(kù)可以讓你通過(guò)注解來(lái)自動(dòng)生成調(diào)用對(duì)應(yīng) HTTP 服務(wù)的客戶端,從代碼上看調(diào)用這個(gè)遠(yuǎn)程服務(wù)和調(diào)用本地服務(wù)方法一樣。OpenFeign 支持多種 HTTP 注解,包括 Feign 注解和 JAX-RS 注解,并且可以通過(guò)配置類(lèi)似于插件的形式支持不同種類(lèi)的注解。同時(shí),還可以配置編碼器,解碼器,來(lái)編碼請(qǐng)求并解碼響應(yīng)。底層的 HTTP Client 也是可以配置的,你可以使用 Java 原生的 Http 鏈接,也可以使用 Apache HttpClient 還有 OkHttpClient 等等。
目前 OpenFeign 還在不斷迭代更新中,可以通過(guò)這個(gè)鏈接查看當(dāng)前的 RoadMap。當(dāng)前我們使用的是 OpenFeign 11,當(dāng)前實(shí)現(xiàn)中或者計(jì)劃中的特性包括:
- 響應(yīng)緩存,支持進(jìn)程內(nèi)或者跨進(jìn)程響應(yīng)緩存(實(shí)現(xiàn)中)
- 實(shí)現(xiàn)更完善的 URI 模板支持(實(shí)現(xiàn)中)
- 重構(gòu) Logger 日志 API(實(shí)現(xiàn)中)
- 重構(gòu) Retry 重試 API(實(shí)現(xiàn)中)
- 采集指標(biāo)相關(guān) API(下一步要實(shí)現(xiàn))
- 通過(guò) CompletableFuture 作為基礎(chǔ)類(lèi),實(shí)現(xiàn)異步 API(當(dāng)前已經(jīng)有基本實(shí)現(xiàn),下一步完整實(shí)現(xiàn))
- 響應(yīng)式 API (下一步要實(shí)現(xiàn))
- 斷路器相關(guān)支持(計(jì)劃中)
OpenFeign 基本使用
我們先來(lái)看 OpenFeign 的使用,先不關(guān)心 Spring Cloud 環(huán)境下如何使用,這樣更能理解其底層原理。單獨(dú)使用 OpenFeign 分以下幾步:
- 定義遠(yuǎn)程 HTTP 調(diào)用 API 接口
- 創(chuàng)建 Feign 代理的 HTTP 調(diào)用接口實(shí)現(xiàn)
- 使用代理類(lèi)進(jìn)行調(diào)用
具體例子是:
interface GitHub {
/**
* 定義get方法,包括路徑參數(shù),響應(yīng)返回序列化類(lèi)
* @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)類(lèi)
*/
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)用接口實(shí)現(xiàn)
GitHub github = Feign.builder()
//指定解碼器為 FastJsonDecoder
.decoder(new FastJsonDecoder())
//指定代理類(lèi)為 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);
}
}
在上面這個(gè)例子中,我們定義了訪問(wèn) GET https://api.github.com/repos/{owner}/{repo}/contributors 這個(gè)接口的 OpenFeign 客戶端,并自定義了響應(yīng)解碼器,反序列化了響應(yīng)體。這就是 OpenFeign 的基本使用。

我們這一節(jié)詳細(xì)介紹了 OpenFeign 的設(shè)計(jì)思路以及 RoadMap,了解這些之后,我們?cè)賮?lái)詳細(xì)分析 Openfeign,就能理解其中的一些設(shè)計(jì)以及使用思路了。并且某些重構(gòu)中的特性,我們?cè)谑褂弥行枰裢庾⒁?,不過(guò)也不必?fù)?dān)心,因?yàn)樵?Spring Cloud 中使用 OpenFeign 的特性都是通過(guò)加入膠水項(xiàng)目依賴實(shí)現(xiàn)的,底層 API 重構(gòu)是膠水項(xiàng)目需要關(guān)心的事情。
到此這篇關(guān)于SpringCloud升級(jí)2020.0.x版之OpenFeign簡(jiǎn)介與使用實(shí)現(xiàn)思路的文章就介紹到這了,更多相關(guān)SpringCloud OpenFeign簡(jiǎn)介與使用內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- SpringCloud?OpenFeign?服務(wù)調(diào)用傳遞?token的場(chǎng)景分析
- SpringCloud OpenFeign超詳細(xì)講解模板化遠(yuǎn)程通信的實(shí)現(xiàn)
- springcloud引入spring-cloud-starter-openfeign失敗的解決
- 一篇文章教你如何在SpringCloud項(xiàng)目中使用OpenFeign
- 完美解決SpringCloud-OpenFeign使用okhttp替換不生效問(wèn)題
- SpringCloud OpenFeign Post請(qǐng)求400錯(cuò)誤解決方案
- SpringCloud OpenFeign超時(shí)控制示例詳解
相關(guān)文章
springboot 排除redis的自動(dòng)配置操作
這篇文章主要介紹了springboot 排除redis的自動(dòng)配置操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-07-07
Java自定義協(xié)議報(bào)文封裝 添加Crc32校驗(yàn)的實(shí)例
下面小編就為大家分享一篇Java自定義協(xié)議報(bào)文封裝 添加Crc32校驗(yàn)的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-01-01
SpringBoot創(chuàng)建JSP登錄頁(yè)面功能實(shí)例代碼
這篇文章主要介紹了SpringBoot創(chuàng)建JSP登錄頁(yè)面功能實(shí)例代碼,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2017-04-04
詳解java數(shù)組進(jìn)行翻轉(zhuǎn)的方法有哪些
這篇文章主要介紹了詳解java數(shù)組進(jìn)行翻轉(zhuǎn)的方法有哪些,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-01-01
Java List簡(jiǎn)介_(kāi)動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
Java中可變數(shù)組的原理就是不斷的創(chuàng)建新的數(shù)組,將原數(shù)組加到新的數(shù)組中,下文對(duì)Java List用法做了詳解。需要的朋友參考下吧2017-05-05
詳細(xì)分析Java內(nèi)部類(lèi)——局部?jī)?nèi)部類(lèi)
這篇文章主要介紹了Java局部?jī)?nèi)部類(lèi)的相關(guān)資料,幫助大家更好的理解和學(xué)習(xí)Java 內(nèi)部類(lèi)的知識(shí),感興趣的朋友可以了解下2020-08-08
dubbo新手學(xué)習(xí)之事件通知實(shí)踐教程
這篇文章主要給大家介紹了關(guān)于dubbo新手學(xué)習(xí)之事件通知實(shí)踐的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-09-09

