精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

原來OpenFeign功能這么強大,你知道嗎?

開發 前端
本文介紹了OpenFeign的基本使用方法,包括如何引入依賴、如何定義接口、如何構建客戶端、如何自定義攔截器、重試器等。

OpenFeign是Spring微服務全家桶中的重要組件。前身是Netflix Feign,在2013年首次發布。2016年,Netflix發布了Feign的最后一個版本(8.18.0),并將其捐贈給開源社區,隨后Feign更名為OpenFeign,于同年發布了OpenFeign的首個版本(9.0.0)。在2017年,Spring Cloud團隊將對Feign的依賴升級為OpenFeign。

圖片圖片

OpenFeign和Netflix Feign

為了避免歧義,文中提到的Feign或OpenFeign,都是指 OpenFeign。

OpenFeign是Netflix團隊開發的一個聲明式、模板化的 Web 服務客戶端,目標是開發一種簡單、優雅的 HTTP 服務客戶端。在設計時,借鑒了各種優秀類庫,比如Retrofit、 JAXRS-2.0、WebSocket等。

通過OpenFeign,我們可以像調用方法一樣實現HTTP API訪問。

本文將介紹如何使用原生的 OpenFeign,原生的使用方式,不是集成在Spring Cloud中的使用方式。

來,一起來。

先來個簡單的例子

引入依賴

OpenFeign很貼心的提供了BOM,我們可以直接使用控制組件版本。

<project>
    ……
    <properties>
        <openfeign.version>13.4</openfeign.version>
    </properties>
    
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>io.github.openfeign</groupId>
                <artifactId>feign-bom</artifactId>
                <version>${openfeign.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>
</project>

我這里使用的是13.4版本(學習的時候就得學新的,新的bug少)。

然后引入core模塊:

<dependency>
    <groupId>io.github.openfeign</groupId>
    <artifactId>feign-core</artifactId>
</dependency>

有了前面的BOM,后面的模塊就不用指定版本了。

定義接口

private interface Client {
    @RequestLine("GET /anything/{anything}")
    @Headers({"Content-Type: application/json"})
    String anything(@Param("anything") String anything);
}

為了調用方便,我們借助https://httpbin.org提供的HTTP API接口anything用來驗證,這個接口會返回傳入的參數。這樣也方便我們檢查調用是否正常。

創建客戶端

final Client client = Feign.builder()
        .logLevel(Level.FULL)
        .target(Client.class, "https://httpbin.org");
final String anything = client.anything("testCore");
Assertions.assertNotNull(anything);
Assertions.assertTrue(anything.contains("testCore"));
System.out.println(anything);

是不是非常簡單,通過建造器模式簡單配置下參數,定義接口的域名,然后就像調用本地方法一樣調用接口,然后就拿到返回值了。

OpenFeign提供了很多的擴展口,比如日志、解析器、攔截器、編碼器、錯誤處理器等,可以通過builder方法進行配置。

自定義編解碼器

OpenFeign提供了12種編解碼器,默認使用的是字符串編解碼器,如果需要自定義編解碼器,可以通過builder方法進行配置。

比如,我們想要使用Jackson實現:

我們先引入feign-jackson模塊:

<dependency>
    <groupId>io.github.openfeign</groupId>
    <artifactId>feign-jackson</artifactId>
</dependency>

然后在建造器參數指定JacksonDecoder和JacksonEncoder:

final Client client = Feign.builder()
        .logLevel(Level.FULL)
        .decoder(new JacksonDecoder())
        .encoder(new JacksonEncoder())
        .target(Client.class, "https://httpbin.org");
final Map<String, Object> requestBody = Map.of("k1", "value1", "k2", "value2");
final Map<String, Object> anythingResult = client.anythingJson("testJson", requestBody);

如果想要換成Gson,引入feign-gson模塊,在建造器參數替換為GsonDecoder和GsonEncoder就行。

還有JAXB、Moshi、Fashjson、SAX等一種編解碼器可以使用。

自定義客戶端

OpenFeign默認的客戶端是Java提供的HttpURLConnection,如果需要自定義客戶端,可以通過builder方法進行配置。

比如,我們想要使用OkHttp,可以先引入feign-okhttp模塊:

<dependency>
    <groupId>io.github.openfeign</groupId>
    <artifactId>feign-okhttp</artifactId>
</dependency>

然后通過client方法替換:

final Client client = Feign.builder()
        .logLevel(Level.FULL)
        .decoder(new JacksonDecoder())
        .encoder(new JacksonEncoder())
        .client(new OkHttpClient())
        .target(Client.class, "https://httpbin.org");
final Map<String, Object> anythingResult = client.anythingJsonBodyTemplate("testJson", "value1", "value2");

此時使用的就是OkHttpClient了。

OpenFeign還支持Apache HTTP、Apache HC5、Google HTTP、Java11 HTTP2、Ribbon。

自定義攔截器

攔截器可以對請求和響應進行攔截處理,比如打印日志、添加請求頭、添加簽名等,可以使用requestInterceptor自定義攔截器。

首先,定義我們自己的攔截器,比如我們在請求頭中添加一個自定義的header:

public class MyRequestInterceptor implements RequestInterceptor {
    @Override
    public void apply(RequestTemplate template) {
        template.header("my-header", "my-value");
    }
}

然后指定攔截器:

final Client client = Feign.builder()
        .logLevel(Level.FULL)
        .decoder(new JacksonDecoder())
        .encoder(new JacksonEncoder())
        .requestInterceptor(new MyRequestInterceptor())
        .target(Client.class, "https://httpbin.org");
final Map<String, Object> anythingResult = client.anythingJsonBodyTemplate("testJson", "value1", "value2");
System.out.println(anythingResult);

Assertions.assertNotNull(anythingResult);
Assertions.assertTrue(anythingResult.get("url") instanceof String);
Assertions.assertTrue(((String) anythingResult.get("url")).endsWith("testJson"));
Assertions.assertTrue(anythingResult.containsKey("json"));
Assertions.assertTrue(anythingResult.get("json") instanceof Map<?, ?>);

Assertions.assertTrue(anythingResult.containsKey("headers"));
boolean hasMyHeader = false;
if (anythingResult.get("headers") instanceof Map headers) {
    for (Object key : headers.keySet()) {
        if (key.toString().equalsIgnoreCase("my-header")) {
            hasMyHeader = true;
            final Object value = headers.get(key);
            Assertions.assertTrue(value instanceof String);
            Assertions.assertEquals("my-value", value);
        }
    }
}
Assertions.assertTrue(hasMyHeader);

訪問anything接口時會把請求頭的信息返回回來,說明攔截器執行成功了。

自定義重試器

OpenFeign默認的重試器是feign.Retryer.Default,共重試5次,每次間隔步長為1.5的(重試次數-1)次冪,間隔最大1秒。

如果想要自定義重試邏輯,我們可以自己實現。

public class MyRetryer implements Retryer {
    int attempt = 0;

    @Override
    public void continueOrPropagate(RetryableException e) {
        if (attempt++ >= 3) {
            throw e;
        }
        System.out.println("重試第:" + attempt + "次");
        try {
            TimeUnit.MILLISECONDS.sleep(100);
        } catch (InterruptedException ex) {
             Thread.currentThread().interrupt();
            throw new RuntimeException(ex);
        }
    }

    @Override
    public Retryer clone() {
        return new MyRetryer();
    }
}

然后通過retryer方法指定。

final Client client = Feign.builder()
        .logLevel(Level.FULL)
        .decoder(new JacksonDecoder())
        .encoder(new JacksonEncoder())
        .retryer(new MyRetryer())
        // 默認是 feign.Retryer.Default
        // 可以指定不重試 feign.Retryer.NEVER_RETRY
        .target(Client.class, "https://httpbin.abc");
Assertions.assertThrowsExactly(RetryableException.class, () -> client.codes("500"));

需要強調一下,只有訪問HTTP時出現了IO異常才會重試,如果接口正常返回了,只不過不是200之類的正常響應,不會進重試邏輯。示例中把域名寫錯了,屬于IO異常,會重試3次。

如果不想重試,可以指定為feign.Retryer.NEVER_RETRY。

使用Spring的注解

OpenFeign接口定義使用的是URL模板,具體協議可以參https://www.rfc-editor.org/rfc/rfc6570.html。

大部分人對這個協議有些陌生,但是對Spring的注解比較屬性,所以OpenFeign也貼心的提供了Spring契約適配。

首先,引入spring模塊依賴:

<dependency>
    <groupId>io.github.openfeign</groupId>
    <artifactId>feign-spring</artifactId>
</dependency>

這種方式引入的是Spring 6.x,如果想要使用Spring 4.x,可以引入feign-spring4模塊。

然后使用Spring MVC注解定義接口:

@PostMapping(value = "/anything/{anything}",
        produces = "application/json", consumes = "application/json")
Map<String, Object> anythingJsonSpring(@PathVariable("anything") String anything,
        @RequestParam("p1") String p1,
        @RequestParam("p2") String p2,
        @RequestBody Map<String, Object> requestBody);

構建客戶端的時候,需要使用contract指定是Spring的契約:

final SpringClient client = Feign.builder()
        .logLevel(Level.FULL)
        .decoder(new JacksonDecoder())
        .encoder(new JacksonEncoder())
        .contract(new SpringContract())
        .target(SpringClient.class, "https://httpbin.org");
final Map<String, Object> requestBody = Map.of("k1", "value1", "k2", "value2");
final Map<String, Object> anythingResult = client.anythingJsonSpring("testJson",
        "param1", "param2", requestBody);

這樣就可以正常運行了。

文末總結

本文介紹了OpenFeign的基本使用方法,包括如何引入依賴、如何定義接口、如何構建客戶端、如何自定義攔截器、重試器等。

OpenFeign的入門篇結束,后續我們將介紹OpenFeign的更多功能,比如錯誤處理器、熔斷器、監控等。

圖片圖片

責任編輯:武曉燕 來源: 看山的小屋
相關推薦

2022-06-06 08:31:05

Base64編碼Base58

2019-12-30 09:51:35

Word設計模式軟件

2023-11-02 10:22:29

gRPC后端通信

2023-08-30 07:39:16

PawSQL數據庫

2020-12-24 18:44:34

RSA加密算法

2024-03-26 10:10:45

JavaScript操作符操作表達式

2022-09-07 09:01:14

JS操作符運算符

2021-01-04 14:16:01

小程序地圖騰訊

2024-04-07 00:00:00

ESlint命令變量

2024-05-28 09:12:10

2023-04-26 10:21:04

2024-04-30 09:02:48

2023-12-12 08:41:01

2023-12-20 08:23:53

NIO組件非阻塞

2018-04-24 15:40:39

無線路由器無線網絡上網

2021-07-29 06:55:03

Spring@AutowriedbyType注入

2022-12-02 14:12:52

新能源汽車海爾

2020-02-20 08:30:49

OSPF網絡協議路由協議

2022-11-28 00:04:17

2024-07-08 00:00:01

多線程ThreadC#
點贊
收藏

51CTO技術棧公眾號

av黄色在线看| 波多野结衣av在线免费观看| 羞羞电影在线观看www| 国产91精品在线观看| 992tv成人免费影院| 国产美女精品久久| 亚洲18在线| 亚洲一区二区三区小说| 日本免费高清不卡| 亚洲经典一区二区三区| 视频在线观看一区二区三区| 久久激情五月丁香伊人| 久草视频福利在线| 日本久久久久| 欧美日韩色婷婷| 色女人综合av| 日本xxxxxwwwww| 久久精品久久精品| 欧美一区二区三区精品电影| 亚洲综合图片一区| 日韩成人一级| 日韩一区二区在线看片| 99视频精品免费| 不卡av免费观看| 国产精品成人免费精品自在线观看| 久久躁狠狠躁夜夜爽| 素人fc2av清纯18岁| 精品麻豆剧传媒av国产九九九| 国产午夜亚洲精品午夜鲁丝片| 国产69精品99久久久久久宅男| 无码人妻少妇色欲av一区二区| 2021国产在线| 中文字幕第一区二区| 国产欧美日韩亚洲| 国产情侣av在线| 久久不射网站| 国内免费久久久久久久久久久| 国产精品第七页| 日韩中文字幕在线一区 | 肉色超薄丝袜脚交69xx图片| 久久99国产精品久久99大师| 欧美一区二区在线免费播放| 国产免费又粗又猛又爽| 久久r热视频| 精品久久香蕉国产线看观看gif| 国产一区二区无遮挡| 一级做a爱片久久毛片| 久久激情久久| 欧美影院在线播放| 欧美一区二区三区四| 激情文学一区| 欧美激情a∨在线视频播放 | 久久精品欧美日韩| 久久国产精品高清| 丰满熟女一区二区三区| 国产福利一区二区三区视频| 91在线观看免费网站| 一级黄色片网站| 久久电影国产免费久久电影| 国产精品久久久久久久天堂| 夜夜爽妓女8888视频免费观看| 久久美女精品| 丝袜亚洲另类欧美重口| 日本不卡一区视频| 国产精品精品| 操人视频在线观看欧美| 成年人av电影| 激情五月***国产精品| 欧美激情综合亚洲一二区| 国产精品suv一区二区| 在线免费观看欧美| 国产91av在线| 在线观看免费视频a| 美女100%一区| 91国偷自产一区二区开放时间| 一道本在线观看视频| 成人免费看片| 一二三四社区欧美黄| 亚洲熟妇无码另类久久久| 樱桃视频成人在线观看| 欧美日韩精品欧美日韩精品一| 欧美一级视频在线播放| 亚洲精品一区| 欧美色窝79yyyycom| 在线播放免费视频| 国产suv精品一区二区四区视频| 欧美日韩日本视频| 免费欧美一级片| 国产精品xxxav免费视频| 日韩高清人体午夜| 亚洲女人毛茸茸高潮| 欧美影视一区| 日本精品一区二区三区在线| 一级片视频免费| 国产成人8x视频一区二区| 久久久久久亚洲精品不卡4k岛国| 国产又粗又猛又黄又爽| 国产成人综合视频| 久久亚洲免费| 麻豆tv免费在线观看| 亚洲成人资源在线| 男操女免费网站| 都市激情亚洲| 色黄久久久久久| 国产精品suv一区二区| 青青青爽久久午夜综合久久午夜| 久久久在线免费观看| 国产精品免费无遮挡无码永久视频| 国内久久精品| 国产精品久久久久久久久久ktv| 国产精品第二十页| 蜜臀久久久久久久| 国内一区在线| 粗大黑人巨茎大战欧美成人| 午夜精品爽啪视频| 天天色天天综合网| 久久91成人| 久久久久久久香蕉网| 中文字幕欧美在线观看| 99久久综合狠狠综合久久| 午夜啪啪免费视频| 欧洲成人一区| 日韩av在线导航| 希岛爱理中文字幕| 日本不卡免费在线视频| 国外成人在线视频网站| 成人影院在线观看| 欧美亚洲禁片免费| 91人妻一区二区| 精品产国自在拍| 91精品国产91久久久久久| 国产高中女学生第一次| 亚洲欧洲一区二区三区| 午夜免费福利在线| 国产精品一区二区三区av麻| 亚州成人av在线| 超碰在线人人干| 亚洲免费观看高清完整版在线观看熊 | 中文字幕免费不卡| 红桃av在线播放| 国产成人在线中文字幕| 欧美成人高清视频| 在线视频 中文字幕| 欧美激情一区三区| 国产精品动漫网站| 亚洲丁香日韩| 青草成人免费视频| 午夜视频福利在线观看| 亚洲成a人片综合在线| 91精品国产高清91久久久久久| 日本一区福利在线| 96精品视频在线| 天堂网www中文在线| 激情成人在线视频| 成人网站免费观看| 久久精品系列| 日韩精品一区二区三区四区五区| 日本成a人片在线观看| 欧美日本视频在线| 日韩在线视频网址| 国产激情偷乱视频一区二区三区| 久久精品日产第一区二区三区| 成年人在线观看| 欧美日韩一区二区三区免费看| 国产免费a级片| 日韩亚洲精品在线| 欧美一区视久久| 本网站久久精品| 久久精品美女视频网站| 国产精品高潮呻吟av| 伊人开心综合网| 日本不卡视频一区| 国产欧美丝祙| 亚洲欧美日韩国产yyy| 久久久91麻豆精品国产一区| 久久久久在线观看| 国产一区电影| 在线播放中文字幕一区| 九九热精彩视频| 99久久精品情趣| 在线观看国产中文字幕| 欧美二区视频| 久久天天狠狠| 日韩成人精品一区二区三区| 欧美寡妇偷汉性猛交| 青青青手机在线视频观看| 欧美日韩一区成人| 久热精品在线观看| 久久午夜色播影院免费高清| 男生操女生视频在线观看 | 国产免费一区二区三区四区五区| 国产·精品毛片| 国产免费毛卡片| 久久在线播放| 国产尤物99| 欧美视频免费看| 欧美肥婆姓交大片| 东凛在线观看| 亚洲成年网站在线观看| a片在线免费观看| 一区二区成人在线| 神马久久久久久久久久久| 国产成人av一区二区三区在线观看| 中文字幕日韩精品一区二区| 第四色在线一区二区| 国产极品jizzhd欧美| 蜜臀av国内免费精品久久久夜夜| 在线不卡免费欧美| 青青草免费观看视频| 亚洲欧美日韩成人高清在线一区| 最新免费av网址| 国产一区二区你懂的| 小泽玛利亚av在线| av亚洲免费| 乱一区二区三区在线播放| 亚洲伊人伊成久久人综合网| 日本韩国在线不卡| 超碰在线最新网址| 久久精品视频亚洲| 91精品国产综合久久久久久豆腐| 9191久久久久久久久久久| 亚洲av无码精品一区二区| 一区二区三区日本| 亚洲精品电影院| 国产精品女同一区二区三区| 国产三级国产精品| 从欧美一区二区三区| 樱花草www在线| 黄色小说综合网站| 久久这里只精品| 日韩精品久久理论片| 国产成人无码精品久久久性色| 九九久久精品| 精品在线视频一区二区| 免费观看亚洲天堂| 成人做爽爽免费视频| 国产极品一区| 国产精品网红福利| 欧美精选视频一区二区| 日本精品久久久久影院| 无码小电影在线观看网站免费| 国产一区二区三区视频在线观看| 国产精品一品二区三区的使用体验| 一区二区三区小说| 天天操天天操天天操天天操天天操| 波多野结衣一区二区三区 | 亚洲一区二区在线观| 在线看成人短视频| 欧美影视一区二区| 国产一区二区三区探花| 茄子视频成人在线观看| 国产精品一线天粉嫩av| 午夜精品一区二区在线观看| 俺要去色综合狠狠| 亚洲一区二区精品在线| 国产精品久久久久9999赢消| 五月天综合婷婷| 欧美fxxxxxx另类| 精品成在人线av无码免费看| 一级成人国产| 99色精品视频| 奇米一区二区三区av| 日韩爱爱小视频| 精品一区二区在线看| 三日本三级少妇三级99| 国产jizzjizz一区二区| 中文字幕免费在线播放| 久久综合狠狠综合| 日本人亚洲人jjzzjjz| 国产精品久久久久久久蜜臀| 国产天堂av在线| 亚洲超碰精品一区二区| 成人午夜视频在线播放| 欧美性欧美巨大黑白大战| 国产精品久久婷婷| 亚洲成人av在线| 国产一级在线观看| 久久精品国产亚洲精品2020| bl在线肉h视频大尺度| 欧美自拍视频在线观看| 91麻豆精品国产91久久久更新资源速度超快 | 精品国产福利| 国内黄色精品| 成年人视频大全| 日韩综合小视频| 国产无遮挡猛进猛出免费软件| 日韩一区精品视频| 亚洲色图欧美自拍| 99久久精品费精品国产一区二区| 国产成人精品一区二区三区在线观看| 日本伊人午夜精品| 中文字幕无码毛片免费看| 99国产欧美另类久久久精品| 日韩av片在线| 一区二区三区高清| 免费av中文字幕| 精品盗摄一区二区三区| 91亚洲欧美| 性视频1819p久久| 久久不卡日韩美女| 九色视频成人porny| 99久久精品费精品国产| 久久久999视频| 国产在线精品不卡| 无码人妻精品一区二区中文| 一区二区三区四区不卡在线| 曰批又黄又爽免费视频| 亚洲精品美女视频| 18av在线播放| 国产日韩欧美91| 妖精视频一区二区三区免费观看 | 羞羞答答成人影院www| 国产黄色一级网站| 久久精品国内一区二区三区| 国产精品久久AV无码| 亚洲欧美偷拍三级| 日本中文字幕在线观看视频| 亚洲精品aⅴ中文字幕乱码 | 538任你躁精品视频网免费| 日本视频一区在线观看| 精品不卡视频| 99热这里只有精品2| 国产精品卡一卡二| 欧美一区免费看| 亚洲精品国产欧美| 四虎亚洲成人| 91欧美精品成人综合在线观看| 视频一区视频二区欧美| 亚洲精品国产一区| 国产精品免费看| 丰满人妻一区二区三区免费视频棣| 91天堂素人约啪| 久久9999久久免费精品国产| 91精品欧美综合在线观看最新| 亚洲av无码片一区二区三区| 日韩在线中文字| 国产一区二区三区四区五区3d| 亚洲一区精品电影| 亚洲不卡av不卡一区二区| 99sesese| 日本一区二区视频在线| 69xxxx国产| 国产亚洲精品日韩| 欧美成人ⅴideosxxxxx| 欧美日韩精品免费观看| 久久xxxx| 欧美性受xxxx黑人| 欧美性感一区二区三区| 成人在线免费电影| 国产啪精品视频网站| 99热国内精品| 在线观看中文av| 亚洲激情成人在线| 国产综合无码一区二区色蜜蜜| 亚洲人永久免费| 蜜桃精品在线| 亚洲一区二区四区| 国产精品影视在线观看| 妺妺窝人体色www婷婷| 欧美精品一区二区三区一线天视频| yw视频在线观看| 国产精品美女网站| 91亚洲人成网污www| 黄色片免费网址| 亚洲曰韩产成在线| 午夜视频www| 国产精品黄视频| 伊人色**天天综合婷婷| 久久精品aⅴ无码中文字字幕重口| 日本一二三不卡| 一区二区国产欧美| 欧美激情第三页| 欧美激情极品| 精品久久久久久中文字幕2017| 99久久久久久| 在线播放精品视频| 九九九热精品免费视频观看网站| 色天使综合视频| 在线观看日韩羞羞视频| 国产美女主播视频一区| 国产乡下妇女做爰视频| 亚洲人成绝费网站色www| 91九色成人| 97在线播放视频| 综合分类小说区另类春色亚洲小说欧美| 六月丁香婷婷综合| 日韩在线小视频| 麻豆一区二区麻豆免费观看| 欧美日韩在线观看不卡| 亚洲一二三专区| 爱久久·www| 97se视频在线观看| 久久性色av| 国产亚洲精品久久777777| 国产亚洲精品激情久久| 深夜福利一区二区三区| 国产天堂在线播放| 亚洲一卡二卡三卡四卡无卡久久| 亚洲国产av一区二区| 国产精品久久久999|