1. 程式人生 > >SpringCloud之遠端呼叫Feign

SpringCloud之遠端呼叫Feign

一.Feign

在上篇文章中,我們使用了Ribbon的負載均衡功能,大大簡化了遠端呼叫時的程式碼:

String baseUrl = "http://user-service/user/";
User user = this.restTemplate.getForObject(baseUrl + id, User.class)

這就是我們接下來要學的Feign的功能了。

1.1.簡介

有道詞典的英文解釋:

在這裡插入圖片描述

為什麼叫偽裝?

Feign可以把Rest的請求進行隱藏,偽裝成類似SpringMVC的Controller一樣。你不用再自己拼接url,拼接引數等等操作,一切都交給Feign去做。

專案主頁:https://github.com/OpenFeign/feign

在這裡插入圖片描述

1.2.快速入門

1.2.1.匯入依賴

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

1.2.2.Feign的客戶端

@FeignClient("user-service")
public interface
UserFeignClient { @GetMapping("/user/{id}") User queryUserById(@PathVariable("id") Long id); }
  • 首先這是一個介面,Feign會通過動態代理,幫我們生成實現類。
  • @FeignClient,宣告這是一個Feign客戶端,類似@Mapper註解。同時通過value屬性指定服務名稱
  • 介面中的定義方法,完全採用SpringMVC的註解,Feign會根據註解幫我們生成URL,並訪問獲取結果

改造原來的呼叫邏輯,修改UserDao:

 @Autowired
    private
UserFeighClient userFeighClient; @HystrixCommand(fallbackMethod = "queryUserByIdFallback") public User queryUserById(Long id){ long begin = System.currentTimeMillis(); User user = this.userFeighClient.queryById(id); long end = System.currentTimeMillis(); System.out.println("用時:"+(begin-end)); return user; }

1.2.3.開啟Feign功能

我們在啟動類上,添加註解,開啟Feign功能

@SpringBootApplication
@EnableDiscoveryClient
@EnableHystrix
@EnableFeignClients // 開啟Feign功能
public class UserConsumerDemoApplication {
    public static void main(String[] args) {
        SpringApplication.run(UserConsumerDemoApplication.class, args);
    }
}
  • 你會發現RestTemplate的註冊被我刪除了。Feign中已經自動集成了Ribbon負載均衡,因此我們不需要自己定義RestTemplate了

1.2.4.啟動測試:

訪問介面:

在這裡插入圖片描述

正常獲取到了結果。

1.3.負載均衡

Feign中本身已經集成了Ribbon依賴和自動配置:

在這裡插入圖片描述

因此我們不需要額外引入依賴,也不需要再註冊RestTemplate物件。

另外,我們可以像上節課中講的那樣去配置Ribbon,可以通過ribbon.xx來進行全域性配置。也可以通過服務名.ribbon.xx來對指定服務配置:

全域性配置:對所有服務都生效

ribbon:
  ConnectTimeout: 250 # 連線超時時間(ms)
  ReadTimeout: 1000 # 通訊超時時間(ms)
  OkToRetryOnAllOperations: true # 是否對所有操作重試
  MaxAutoRetriesNextServer: 1 # 同一服務不同例項的重試次數
  MaxAutoRetries: 1 # 同一例項的重試次數

區域性配置:只對當前服務生效

user-service:
  ribbon:
    ConnectTimeout: 250 # 連線超時時間(ms)
    ReadTimeout: 1000 # 通訊超時時間(ms)
    OkToRetryOnAllOperations: true # 是否對所有操作重試
    MaxAutoRetriesNextServer: 1 # 同一服務不同例項的重試次數
    MaxAutoRetries: 1 # 同一例項的重試次數

1.4.Hystix支援

Feign預設也有對Hystix的整合:

在這裡插入圖片描述

只不過,預設情況下是關閉的。我們需要通過下面的引數來開啟:

feign:
  hystrix:
    enabled: true # 開啟Feign的熔斷功能

但是,Feign中的Fallback配置不像Ribbon中那樣簡單了。

1)首先,我們要定義一個類,實現剛才編寫的UserFeignClient,作為fallback的處理類

@Component
public class UserFeignClientFallback implements UserFeignClient {
    @Override
    public User queryUserById(Long id) {
        User user = new User();
        user.setId(id);
        user.setName("使用者查詢出現異常!");
        return user;
    }
}

2)然後在UserFeignClient中,指定剛才編寫的實現類

@FeignClient(value = "user-service", fallback = UserFeignClientFallback.class)
public interface UserFeignClient {

    @GetMapping("/user/{id}")
    User queryUserById(@PathVariable("id") Long id);
}

3)重啟測試:

我們關閉user-service服務,然後在頁面訪問:

在這裡插入圖片描述

1.5.請求壓縮

GZIP壓縮:

Spring Cloud Feign 支援對請求和響應進行GZIP壓縮,以減少通訊過程中的效能損耗。通過下面的引數即可開啟請求與響應的壓縮功能:

feign:
  compression:
    request:
      enabled: true # 開啟請求壓縮
    response:
      enabled: true # 開啟響應壓縮

同時,我們也可以對請求的資料型別,以及觸發壓縮的大小下限進行設定:

feign:
  compression:
    request:
      enabled: true # 開啟請求壓縮
      mime-types: text/html,application/xml,application/json # 設定壓縮的資料型別
      min-request-size: 2048 # 設定觸發壓縮的大小下限

注:上面的資料型別、壓縮大小下限均為預設值。

再給大家推薦本人的另外一篇文章:
SpringCloud之閘道器Zuul