SpringCloud之初識Feign ----- 分布式負載自動拼接請求的URL


在前面的學習中,我們使用了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會通過動態代理,幫我們生成實現類。這點跟mybatis的mapper很像

  • @FeignClient,聲明這是一個Feign客戶端,類似@Mapper注解。同時通過value屬性指定服務名稱

  • 接口中的定義方法,完全采用SpringMVC的注解,Feign會根據注解幫我們生成URL,並訪問獲取結果

 改造原來的調用邏輯,不再調用UserDao:

@Service
public class UserService {

   @Autowired
   private UserFeignClient userFeignClient;

   public List<User> queryUserByIds(List<Long> ids) {
   List<User> users = new ArrayList<>();
   ids.forEach(id -> {
     // 我們測試多次查詢,
     users.add(this.userFeignClient.queryUserById(id));
   });
   return users;
  }
}

 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來對指定服務配置:

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

 1.4.Hystrix支持

 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.請求壓縮(了解)

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 # 設置觸發壓縮的大小下限

  注:上面的數據類型、壓縮大小下限均為默認值。

 至此,Feign 的基本知識差不多講解完了。如有不對或是有問題不夠深入的地方還望大家指正,共同學習!


免責聲明!

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



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