一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術(shù)|正則表達(dá)式|C/C++|IOS|C#|Swift|Android|VB|R語(yǔ)言|JavaScript|易語(yǔ)言|vb.net|

服務(wù)器之家 - 編程語(yǔ)言 - Java教程 - 使用Spring Cloud Feign作為HTTP客戶端調(diào)用遠(yuǎn)程HTTP服務(wù)的方法(推薦)

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

2021-03-27 13:26司青 Java教程

在Spring Cloud中使用Feign, 我們可以做到使用HTTP請(qǐng)求遠(yuǎn)程服務(wù)時(shí)能與調(diào)用本地方法一樣的編碼體驗(yàn),開發(fā)者完全感知不到這是遠(yuǎn)程方法,更感知不到這是個(gè)HTTP請(qǐng)求,具體內(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簡(jiǎn)介

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

?
1
2
3
4
5
@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請(qǐng)求和解碼HTTP返回結(jié)果并封裝成對(duì)象的過程。

Feign的定義

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

?
1
2
3
4
5
6
@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)行代理(不需要編寫接口實(shí)現(xiàn)),使用者可直接通過@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è)過程中確定的,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)求中的過程,是由編碼器(Encoder)完成的。同理,將HTTP響應(yīng)數(shù)據(jù)反序列化為java對(duì)象是由解碼器(Decoder)完成的。

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

?
1
2
@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)求沒有請(qǐng)求體,所以obj參數(shù)就會(huì)被忽略。

在Spring Cloud環(huán)境下,F(xiàn)eign的Encoder*只會(huì)用來編碼沒有添加注解的參數(shù)*。如果你自定義了Encoder, 那么只有在編碼obj參數(shù)時(shí)才會(huì)調(diào)用你的Encoder。對(duì)于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請(qǐng)求,沒有連接池,但是對(duì)每個(gè)地址會(huì)保持一個(gè)長(zhǎng)連接,即利用HTTP的persistence connection 。我們可以用Apache的HTTP Client替換Feign原始的http client, 從而獲取連接池、超時(shí)時(shí)間等與性能息息相關(guān)的控制能力。Spring Cloud從Brixtion.SR5版本開始支持這種替換,首先在項(xiàng)目中聲明Apache HTTP Client和feign-httpclient依賴:

?
1
2
3
4
5
6
7
8
9
10
<!-- 使用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中添加:

?
1
feign.httpclient.enabled=true

總結(jié)

通過Feign, 我們能把HTTP遠(yuǎn)程調(diào)用對(duì)開發(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ù)的方法(推薦),希望對(duì)大家有所幫助,如果大家有任何疑問請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)服務(wù)器之家網(wǎng)站的支持!

原文鏈接:http://blog.csdn.net/neosmith/article/details/52449921

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 日日综合 | 色吊丝每日永久访问网站 | 99热这里有免费国产精品 | 国产亚洲精品线观看77 | 免费欧美一级片 | 狠狠色96视频 | 高h孕交| 日韩亚洲国产欧美精品 | 国产欧美精品一区二区三区四区 | 亚洲四虎影院 | 公妇乱淫在线播放免费观看 | 色吊丝每日永久访问网站 | 日韩欧美不卡视频 | 国产精品女同久久免费观看 | 国产亚洲综合精品一区二区三区 | 午夜性色一区二区三区不卡视频 | 99精品国产成人一区二区在线 | 欧美一区欧美二区 | 日韩一区二区三区免费 | 操熟美女又肥又嫩的骚屁股 | 国产福利不卡视频在免费 | 国产一区二区视频在线播放 | 公园暴露娇妻小说 | 欧美最猛性xxxxx男男 | 好大水好多好爽好硬好深视频 | 久久五月综合婷婷中文云霸高清 | 四虎4hu永久免费 | 欧美高清在线精品一区二区不卡 | 成人aqq| 午夜DY888国产精品影院 | 亚洲福利一区二区三区 | 天天干天天色综合网 | 三叶草私人研究所 | 国产区1 | 欧美一级片免费看 | 国产一区二区三区四区波多野结衣 | 特黄特黄一级高清免费大片 | 日本不卡一区二区三区在线观看 | 99精品在线免费观看 | 五月天国产精品 | java hd国产高清 |