SpringCloud-Feign入門

引言

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

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

如果就學到這裏,你可能以後需要編寫類似的大量重複代碼(http://service-provider/user/" + id, String.class),格式基本相同,無非參數不一樣。有沒有更優雅的方式,來將這些重複的代碼“藏起來”,我們只需要傳入參數得到結果,不用關心具體是誰做的呢?這就是我們接下來要學的Feign的功能了。

簡介

Feign:假裝,僞裝

爲什麼叫僞裝?

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

一、入門級實現

在這裏插入圖片描述

1.導入依賴

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

2.開啓Feign功能

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

@SpringCloudApplication
@EnableFeignClients // 開啓feign客戶端
public class ItcastServiceConsumerApplication {
    
    public static void main(String[] args) {
        SpringApplication.run(ItcastServiceConsumerApplication.class, args);
    }
}

刪除RestTemplate:feign已經自動集成了Ribbon負載均衡的RestTemplate。所以,此處不需要再註冊RestTemplate。

3.Feign的客戶端

在itcast-service-consumer工程中,添加UserClient接口:
在這裏插入圖片描述

內容:

@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;
    }

}

二、集成

1. 負載均衡

Feign中本身已經集成了Ribbon依賴和自動配置:
在這裏插入圖片描述
因此我們不需要額外引入依賴,也不需要再註冊RestTemplate對象。

2.Hystrix支持

Feign默認也有對Hystrix的集成:
在這裏插入圖片描述
只不過,默認情況下是關閉的。我們需要通過下面的參數來開啓:(在itcast-service-consumer工程添加配置內容)

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

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

1)首先,我們要定義一個類UserClientFallback,實現剛纔編寫的UserClient,作爲fallback的處理類
在這裏插入圖片描述

@Component
public class UserClientFallback implements UserClient {

    @Override
    public User queryById(Long id) {
        User user = new User();
        user.setUserName("服務器繁忙,請稍後再試!");
        return user;
    }
}

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

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

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

3.請求壓縮

4.日誌級別

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章