Spring Cloud Feign - 聲明式 REST Client

一、Feign是什麼

  • 聲明式REST client,來自NetFlix。
  • 容許你編寫無實現代碼調用REST services
  • 替換RestTemplate(甚至更簡單)
  • Spring Cloud 爲使用Feign提供了包裝器

二、怎樣使用Feign

對比:Spring REST Templatespring

Spring Rest Template 爲調用REST services提供了一個很是簡單的方式。json

RestTempate restTemplate=new RestTemplate();//實例化或者依賴注入

String url="http://inventoryService/{0}";//提供目標URl(注意佔位符)

Sku sku=template.getForObject(url,Sku.class,4724352);//調用URL,提供但願轉換的class,提供佔位符的值,Template負責全部HTTP和類型轉換

缺點:可是,這段代碼仍然須要app

  • 編寫
  • 使用mock/stubs進行單元測試

三、Feign如何工做?

  • 定義REST client接口代碼
  • 用Feign註解標籤註解接口
  • 用Spring MVC 註解標籤註解方法

Spring Cloud將在運行時實現負載均衡

  • 掃描接口
  • 自動實現調用REST service和處理響應的代碼

Feign接口

建立一個interface,非Class單元測試

//標註由Feign/Spring 實現的接口
@FeignClient(url="localhost:8080/warehouse")
public interface InventoryClient{
@RequestMapping(method=RequestMethod.GET,value="/inventory")
List<Item> getItems();

@RequestMapping(method=RequestMethod.POST,value="/inventory/{sku}",consumes="application/json")
void update(@PathVariable("sku") Long sku,@RequestBody Item item);

}

注意:使用Spring Cloud的時候Feign還須要額外的依賴包測試

運行時實現url

Spring 掃描@FeignClientsspa

運行時提供實現rest

@SpringBootApplication
@EnableFeignClients //Spring 會查找interfaces並實現它
public class Application{

}

就是這樣code

由Spring/Feign 提供實現


@EnableFeignClients作了什麼?

Feign和Eureka

  • 前面的例子,寫死了URL
@FeignClient(url="localhost:8080/warehouse")
  • 使用Eureka「Client ID」 代替
@FeignClient("warehouse")

Ribbon是自動啓用的

  • Eureka提供了匹配指定的「Client ID」的全部Client
  • Rebbon自動應用負載均衡
  • Feign處理這些代碼

運行時依賴

在運行時須要Feign Starter

但不是編譯時

<dependencies>
<dependency>
			<groupId>org.springframework.cloud</groupId>
			<artifactId>spring-cloud-starter-feign</artifactId>
</dependency>
</dependencies>

總結

  • Feign爲調用REST Service提供了一個很是簡單的方式
  • Feign自動集成了Rebbon和Eureka
相關文章
相關標籤/搜索