詳解springcloud 基于feign的服務(wù)接口的統(tǒng)一hystrix降級(jí)處理
springcloud開發(fā)微服務(wù)時(shí),基于feign來做聲明式服務(wù)接口,當(dāng)啟用hystrix服務(wù)熔斷降級(jí)時(shí),項(xiàng)目服務(wù)眾多,每個(gè)Feign服務(wù)接口都得寫一些重復(fù)問的服務(wù)降級(jí)處理代碼,勢(shì)必顯得枯燥無味:
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);
}
對(duì)應(yīng)的熔斷降級(jí)處理類:
@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("請(qǐng)求失?。?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("請(qǐng)求失?。?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ù)較多時(shí)寫這樣重復(fù)的統(tǒng)一熔斷降級(jí)處理顯得十分枯燥無味!
前提場(chǎng)景是你的服務(wù)接口具有統(tǒng)一的報(bào)文格式,例如我的是Result<T>或者PageResult<T>,這樣才有統(tǒng)一全局處理的可能,否則每個(gè)服務(wù)的fallback你是省不了的
本文將采用Cglib動(dòng)態(tài)代理來統(tǒng)一處理這些fallback,說來容易做起來卻十分棘手,完成這一功能,費(fèi)了相當(dāng)大的力氣:

代碼說明:
1、包org.springframework.cloud.openfeign中的都是為實(shí)現(xiàn)這一功能自定義的東西,至于包名為什么取org.springframework.cloud.openfeign,那是因?yàn)閛rg.springframework.cloud.openfeign.Targeter這個(gè)接口聲明是protected的
2、上面4個(gè)類:DefaultFeignClientsConfiguration.java、DefaultHystrixFallbackHandler.java、DefaultHystrixFallbackHandlerFactory.java、HystrixFallbackResults.java是在項(xiàng)目中具體使用的具體配置
代碼位置:
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
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
java基礎(chǔ)之TreeMap實(shí)現(xiàn)類全面詳解
這篇文章主要為大家介紹了java基礎(chǔ)之TreeMap實(shí)現(xiàn)類全面詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-12-12
RxJava2.x+ReTrofit2.x多線程下載文件的示例代碼
本篇文章主要介紹了RxJava2.x+ReTrofit2.x多線程下載文件的示例代碼,具有一定的參考價(jià)值,有興趣的可以了解一下2017-09-09
JetBrains IntelliJ IDEA 配置優(yōu)化技巧
這篇文章主要介紹了JetBrains IntelliJ IDEA 配置優(yōu)化技巧,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-12-12
JAVA Spring中讓人頭痛的JAVA大事務(wù)問題要如何解決你知道嗎
這篇文章主要介紹了Java Spring事務(wù)使用及驗(yàn)證過程詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2021-09-09
深入淺析Spring Security5中默認(rèn)密碼編碼器
這篇文章主要介紹了Spring Security5中默認(rèn)密碼編碼器,非常不錯(cuò),具有一定的參考借鑒價(jià)值 ,需要的朋友可以參考下2019-05-05
Spring Boot 與 kotlin 使用Thymeleaf模板引擎渲染web視圖的方法
這篇文章主要介紹了Spring Boot 與 kotlin 使用Thymeleaf模板引擎渲染web視圖的方法,本文給大家介紹的非常詳細(xì),具有參考借鑒價(jià)值,需要的朋友可以參考下2018-01-01
Java Thread多線程開發(fā)中Object類詳細(xì)講解
這篇文章主要介紹了Java Thread多線程開發(fā)中Object類,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧2023-03-03
Java中綴表達(dá)式轉(zhuǎn)后綴表達(dá)式實(shí)現(xiàn)方法詳解
這篇文章主要介紹了Java中綴表達(dá)式轉(zhuǎn)后綴表達(dá)式實(shí)現(xiàn)方法,結(jié)合實(shí)例形式分析了Java中綴表達(dá)式轉(zhuǎn)換成后綴表達(dá)式的相關(guān)算法原理與具體實(shí)現(xiàn)技巧,需要的朋友可以參考下2019-03-03

