什麼是Feign
Feign是spring cloud提供的一個宣告式的偽http客戶端,它使得呼叫遠端服務就像呼叫本地服務一樣簡單,只需要建立一個介面並新增一天註解即可。
Nacos很好的相容了Feign,Feign預設預設繼承了Ribbon,所以在nacos下使用Feign預設就實現了負載均衡的效果。
Ribbon支援的負載均衡策略
負載均衡就是將請求分攤給多個例項進行進行處理。
根據負載均衡發生位置的不同,一般分為服務端負載均衡和客戶端負載均衡。
服務端負載均衡指的是發生在服務提供者一方,比如常見的nginx負載均衡。
客戶端負載均衡指的是發生在服務請求的一方,也就是在服務請求之前已經選好了由哪個例項進行處理。
我們在微服務中一般會選擇客戶端負載均衡,Ribbon就是在客戶端進行了負載。
Ribbon內建了多種負載均衡策略,內部負載均衡的頂級介面為:com.netflix.loadbalancer.IRule,具體的負載策略如下圖所示:
策略類 | 命名 | 描述 |
---|---|---|
RandomRule | 隨機策略 | 隨機選擇server |
RoundRobinRule | 輪詢策略 | 按照順序選擇server(ribbon預設策略) |
RetryRule | 重試策略 | 在一個配置時間段內,當選擇server不成功,則一直嘗試選擇一個可用的server |
BestAvailableRule | 最低併發策略 | 逐個考察server,如果server斷路器開啟,則忽略,再選擇其中併發連結最低的server |
AvailabilityFilteringRule | 可用過濾策略 | 過濾掉一直失敗並被標記為circuit tripped的server,過濾掉那些高併發連結的server(active connections超過配置的閾值) |
ResponseTimeWeightedRule | 響應時間加權重策略 | 根據server的響應時間分配權重,響應時間越長,權重越低,被選擇到的概率也就越低。響應時間越短,權重越高,被選中的概率越高,這個策略很貼切,綜合了各種因素,比如:網路,磁碟,io等,都直接影響響應時間 |
ZoneAvoidanceRule | 區域權重策略 | 綜合判斷server所在區域的效能,和server的可用性,輪詢選擇server並且判斷一個AWS Zone的執行效能是否可用,剔除不可用的Zone中的所有server |
如何使用Feign
我們使用第一章中的nacos-discovery-server作為服務提供者,提供了一個“/hello”的介面。新建一個alibaba-client-feign的服務作為消費者。
- pom檔案中假如openfeign的依賴
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
- 在啟動類上加上支援feign的註解
@EnableFeignClients // 開啟feign
- 建立一個feign客戶端並使用feign呼叫微服務
@RestController
class TestController{
@Autowired
Client client;
@GetMapping("/test")
String test(){
return client.hello("hahaha");
}
}
@FeignClient(name="nacos-discovery-server")
interface Client{
@GetMapping("/hello")
String hello(@RequestParam String name);
}
注意:在實際開發中,feign客戶端都是寫在公共模組當中,哪個服務需要呼叫引入公共模組即可。
Feign的兩種實現方式
- 第一種就是本文中介紹的,Feign和生產者的RequestMapping保持一致。
- 第二種是在feignClient中提供所有請求的介面,然後controller實現這個feignClient,這樣就不必要寫重複程式碼了。
注意點
- 請求引數為物件是,使用@requestbody
- 請求引數用@requestParam接收時,必須加上value屬性,如@requestParam("name")
- 請求引數用@pathVariable接收時,必須加上value屬性,如@pathVariable("name")