欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

詳解springcloud 基于feign的服務(wù)接口的統(tǒng)一hystrix降級處理

 更新時間:2019年06月03日 14:38:28   作者:penggle  
這篇文章主要介紹了詳解springcloud 基于feign的服務(wù)接口的統(tǒng)一hystrix降級處理,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

springcloud開發(fā)微服務(wù)時,基于feign來做聲明式服務(wù)接口,當(dāng)啟用hystrix服務(wù)熔斷降級時,項目服務(wù)眾多,每個Feign服務(wù)接口都得寫一些重復(fù)問的服務(wù)降級處理代碼,勢必顯得枯燥無味:

Feign服務(wù)接口:

@FeignClient(name="springcloud-nacos-producer", qualifier="productApiService", contextId="productApiService", fallback=ProductFallbackApiService.class)
public interface ProductApiService {

 /**
  * 創(chuàng)建商品
  * @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);
 
 /**
  * 根據(jù)productId獲取商品信息
  * @param productId
  * @return
  */
 @GetMapping(value="/api/product/{productId}", produces=APPLICATION_JSON)
 public Result<Product> getProductById(@PathVariable("productId") Long productId);
 
 /**
  * 根據(jù)條件查詢商品列表(分頁、排序)
  * @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);
}

對應(yīng)的熔斷降級處理類:

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

}

當(dāng)服務(wù)較多時寫這樣重復(fù)的統(tǒng)一熔斷降級處理顯得十分枯燥無味!

前提場景是你的服務(wù)接口具有統(tǒng)一的報文格式,例如我的是Result<T>或者PageResult<T>,這樣才有統(tǒng)一全局處理的可能,否則每個服務(wù)的fallback你是省不了的

本文將采用Cglib動態(tài)代理來統(tǒng)一處理這些fallback,說來容易做起來卻十分棘手,完成這一功能,費(fèi)了相當(dāng)大的力氣:

代碼說明:

1、包org.springframework.cloud.openfeign中的都是為實(shí)現(xiàn)這一功能自定義的東西,至于包名為什么取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

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

最新評論