天天看點

Spring Cloud實戰06-- Feign

在前面的學習中,我們使用了Ribbon的負載均衡功能,大大簡化了遠端調用時的代碼:

如果就學到這裡,你可能以後需要編寫類似的大量重複代碼,格式基本相同,無非參數不一樣。有沒有更優雅的方式,來對這些代碼再次優化呢?

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

簡介

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

項目首頁:https://github.com/OpenFeign/feign

Spring Cloud實戰06-- Feign

快速入門

改造bubbletg-consumer工程

導入依賴
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
           
開啟Feign功能

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

@SpringCloudApplication
@EnableFeignClients // 開啟feign用戶端
public class ServiceConsumerApplication {

    //@Bean
    //@LoadBalanced
    //public RestTemplate restTemplate() {
    //    return new RestTemplate();
    //}

    public static void main(String[] args) {
        SpringApplication.run(ServiceConsumerApplication.class, args);
    }

}
           

删除RestTemplate**:feign已經自動內建了Ribbon負載均衡的RestTemplate。是以,此處不需要再注冊RestTemplate。

Feign的用戶端

在bubbletg-consumer工程中,添加UserClient接口:

/**
 * @author www.bubbletg.cn * BubbleTg
 * @version 1.0
 * @date 2019/8/24 9:17
 */
@FeignClient(value = "service-provider") // 标注該類是一個feign接口
public interface UserClient {
    @GetMapping("user/{id}")
    User queryUserById(@PathVariable("id") Long id);
}
           
  • 首先這是一個接口,Feign會通過動态代理,幫我們生成實作類。這點跟mybatis的mapper很像
  • @FeignClient

    ,聲明這是一個Feign用戶端,類似

    @Mapper

    注解。同時通過

    value

    屬性指定服務名稱
  • 接口中的定義方法,完全采用SpringMVC的注解,Feign會根據注解幫我們生成URL,并通路擷取結果

改造原來的調用邏輯,調用UserClient接口:

@Controller
@RequestMapping("consumer/user")
public class UserController {

    @Autowired
    private UserClient userClient;

    @GetMapping
    @ResponseBody
    public User queryUserById(@RequestParam("id") Long id){
        User user = this.userClient.queryUserById(id);
        return user;
    }

}
           
測試
Spring Cloud實戰06-- Feign

負載均衡

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

Spring Cloud實戰06-- Feign

是以我們不需要額外引入依賴,也不需要再注冊

RestTemplate

對象。

Hystrix支援

Feign預設也有對Hystrix的內建:

Spring Cloud實戰06-- Feign

隻不過,預設情況下是關閉的。我們需要通過下面的參數來開啟:(在bubbletg-consumer工程添加配置内容)

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

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

Spring Cloud實戰06-- Feign
@Component
public class UserClientFallback implements UserClient {

    @Override
    public User queryUserById(Long id) {
        User user = new User();
        user.setUsername("伺服器繁忙,請稍後再試!UserClientFallback-----");
        return user;
    }
    
}
           

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

@FeignClient(value = "service-provider", fallback = UserClientFallback.class) // 标注該類是一個feign接口
public interface UserClient {

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

重新開機測試:

Spring Cloud實戰06-- Feign

請求壓縮(了解)

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

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

繼續閱讀