国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - 使用Spring Cloud Feign作為HTTP客戶端調用遠程HTTP服務的方法(推薦)

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

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

在Spring Cloud中使用Feign, 我們可以做到使用HTTP請求遠程服務時能與調用本地方法一樣的編碼體驗,開發者完全感知不到這是遠程方法,更感知不到這是個HTTP請求,具體內容詳情大家參考下本文

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

Feign簡介

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

?
1
2
3
4
5
@Autowired
private AdvertGropRemoteService service; // 遠程服務
public AdvertGroupVO foo(Integer groupId) {
 return service.findByGroupId(groupId); // 通過HTTP調用遠程服務
}

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

Feign的定義

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

?
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組件對該接口進行代理(不需要編寫接口實現),使用者可直接通過@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,那么所有未標注解的參數將會被忽略,例如:

?
1
2
@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依賴:

?
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

總結

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

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

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

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 成人小视频在线观看 | 精品在线视频播放 | 中文字幕专区 | 精品一区二区三区中文字幕老牛 | 懂色av中文字幕一区二区三区 | 羞羞视频免费观看网站 | 久久久久久免费精品 | 欧美黄视频 | 亚洲一区二区视频 | 欧美另类国产 | 韩国精品 | 亚洲欧美一级久久精品 | 日韩小视频在线观看 | 黄色av免费在线 | 日本三级视频 | 欧美成人a | 亚洲毛片在线观看 | 久久亚洲欧美日韩精品专区 | 亚洲国产日韩欧美 | 欧美日韩成人网 | 一级一片在线播放在线观看 | 国产成人一区 | 国产大片在线观看 | 欧洲成人午夜免费大片 | 亚洲欧美日韩在线一区 | 欧美日韩国产在线 | 一 级 黄 色 片免费网站 | 欧美亚洲视频在线观看 | 国产精品一区二区免费 | 久久手机免费视频 | 久久婷婷av| 国产精品无码久久久久 | av网站在线免费观看 | 亚洲精品乱码久久久久久蜜糖图片 | 精品国产欧美一区二区三区成人 | 亚洲一区av在线 | 久久人成| 探花在线观看 | 国产成人精品一区二区三区视频 | 久久不射电影网 | 亚洲一区二区三区视频 |