Spring Cloud Alibaba系列(三)使用feign進行服務調用


什么是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的服務作為消費者。

  1. pom文件中假如openfeign的依賴
 <dependency>
     <groupId>org.springframework.cloud</groupId>
     <artifactId>spring-cloud-starter-openfeign</artifactId>
 </dependency>
  1. 在啟動類上加上支持feign的注解
@EnableFeignClients // 開啟feign
  1. 創建一個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的兩種實現方式

  1. 第一種就是本文中介紹的,Feign和生產者的RequestMapping保持一致
  2. 第二種是在feignClient中提供所有請求的接口,然后controller實現這個feignClient,這樣就不必要寫重復代碼了。

注意點

  1. 請求參數為對象是,使用@requestbody
  2. 請求參數用@requestParam接收時,必須加上value屬性,如@requestParam("name")
  3. 請求參數用@pathVariable接收時,必須加上value屬性,如@pathVariable("name")


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM