精品欧美一区二区三区在线观看 _久久久久国色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| 精品一二线国产| 性色av一区二区三区红粉影视| av黄色在线免费观看| 99精品国产九九国产精品| 婷婷一区二区三区| 最近看过的日韩成人| 亚洲欧美自偷自拍| 国产精品亚洲第一| 国产精品电影久久久久电影网| 欧美日韩免费一区二区| 精品国精品国产自在久国产应用 | 99久久精品无免国产免费| 中文精品在线| 久久99国产综合精品女同| 亚洲第一综合网| 国产一区二区在线视频你懂的| 欧美日韩国产中文| 成人免费观看毛片| 国产网红在线观看| 成人欧美一区二区三区黑人麻豆| 久久精品国产一区二区三区日韩| av网站免费播放| 蜜桃精品在线观看| 国产精品成人在线| 少妇太紧太爽又黄又硬又爽| 欧美激情精品久久久六区热门| 最近2019中文字幕一页二页| aaaaa级少妇高潮大片免费看| 亚洲日本va午夜在线电影| 欧美日韩成人一区二区| 精品久久久久av| 成人在线黄色电影| 亚洲国产欧美一区二区三区丁香婷| 亚洲一区三区视频在线观看| 奇米影视888狠狠狠777不卡| 97久久久精品综合88久久| 国产精品国产精品国产专区蜜臀ah | 国产成人一区二| 国产无人区码熟妇毛片多| 国一区二区在线观看| 美女啪啪无遮挡免费久久网站| av在线播放中文字幕| 日本在线电影一区二区三区| 国产亚洲精品综合一区91| 久久久无码人妻精品一区| 麻豆一区二区| 日韩精品视频观看| 好吊一区二区三区视频| 色综合www| 日韩精品在线观看视频| 疯狂揉花蒂控制高潮h| 亚洲第一福利专区| 国产亚洲一区二区精品| www亚洲色图| 国产精品黑丝在线播放| 久久久国产在线视频| 成人免费黄色小视频| 中国成人一区| 国模吧一区二区| 好吊妞视频一区二区三区| 久久国产精品久久久久久电车| 国产成人高清激情视频在线观看| www.av88| 国产一区二区免费看| 成人蜜桃视频| 欧美欧美欧美| 国产精品美女一区二区| 日韩精品手机在线观看| 国产黄色大片在线观看| 精品美女永久免费视频| 任你操这里只有精品| 欧美日韩伦理一区二区| 日韩欧美中文字幕精品| 中文字幕乱码在线| 精品一区二区三区中文字幕老牛| 色偷偷av亚洲男人的天堂| 激情四射综合网| 一区二区三区国产在线| 国产精品美女久久| 精品女同一区二区三区| av高清不卡在线| 午夜精品视频在线观看一区二区| 麻豆tv免费在线观看| 亚洲午夜一区二区| 九热视频在线观看| 天堂va在线高清一区| 日韩精品久久久久| 情侣偷拍对白清晰饥渴难耐| 国内成人在线| 国产精品激情av电影在线观看| 国产jzjzjz丝袜老师水多| 99久久精品一区二区| 一区二区三区欧美在线| 91吃瓜在线观看| 欧美日韩日日骚| 国产又粗又长又爽| 久久精品影视| 欧美中文字幕视频在线观看| 国产精品久久久久久免费| 99国产精品一区| 青春草在线视频免费观看| 亚洲综合电影| 欧美成人a∨高清免费观看| 自拍偷拍你懂的| 亚洲日本黄色| 亚洲一区二区中文字幕| 国产中文在线视频| 亚洲成人免费电影| 想看黄色一级片| 欧美色婷婷久久99精品红桃| 亚洲91精品在线观看| 国产日韩一级片| 国产嫩草影院久久久久| 午夜精品久久久久久久无码 | 天堂av手机版| 国产成人精品一区二区免费看京 | 日韩av一二三区| 美女任你摸久久| 日本视频精品一区| 亚洲第一av| 欧美精品一区二区久久久| 中文字幕求饶的少妇| 老**午夜毛片一区二区三区 | 天天插天天操天天射| 农村少妇一区二区三区四区五区| 久久亚洲精品一区二区| 一区二区乱子伦在线播放| 26uuu色噜噜精品一区二区| 人妻互换免费中文字幕| 欧美日韩国产一区二区在线观看| 中文字幕成人精品久久不卡| 无码日韩精品一区二区| 91丨porny丨蝌蚪视频| 女人色极品影院| 婷婷综合国产| 久久国产精品影片| 国产黄色免费大片| 日韩久久一区二区| 亚洲a级黄色片| 亚洲蜜桃视频| 91久久综合亚洲鲁鲁五月天| 欧美a免费在线| 欧美日韩一区不卡| 妖精视频在线观看免费| 日本不卡视频在线观看| 日韩精品伦理第一区| se01亚洲视频| 自拍偷拍亚洲一区| 国产麻豆精品一区| 一级女性全黄久久生活片免费| 日韩成人精品视频在线观看| 香蕉av一区二区 | 国产精品qvod| 91国内精品久久| 日本不卡视频一区二区| 色先锋久久av资源部| 波多野结衣a v在线| 久久字幕精品一区| 亚洲国产一区二区三区在线 | 成人欧美一区二区三区黑人免费| 午夜伦理大片视频在线观看| 亚洲第一网站免费视频| 天天干天天干天天操| 国产亚洲婷婷免费| 999这里有精品| 欧美区亚洲区| 欧美黄色直播| 欧美大片网站| 欧美日韩国产成人高清视频| 深夜福利在线视频| 欧美精品在线视频| 久草视频免费播放| 久久综合九色综合欧美就去吻| 99蜜桃臀久久久欧美精品网站| 成人在线免费小视频| 亚洲综合大片69999| 91jq激情在线观看| 一本色道久久88综合日韩精品| 亚洲天堂视频在线| 亚洲高清中文字幕| 成人无码av片在线观看| 国产成人精品影视| 精品久久久久久久无码| 亚洲电影影音先锋| 久久综合九色99| www一区二区三区| 2019中文在线观看| 午夜在线免费观看视频| 亚洲第一视频在线观看| 伊人精品一区二区三区| 亚洲综合丁香婷婷六月香| 亚洲理论片在线观看| 国产一区 二区 三区一级| 亚洲欧洲日产国码无码久久99| 不卡视频在线| 国产亚洲精品美女久久久m| 国产成人精选| 国语自产在线不卡| 国产欧美久久久久久久久| 日韩乱码在线视频| 国产黄色美女视频| 欧美日韩三级一区| 无码人妻精品一区二区蜜桃色欲 | 99国产精品99久久久久久| 亚洲少妇第一页| 亚洲精品激情| 玖玖精品在线视频| 欧美三级美国一级| 久久久久久a亚洲欧洲aⅴ| 精品国产麻豆| 成人激情视频在线播放| 成人在线爆射| 91成人在线观看国产| 国精一区二区三区| 欧美精品在线视频观看| 日本在线免费播放| 亚洲午夜小视频| 日本中文字幕一区二区有码在线| 日韩欧美一区在线观看| 国产精品伦一区二区三区| 在线观看91精品国产入口| 午夜精品三级久久久有码| 樱花影视一区二区| 久久国产美女视频| 国产精品久久三区| 国产性猛交xx乱| 久久久久久影视| 中文字幕在线免费看线人 | 爱爱的免费视频| 99re视频这里只有精品| 欲求不满的岳中文字幕| 高清不卡一区二区在线| xxxx国产视频| 国产乱码精品一区二区三区av| 欧美成人乱码一二三四区免费| 日韩成人免费在线| 亚洲少妇第一页| 蜜桃视频在线观看一区| 波多结衣在线观看| 麻豆freexxxx性91精品| 中国黄色片免费看| 免费在线观看成人| 日本特黄a级片| 久久 天天综合| 日本美女久久久| 国产宾馆实践打屁股91| 亚洲一区二区三区四区av| 高清国产一区二区| av av在线| xf在线a精品一区二区视频网站| 中文幕无线码中文字蜜桃| 91在线精品一区二区三区| 草草地址线路①屁屁影院成人| 久久午夜电影网| 人妻熟人中文字幕一区二区| 亚洲国产高清在线| 精品自拍偷拍视频| 亚洲成va人在线观看| 69成人免费视频| 欧美中文字幕久久| 国产哺乳奶水91在线播放| 欧美刺激午夜性久久久久久久| 日韩一级免费视频| 亚洲天堂男人的天堂| 欧美激情二区| 欧美激情xxxxx| 亚洲女同av| 成人黄色激情网| 你懂的在线观看一区二区| 欧美一区二区影视| 7777久久香蕉成人影院| 91九色丨porny丨国产jk| 久久久久国产一区二区| 五月六月丁香婷婷| 97久久精品人人做人人爽| 永久免费观看片现看| 亚洲成人你懂的| 无码人妻丰满熟妇区bbbbxxxx| 欧美老女人第四色| 亚洲精品喷潮一区二区三区| 亚洲人成伊人成综合网久久久 | 国产精品短视频| 国产无套粉嫩白浆内谢| 91成人在线免费观看| 国产乱码精品一区二区| 精品亚洲一区二区三区在线观看 | 久久久久久久国产精品视频| 亚洲精品mv| 超碰国产精品久久国产精品99| 国产一区二区三区电影在线观看 | 麻豆久久久9性大片| 91久久夜色精品国产按摩| r级无码视频在线观看| 美女视频网站久久| 亚洲第一黄色网址| 亚洲免费av高清| 精品乱码一区内射人妻无码 | 一区二区三区四区在线观看国产日韩 | 国产精品成人va在线观看| 超碰成人97| 在线观看日韩羞羞视频| 久久久国产亚洲精品| 中文字幕18页| 亚洲美女偷拍久久| 中文无码精品一区二区三区| 亚洲精品国精品久久99热一| 在线看女人毛片| 国产欧美一区二区白浆黑人| 先锋影音国产精品| 免费看毛片的网址| 激情文学综合丁香| 成年人在线免费看片| 精品久久久久久久久久久久久 | 国产精品综合二区| 中文字幕第69页| 欧美在线制服丝袜| 免费一级在线观看播放网址| 久久久久久久一| 欧美国产亚洲精品| 黄色一级视频播放| 久久66热偷产精品| 免费精品在线视频| 欧洲视频一区二区| 黄色视屏网站在线免费观看| 97久久伊人激情网| 久久动漫网址| 国产一区二区四区| 成人精品国产福利| 久久精品www| 欧美成人午夜电影| 在线观看中文| 2022国产精品| 午夜精品久久99蜜桃的功能介绍| 在线观看av免费观看| 亚洲欧美国产毛片在线| 国产绿帽刺激高潮对白| 久久久www成人免费精品| 91国产精品| 久久视频免费在线| 国产成人av一区二区三区在线 | 亚洲啪av永久无码精品放毛片 | 中文字幕日韩在线视频| 色综合一本到久久亚洲91| 欧美一区激情视频在线观看| 久久久夜精品| 国产又黄又粗视频| 欧美精品精品一区| 91麻豆一二三四在线| 99在线观看视频| 在线欧美视频| 精品人妻互换一区二区三区| 色婷婷av一区| 日本黄色片在线观看| 91成人理论电影| 精品91在线| 最近中文字幕免费视频| 欧美日韩一级二级三级| 高潮毛片在线观看| 国产精品对白刺激久久久| 鲁大师成人一区二区三区| 精品日韩在线视频| 日韩欧美国产系列| 一区二区精品伦理... | 国产三级视频在线播放线观看| 国产精品视频久久| 欧美一区二区三区另类| 中文字幕在线播放视频| 欧美综合在线视频| 伊人手机在线| 久久精品日产第一区二区三区| 免费视频最近日韩| 麻豆一区产品精品蜜桃的特点| 日韩高清欧美高清| 国产精品麻豆成人av电影艾秋| 国产精品无码电影在线观看| 91美女在线视频| 国产欧美第一页| 538国产精品一区二区在线 | 91成人福利社区| 国产精品无码一区二区在线| 国产精品久久久久久亚洲毛片 | 最新的欧美黄色| 成人18夜夜网深夜福利网| 北条麻妃av高潮尖叫在线观看| 亚洲男人电影天堂| 青青操在线视频| 91手机在线播放| 日韩在线观看一区二区| 久久久无码一区二区三区| 尤物tv国产一区| 欧美电影在线观看完整版| 拔插拔插华人永久免费|