一、什么是Feign? Feign可以做什么
Feign 可以將Rest 的請求隱藏,偽裝成SpringMvc的Controller一樣,你不用自己去拼接url,參數等操作,
一切都交給Feign去處理
Spring Cloud對Feign 進行了增強,使Feign支持了SpringMvc的注解,並且整合了Ribbon和Eureka,從而
讓Feign的使用更加方便
二、Feign 快速入門
1、引入依賴
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> </dependency>
2、Feign 客戶端
@FeignClient("user-service")
public interface UserFeignClient {
@GetMapping("/user/{id}")
User queryUserById(@PathVariable("id") Long id);
}
首先這是一個接口,Feign會通過動態代理,幫我們生成實現類。這點跟mybatis的mapper很像
接口中的定義方法,完全采用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; } }
3、開啟Feign 功能
在啟動類上,添加注解,開啟Feign功能
@SpringBootApplication
@EnableDiscoveryClient
@EnableHystrix
@EnableFeignClients // 開啟Feign功能
public class UserConsumerDemoApplication {
public static void main(String[] args) {
SpringApplication.run(UserConsumerDemoApplication.class, args);
}
}
=================================================================
Feign中本身已經集成了Ribbon依賴和自動配置:
Ribbon 配置
user-service:
ribbon:
ConnectTimeout: 250 # 連接超時時間(ms)
ReadTimeout: 1000 # 通信超時時間(ms)
OkToRetryOnAllOperations: true # 是否對所有操作重試
MaxAutoRetriesNextServer: 1 # 同一服務不同實例的重試次數
MaxAutoRetries: 1 # 同一實例的重試次數
Hystrix :
Feign默認情況下沒有開啟熔斷,需要通過以下參數來開啟熔斷
feign:
hystrix:
enabled: true # 開啟Feign的熔斷功能
feign 熔斷后,回調函數的編寫
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)測試