国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 網(wǎng)站 > 幫助中心 > 正文

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

2024-07-09 22:40:29
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

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

Feign簡(jiǎn)介

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

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

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

Feign的定義

為了讓Feign知道在調(diào)用方法時(shí)應(yīng)該向哪個(gè)地址發(fā)請(qǐng)求以及請(qǐng)求需要帶哪些參數(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組件對(duì)該接口進(jìn)行代理(不需要編寫(xiě)接口實(shí)現(xiàn)),使用者可直接通過(guò)@Autowired注入。

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

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

Spring Cloud應(yīng)用在啟動(dòng)時(shí),F(xiàn)eign會(huì)掃描標(biāo)有@FeignClient注解的接口,生成代理,并注冊(cè)到Spring容器中。生成代理時(shí)Feign會(huì)為每個(gè)接口方法創(chuàng)建一個(gè)RequetTemplate對(duì)象,該對(duì)象封裝了HTTP請(qǐng)求需要的全部信息,請(qǐng)求參數(shù)名、請(qǐng)求方法等信息都是在這個(gè)過(guò)程中確定的,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ù)對(duì)象序列化為請(qǐng)求參數(shù)放到HTTP請(qǐng)求中的過(guò)程,是由編碼器(Encoder)完成的。同理,將HTTP響應(yīng)數(shù)據(jù)反序列化為java對(duì)象是由解碼器(Decoder)完成的。

默認(rèn)情況下,F(xiàn)eign會(huì)將標(biāo)有@RequestParam注解的參數(shù)轉(zhuǎn)換成字符串添加到URL中,將沒(méi)有注解的參數(shù)通過(guò)Jackson轉(zhuǎn)換成json放到請(qǐng)求體中。注意,如果在@RequetMapping中的method將請(qǐng)求方式指定為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請(qǐng)求沒(méi)有請(qǐng)求體,所以obj參數(shù)就會(huì)被忽略。

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

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 张掖市| 桦甸市| 广宁县| 大荔县| 普格县| 洮南市| 施秉县| 普陀区| 云和县| 台前县| 本溪| 宁南县| 天峨县| 祁门县| 天津市| 疏勒县| 抚宁县| 景德镇市| 三门县| 华阴市| 醴陵市| 台北县| 吉首市| 翁牛特旗| 和田市| 连平县| 卓尼县| 宁蒗| 屏东市| 温宿县| 潢川县| 江达县| 肇东市| 丰台区| 贡山| 保康县| 雷山县| 太湖县| 枝江市| 东城区| 安康市|