亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > Java > 正文

使用Spring Cloud Feign作為HTTP客戶端調用遠程HTTP服務的方法(推薦)

2024-07-13 10:17:20
字體:
來源:轉載
供稿:網友

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

Feign簡介

Feign是一種聲明式、模板化的HTTP客戶端。在Spring Cloud中使用Feign, 我們可以做到使用HTTP請求遠程服務時能與調用本地方法一樣的編碼體驗,開發者完全感知不到這是遠程方法,更感知不到這是個HTTP請求。比如:

@Autowiredprivate AdvertGropRemoteService service; // 遠程服務public AdvertGroupVO foo(Integer groupId) { return service.findByGroupId(groupId); // 通過HTTP調用遠程服務}

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

Feign的定義

為了讓Feign知道在調用方法時應該向哪個地址發請求以及請求需要帶哪些參數,我們需要定義一個接口:

@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組件對該接口進行代理(不需要編寫接口實現),使用者可直接通過@Autowired注入。

B: @RequestMapping表示在調用該方法時需要向/group/{groupId}發送GET請求。

C: @PathVariable與SpringMVC中對應注解含義相同。

Spring Cloud應用在啟動時,Feign會掃描標有@FeignClient注解的接口,生成代理,并注冊到Spring容器中。生成代理時Feign會為每個接口方法創建一個RequetTemplate對象,該對象封裝了HTTP請求需要的全部信息,請求參數名、請求方法等信息都是在這個過程中確定的,Feign的模板化就體現在這里。

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

Feign的Encoder、Decoder和ErrorDecoder

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

默認情況下,Feign會將標有@RequestParam注解的參數轉換成字符串添加到URL中,將沒有注解的參數通過Jackson轉換成json放到請求體中。注意,如果在@RequetMapping中的method將請求方式指定為POST,那么所有未標注解的參數將會被忽略,例如:

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

此時因為聲明的是GET請求沒有請求體,所以obj參數就會被忽略。

在Spring Cloud環境下,Feign的Encoder*只會用來編碼沒有添加注解的參數*。如果你自定義了Encoder, 那么只有在編碼obj參數時才會調用你的Encoder。對于Decoder, 默認會委托給SpringMVC中的MappingJackson2HttpMessageConverter類進行解碼。只有當狀態碼不在200 ~ 300之間時ErrorDecoder才會被調用。ErrorDecoder的作用是可以根據HTTP響應信息返回一個異常,該異??梢栽谡{用Feign接口的地方被捕獲到。我們目前就通過ErrorDecoder來使Feign接口拋出業務異常以供調用者處理。

Feign的HTTP Client

Feign在默認情況下使用的是JDK原生的URLConnection發送HTTP請求,沒有連接池,但是對每個地址會保持一個長連接,即利用HTTP的persistence connection 。我們可以用Apache的HTTP Client替換Feign原始的http client, 從而獲取連接池、超時時間等與性能息息相關的控制能力。Spring Cloud從Brixtion.SR5版本開始支持這種替換,首先在項目中聲明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

總結

通過Feign, 我們能把HTTP遠程調用對開發者完全透明,得到與調用本地方法一致的編碼體驗。這一點與阿里Dubbo中暴露遠程服務的方式類似,區別在于Dubbo是基于私有二進制協議,而Feign本質上還是個HTTP客戶端。如果是在用Spring Cloud Netflix搭建微服務,那么Feign無疑是最佳選擇。

以上所述是小編給大家介紹的使用Spring Cloud Feign作為HTTP客戶端調用遠程HTTP服務的方法(推薦),希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對VeVb武林網網站的支持!


注:相關教程知識閱讀請移步到JAVA教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
91av免费观看91av精品在线| 亚洲女性裸体视频| 亚州av一区二区| 国产精品欧美日韩久久| 亚洲天天在线日亚洲洲精| 国产精品久久久久影院日本| 国产99久久精品一区二区| 亚洲欧洲在线播放| 日韩日本欧美亚洲| 亚洲国产欧美一区二区三区同亚洲| 日韩精品极品毛片系列视频| 欧美性猛交xxxx富婆| 欧美另类老女人| 色www亚洲国产张柏芝| 国模极品一区二区三区| 欧美一级视频在线观看| 欧美性猛交xxxx乱大交| 久久av中文字幕| 国产精品免费一区豆花| 久久精品视频一| 国产噜噜噜噜久久久久久久久| 日本免费久久高清视频| 亚洲国产第一页| 91沈先生作品| 国产主播喷水一区二区| 国产精自产拍久久久久久蜜| 欧美精品国产精品日韩精品| 热99精品只有里视频精品| 国产一区二区成人| 久久久久九九九九| 欧美日韩国产在线看| 日韩有码视频在线| 免费91在线视频| 一区二区在线免费视频| 懂色av影视一区二区三区| 久久精品在线播放| 亚洲一区二区久久久久久久| 91欧美精品午夜性色福利在线| 日韩在线激情视频| 亚洲在线免费看| 久久综合伊人77777尤物| 成人国产精品久久久久久亚洲| 亚洲一区二区三区在线视频| 国产精品入口免费视| 国产91色在线免费| 国产精品小说在线| 欧美在线播放视频| 日韩电影视频免费| 欧美大胆在线视频| 国产精品91久久久| 精品亚洲一区二区三区四区五区| 国产精品自拍偷拍视频| 亚洲精品在线看| 国产精品video| 亚洲欧美日韩在线一区| 日韩av资源在线播放| 96国产粉嫩美女| 色综合影院在线| 在线观看国产精品91| 97视频国产在线| 狠狠做深爱婷婷久久综合一区| 欧美老女人xx| 日韩一区av在线| 色偷偷9999www| 欧美大片在线看| 亚洲精品一区二区三区婷婷月| 亚洲国产女人aaa毛片在线| 亚洲免费视频观看| 国产乱肥老妇国产一区二| 亚洲第一网中文字幕| 亚洲女人天堂成人av在线| 欧美日韩成人黄色| 精品国产美女在线| 国产亚洲一区二区在线| 欧美精品免费看| 亚洲国内高清视频| 久久久久久久久国产精品| 国产精品亚洲第一区| 国产91精品久久久久久久| 91在线精品播放| 大量国产精品视频| 九九九热精品免费视频观看网站| 日韩电影视频免费| 国产精品久在线观看| 国产成人精品在线播放| 91日本在线视频| 亚洲成人中文字幕| 久久久久久久久久婷婷| 欧美在线国产精品| 亚洲电影成人av99爱色| 精品在线观看国产| 最近中文字幕mv在线一区二区三区四区| 久久久亚洲成人| www.亚洲男人天堂| 国产偷亚洲偷欧美偷精品| 国产精品jizz在线观看麻豆| 欧美极品在线播放| 中文字幕日韩精品有码视频| 国产精品九九久久久久久久| 日韩va亚洲va欧洲va国产| 日韩成人激情影院| 国产精品小说在线| 懂色aⅴ精品一区二区三区蜜月| 成人国产亚洲精品a区天堂华泰| 9.1国产丝袜在线观看| 久久精品国产99国产精品澳门| 国模精品一区二区三区色天香| 欧美日韩国产综合视频在线观看中文| 久久久久久成人| www亚洲欧美| 久久色在线播放| 97久久久久久| 国内自拍欧美激情| 成人av在线亚洲| 欧洲亚洲妇女av| 91九色精品视频| 色综合色综合网色综合| 精品日韩中文字幕| 精品久久久久久久久国产字幕| 成人性生交大片免费看视频直播| 欧洲精品毛片网站| 91精品视频在线看| 国产精品狼人色视频一区| 亚洲成**性毛茸茸| 丝袜情趣国产精品| 久久伊人精品天天| 亚洲第一免费播放区| 国产精品久久久亚洲| 国产精品免费一区| 国产91精品久久久| 91精品国产网站| 亚洲免费福利视频| 欧美成人午夜激情视频| 精品一区二区三区电影| 日韩视频精品在线| 亚洲人成网在线播放| 国产日韩专区在线| 国产精品免费一区二区三区都可以| 欧美丰满片xxx777| 久久久久国产精品免费| 欧美一区二区色| 国产在线拍揄自揄视频不卡99| 欧美高清自拍一区| 欧美又大粗又爽又黄大片视频| 在线观看精品国产视频| 亚洲成人a**站| 国产精品美女视频网站| 欧美—级高清免费播放| 欧美老女人性生活| 国产精品视频大全| 精品国内亚洲在观看18黄| 国产精品永久免费观看| 在线观看久久久久久| 亚洲欧美另类国产| 中文字幕亚洲第一| 欧美一级视频免费在线观看| 日韩av不卡电影| 国产成人精品免费久久久久| 久久久久久久久亚洲| 91国产一区在线| 欧美一乱一性一交一视频| 日韩高清av一区二区三区| 日韩欧美精品网站| 97久久超碰福利国产精品…|