轉自:https://www.jianshu.com/p/d84768f7996d
Spring Cloud Feign 之Fallback
環境信息: java 1.8、Spring boot 1.5.10.RELEASE、spring cloud-Edgware.SR3、maven 3.3+
在網絡請求時,可能會出現異常請求,如果還想再異常情況下使系統可用,那么就需要容錯處理,比如:網絡請求超時時給用戶提示“稍后重試”或使用本地快照數據等等。
Spring Cloud Feign就是通過Fallback
實現的,有兩種方式:
1、@FeignClient.fallback = UserFeignFallback.class
指定一個實現Feign接口的實現類。
2、@FeignClient.fallbackFactory = UserFeignFactory.class
指定一個實現FallbackFactory<T>
工廠接口類
因為Fallback
是通過Hystrix
實現的, 所以需要開啟Hystrix
,spring boot application.properties
文件配置feign.hystrix.enabled=true
,這樣就開啟了Fallback
Fallback-實現Feign接口
UserFeignFallback
回調實現,由spring創建使用@Component
(其他的注冊也可以)注解
HystrixTargeter.targetWithFallback
方法實現了@FeignClient.fallback
處理邏輯,通過源碼可以知道UserFeignFallback
回調類是從Spring容器中獲取的,所以UserFeignFallback
由spring創建。
UserFeign
配置:
package com.example.feign; import org.springframework.cloud.netflix.feign.FeignClient; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; import java.util.List; @FeignClient(name = "user",url = "${user.url}",fallback = UserFeignFallback.class /*fallbackFactory = UserFeignFactory.class*/) public interface UserFeign { @PostMapping void save(User user); @GetMapping("/{id}") User getUserByID(@PathVariable("id") String id); @GetMapping List<User> findAll(); }
UserFeignFallback
類:
package com.example.feign; import org.springframework.stereotype.Component; import java.util.List; @Component public class UserFeignFallback implements UserFeign { @Override public void save(User user) { } @Override public User getUserByID(String id) { User user = new User(); user.setId("100"); user.setName("fallback 回調用戶"); return user; } @Override public List<User> findAll() { return null; } }
為了模擬回調失敗服務提供方,拋出500錯誤。
@GetMapping("/{id}") public User getUserByID(@PathVariable("id") String id) { // return userMap.get(id); throw new RuntimeException("服務端測試異常!"); }
運行單元測試UserFeignTest.getUserByID
控制台輸出結果:
2018-08-18 11:47:59.800 INFO 8660 --- [ hystrix-user-1] com.example.feign.UserFeign : [UserFeign#getUserByID] ---> GET http://localhost:8080/user/1 HTTP/1.1 2018-08-18 11:47:59.800 INFO 8660 --- [ hystrix-user-1] com.example.feign.UserFeign : [UserFeign#getUserByID] ---> END HTTP (0-byte body) 2018-08-18 11:47:59.828 INFO 8660 --- [ hystrix-user-1] com.example.feign.UserFeign : [UserFeign#getUserByID] <--- HTTP/1.1 500 (27ms) 2018-08-18 11:47:59.828 INFO 8660 --- [ hystrix-user-1] com.example.feign.UserFeign : [UserFeign#getUserByID] connection: close 2018-08-18 11:47:59.828 INFO 8660 --- [ hystrix-user-1] com.example.feign.UserFeign : [UserFeign#getUserByID] content-type: application/json;charset=UTF-8 2018-08-18 11:47:59.828 INFO 8660 --- [ hystrix-user-1] com.example.feign.UserFeign : [UserFeign#getUserByID] date: Sat, 18 Aug 2018 03:47:59 GMT 2018-08-18 11:47:59.828 INFO 8660 --- [ hystrix-user-1] com.example.feign.UserFeign : [UserFeign#getUserByID] transfer-encoding: chunked 2018-08-18 11:47:59.828 INFO 8660 --