您好,登錄后才能下訂單哦!
這篇文章主要介紹springcloud如何實現基于feign的服務接口的統一hystrix降級處理,文中介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們一定要看完!
springcloud開發微服務時,基于feign來做聲明式服務接口,當啟用hystrix服務熔斷降級時,項目服務眾多,每個Feign服務接口都得寫一些重復問的服務降級處理代碼,勢必顯得枯燥無味:
Feign服務接口:
@FeignClient(name="springcloud-nacos-producer", qualifier="productApiService", contextId="productApiService", fallback=ProductFallbackApiService.class) public interface ProductApiService { /** * 創建商品 * @param product */ @PostMapping(value="/api/product/add", produces=APPLICATION_JSON, consumes=APPLICATION_JSON) public Result<Long> createProduct(@RequestBody Product product); /** * 修改商品 * @param product */ @PutMapping(value="/api/product/update", produces=APPLICATION_JSON, consumes=APPLICATION_JSON) public Result<Object> updateProduct(@RequestBody Product product); /** * 刪除商品 * @param productId */ @DeleteMapping(value="/api/product/delete/{productId}", produces=APPLICATION_JSON) public Result<Object> deleteProductById(@PathVariable("productId") Long productId); /** * 根據productId獲取商品信息 * @param productId * @return */ @GetMapping(value="/api/product/{productId}", produces=APPLICATION_JSON) public Result<Product> getProductById(@PathVariable("productId") Long productId); /** * 根據條件查詢商品列表(分頁、排序) * @param condition * @param page * @param sort * @return */ @GetMapping(value="/api/product/list1", produces=APPLICATION_JSON) public PageResult<List<Product>> getProductListByPage(@RequestParam Product condition, @RequestParam Page page, @RequestParam Sort sort); }
對應的熔斷降級處理類:
@Component public class ProductFallbackApiService implements ProductApiService { private static final HttpStatus SERVICE_UNAVAILABLE = HttpStatus.SERVICE_UNAVAILABLE; protected <T> Result<T> defaultFallbackResult() { return Result.failure().code(String.valueOf(SERVICE_UNAVAILABLE.value())).message(String.format("請求失敗:%s, %s", SERVICE_UNAVAILABLE.value(), SERVICE_UNAVAILABLE.getReasonPhrase())).build(); } protected <T> PageResult<T> defaultFallbackPageResult() { return PageResult.failure().code(String.valueOf(SERVICE_UNAVAILABLE.value())).message(String.format("請求失敗:%s, %s", SERVICE_UNAVAILABLE.value(), SERVICE_UNAVAILABLE.getReasonPhrase())).build(); } @Override public Result<Long> createProduct(Product product) { return defaultFallbackResult(); } @Override public Result<Object> updateProduct(Product product) { return defaultFallbackResult(); } @Override public Result<Object> deleteProductById(Long productId) { return defaultFallbackResult(); } @Override public Result<Product> getProductById(Long productId) { return defaultFallbackResult(); } @Override public PageResult<List<Product>> getProductListByPage(Product condition, Page page, Sort sort) { return defaultFallbackPageResult(); } }
當服務較多時寫這樣重復的統一熔斷降級處理顯得十分枯燥無味!
前提場景是你的服務接口具有統一的報文格式,例如我的是Result<T>或者PageResult<T>,這樣才有統一全局處理的可能,否則每個服務的fallback你是省不了的
本文將采用Cglib動態代理來統一處理這些fallback,說來容易做起來卻十分棘手,完成這一功能,費了相當大的力氣:
代碼說明:
1、包org.springframework.cloud.openfeign中的都是為實現這一功能自定義的東西,至于包名為什么取org.springframework.cloud.openfeign,那是因為org.springframework.cloud.openfeign.Targeter這個接口聲明是protected的
2、上面4個類:DefaultFeignClientsConfiguration.java、DefaultHystrixFallbackHandler.java、DefaultHystrixFallbackHandlerFactory.java、HystrixFallbackResults.java是在項目中具體使用的具體配置
代碼位置:
1、https://github.com/penggle/xmodule/tree/master/xmodule-common-springcloud
2、https://github.com/penggle/xmodule/tree/master/xmodule-examples-springcloud/xmodule-examples-springcloud-nacos
快速上手入口:https://github.com/penggle/xmodule/blob/master/xmodule-common-springcloud/src/main/java/org/springframework/cloud/openfeign/HystrixFallbackConfiguration.java
以上是“springcloud如何實現基于feign的服務接口的統一hystrix降級處理”這篇文章的所有內容,感謝各位的閱讀!希望分享的內容對大家有幫助,更多相關知識,歡迎關注億速云行業資訊頻道!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。