最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

使用Spring Cloud Feign作為HTTP客戶端調(diào)用遠(yuǎn)程HTTP服務(wù)的方法(推薦)

 更新時(shí)間:2018年01月26日 13:46:31   作者:司青  
在Spring Cloud中使用Feign, 我們可以做到使用HTTP請求遠(yuǎn)程服務(wù)時(shí)能與調(diào)用本地方法一樣的編碼體驗(yàn),開發(fā)者完全感知不到這是遠(yuǎn)程方法,更感知不到這是個(gè)HTTP請求,具體內(nèi)容詳情大家參考下本文

在Spring Cloud Netflix棧中,各個(gè)微服務(wù)都是以HTTP接口的形式暴露自身服務(wù)的,因此在調(diào)用遠(yuǎn)程服務(wù)時(shí)就必須使用HTTP客戶端。我們可以使用JDK原生的URLConnection、Apache的Http Client、Netty的異步HTTP Client, Spring的RestTemplate。但是,用起來最方便、最優(yōu)雅的還是要屬Feign了。

Feign簡介

Feign是一種聲明式、模板化的HTTP客戶端。在Spring Cloud中使用Feign, 我們可以做到使用HTTP請求遠(yuǎn)程服務(wù)時(shí)能與調(diào)用本地方法一樣的編碼體驗(yàn),開發(fā)者完全感知不到這是遠(yuǎn)程方法,更感知不到這是個(gè)HTTP請求。比如:

@Autowired
private AdvertGropRemoteService service; // 遠(yuǎn)程服務(wù)
public AdvertGroupVO foo(Integer groupId) {
 return service.findByGroupId(groupId); // 通過HTTP調(diào)用遠(yuǎn)程服務(wù)
}

開發(fā)者通過service.findByGroupId()就能完成發(fā)送HTTP請求和解碼HTTP返回結(jié)果并封裝成對象的過程。

Feign的定義

為了讓Feign知道在調(diào)用方法時(shí)應(yīng)該向哪個(gè)地址發(fā)請求以及請求需要帶哪些參數(shù),我們需要定義一個(gè)接口:

@FeignClient(name = "ea") // [A]
public interface AdvertGroupRemoteService {
 @RequestMapping(value = "/group/{groupId}", method = RequestMethod.GET) // [B]
 AdvertGroupVO findByGroupId(@PathVariable("groupId") Integer adGroupId) // [C]
 @RequestMapping(value = "/group/{groupId}", method = RequestMethod.PUT)
 void update(@PathVariable("groupId") Integer groupId, @RequestParam("groupName") String groupName)

A: @FeignClient用于通知Feign組件對該接口進(jìn)行代理(不需要編寫接口實(shí)現(xiàn)),使用者可直接通過@Autowired注入。

B: @RequestMapping表示在調(diào)用該方法時(shí)需要向/group/{groupId}發(fā)送GET請求。

C: @PathVariable與SpringMVC中對應(yīng)注解含義相同。

Spring Cloud應(yīng)用在啟動(dòng)時(shí),F(xiàn)eign會(huì)掃描標(biāo)有@FeignClient注解的接口,生成代理,并注冊到Spring容器中。生成代理時(shí)Feign會(huì)為每個(gè)接口方法創(chuàng)建一個(gè)RequetTemplate對象,該對象封裝了HTTP請求需要的全部信息,請求參數(shù)名、請求方法等信息都是在這個(gè)過程中確定的,F(xiàn)eign的模板化就體現(xiàn)在這里。

在本例中,我們將Feign與Eureka和Ribbon組合使用,@FeignClient(name = "ea")意為通知Feign在調(diào)用該接口方法時(shí)要向Eureka中查詢名為ea的服務(wù),從而得到服務(wù)URL。

Feign的Encoder、Decoder和ErrorDecoder

Feign將方法簽名中方法參數(shù)對象序列化為請求參數(shù)放到HTTP請求中的過程,是由編碼器(Encoder)完成的。同理,將HTTP響應(yīng)數(shù)據(jù)反序列化為java對象是由解碼器(Decoder)完成的。

默認(rèn)情況下,F(xiàn)eign會(huì)將標(biāo)有@RequestParam注解的參數(shù)轉(zhuǎn)換成字符串添加到URL中,將沒有注解的參數(shù)通過Jackson轉(zhuǎn)換成json放到請求體中。注意,如果在@RequetMapping中的method將請求方式指定為POST,那么所有未標(biāo)注解的參數(shù)將會(huì)被忽略,例如:

@RequestMapping(value = "/group/{groupId}", method = RequestMethod.GET)
void update(@PathVariable("groupId") Integer groupId, @RequestParam("groupName") String groupName, DataObject obj);

此時(shí)因?yàn)槁暶鞯氖荊ET請求沒有請求體,所以obj參數(shù)就會(huì)被忽略。

在Spring Cloud環(huán)境下,F(xiàn)eign的Encoder*只會(huì)用來編碼沒有添加注解的參數(shù)*。如果你自定義了Encoder, 那么只有在編碼obj參數(shù)時(shí)才會(huì)調(diào)用你的Encoder。對于Decoder, 默認(rèn)會(huì)委托給SpringMVC中的MappingJackson2HttpMessageConverter類進(jìn)行解碼。只有當(dāng)狀態(tài)碼不在200 ~ 300之間時(shí)ErrorDecoder才會(huì)被調(diào)用。ErrorDecoder的作用是可以根據(jù)HTTP響應(yīng)信息返回一個(gè)異常,該異常可以在調(diào)用Feign接口的地方被捕獲到。我們目前就通過ErrorDecoder來使Feign接口拋出業(yè)務(wù)異常以供調(diào)用者處理。

Feign的HTTP Client

Feign在默認(rèn)情況下使用的是JDK原生的URLConnection發(fā)送HTTP請求,沒有連接池,但是對每個(gè)地址會(huì)保持一個(gè)長連接,即利用HTTP的persistence connection 。我們可以用Apache的HTTP Client替換Feign原始的http client, 從而獲取連接池、超時(shí)時(shí)間等與性能息息相關(guān)的控制能力。Spring Cloud從Brixtion.SR5版本開始支持這種替換,首先在項(xiàng)目中聲明Apache HTTP Client和feign-httpclient依賴:

<!-- 使用Apache HttpClient替換Feign原生httpclient -->
 <dependency>
 <groupId>org.apache.httpcomponents</groupId>
 <artifactId>httpclient</artifactId>
 </dependency>
 <dependency>
 <groupId>com.netflix.feign</groupId>
 <artifactId>feign-httpclient</artifactId>
 <version>${feign-httpclient}</version>
 </dependency>

然后在application.properties中添加:

feign.httpclient.enabled=true

總結(jié)

通過Feign, 我們能把HTTP遠(yuǎn)程調(diào)用對開發(fā)者完全透明,得到與調(diào)用本地方法一致的編碼體驗(yàn)。這一點(diǎn)與阿里Dubbo中暴露遠(yuǎn)程服務(wù)的方式類似,區(qū)別在于Dubbo是基于私有二進(jìn)制協(xié)議,而Feign本質(zhì)上還是個(gè)HTTP客戶端。如果是在用Spring Cloud Netflix搭建微服務(wù),那么Feign無疑是最佳選擇。

以上所述是小編給大家介紹的使用Spring Cloud Feign作為HTTP客戶端調(diào)用遠(yuǎn)程HTTP服務(wù)的方法(推薦),希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!

相關(guān)文章

  • java高并發(fā)的用戶線程和守護(hù)線程詳解

    java高并發(fā)的用戶線程和守護(hù)線程詳解

    本篇文章主要介紹了淺談java中守護(hù)線程與用戶線程,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2021-10-10
  • 使用JMX連接JVM實(shí)現(xiàn)過程詳解

    使用JMX連接JVM實(shí)現(xiàn)過程詳解

    這篇文章主要介紹了使用JMX連接JVM實(shí)現(xiàn)過程詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-04-04
  • 將本地JAR文件手動(dòng)添加到Maven本地倉庫的實(shí)現(xiàn)過程

    將本地JAR文件手動(dòng)添加到Maven本地倉庫的實(shí)現(xiàn)過程

    在Java開發(fā)中,使用Maven作為項(xiàng)目管理工具已經(jīng)成為了主流的選擇,Maven提供了強(qiáng)大的依賴管理功能,可以輕松地下載和管理項(xiàng)目所需的庫和工具,在某些情況下,你可能會(huì)需要將本地下載的JAR文件手動(dòng)添加到Maven的本地倉庫中,這篇博客將詳細(xì)介紹如何實(shí)現(xiàn)這一過程
    2024-10-10
  • Java數(shù)據(jù)結(jié)構(gòu)之LinkedList從鏈表到實(shí)現(xiàn)

    Java數(shù)據(jù)結(jié)構(gòu)之LinkedList從鏈表到實(shí)現(xiàn)

    LinkedList是Java中常用的數(shù)據(jù)結(jié)構(gòu)之一,實(shí)現(xiàn)了鏈表的特性,支持快速添加、刪除元素,可以用于實(shí)現(xiàn)隊(duì)列、棧、雙向隊(duì)列等數(shù)據(jù)結(jié)構(gòu)。LinkedList的內(nèi)部實(shí)現(xiàn)采用了雙向鏈表,其中每個(gè)節(jié)點(diǎn)都包含前驅(qū)節(jié)點(diǎn)和后繼節(jié)點(diǎn)的引用,可以直接訪問鏈表的頭尾元素
    2023-04-04
  • java中Map、Set、List的簡單使用教程(快速入門)

    java中Map、Set、List的簡單使用教程(快速入門)

    這篇文章主要給大家介紹了關(guān)于java中Map、Set、List簡單使用教程,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-01-01
  • spring中通過ApplicationContext getBean獲取注入對象的方法實(shí)例

    spring中通過ApplicationContext getBean獲取注入對象的方法實(shí)例

    今天小編就為大家分享一篇關(guān)于spring中通過ApplicationContext getBean獲取注入對象的方法實(shí)例,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧
    2019-03-03
  • Java中終止線程的三種方法

    Java中終止線程的三種方法

    這篇文章主要為大家詳細(xì)介紹了Java中終止線程的三種方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-12-12
  • Spring Boot集成Shiro并利用MongoDB做Session存儲(chǔ)的方法詳解

    Spring Boot集成Shiro并利用MongoDB做Session存儲(chǔ)的方法詳解

    這篇文章主要給大家介紹了關(guān)于Spring Boot集成Shiro并利用MongoDB做Session存儲(chǔ)的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友下面來一起看看吧。
    2017-12-12
  • Java基礎(chǔ)學(xué)習(xí)之接口詳解

    Java基礎(chǔ)學(xué)習(xí)之接口詳解

    接口,是Java語言中一種引用類型,是方法的集合,如果說類的內(nèi)部封裝了成員變量、構(gòu)造方法和成員方法,那么接口的內(nèi)部主要就是封裝了方法。本文通過一些示例詳細(xì)為大家展示了接口的使用,需要的可以參考一下
    2022-10-10
  • 詳解Mybatis攔截器安全加解密MySQL數(shù)據(jù)實(shí)戰(zhàn)

    詳解Mybatis攔截器安全加解密MySQL數(shù)據(jù)實(shí)戰(zhàn)

    本文主要介紹了Mybatis攔截器安全加解密MySQL數(shù)據(jù)實(shí)戰(zhàn),文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-01-01

最新評論

黄骅市| 交城县| 思南县| 阳城县| 大庆市| 太仆寺旗| 福清市| 九江市| 五河县| 建瓯市| 托克托县| 平山县| 班戈县| 广宁县| 松溪县| 唐海县| 揭东县| 满洲里市| 吴旗县| 东阿县| 永清县| 冕宁县| 东乌珠穆沁旗| 上栗县| 元谋县| 云霄县| 嘉峪关市| 璧山县| 朝阳区| 新化县| 沙湾县| 砀山县| 合山市| 新巴尔虎右旗| 二连浩特市| 芦山县| 宣武区| 江源县| 宜城市| 镇坪县| 东港市|