hystrix服務(wù)降級方法使用介紹
當(dāng)一個(gè)服務(wù)端的業(yè)務(wù)響應(yīng)的時(shí)間過長的時(shí)候或者業(yè)務(wù)處理邏輯處理異常,不應(yīng)該等待,應(yīng)該給出一種處理方法
超時(shí)導(dǎo)致服務(wù)器變慢(轉(zhuǎn)圈) --->超時(shí)不再等待
出錯(宕機(jī)或程序運(yùn)行出錯) --->出錯要有兜底
pom文件依賴 :
<!--hystrix-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>主啟動類需要加注解:
@EnableHystrix

yml文件設(shè)置:
feign:
hystrix:
enabled: true
feign:hystrix:enabled: true的作用,官網(wǎng)解釋“Feign將使用斷路器包裝所有方法”,也就是將@FeignClient標(biāo)記的那個(gè)service接口下所有的方法進(jìn)行了hystrix包裝(類似于在這些方法上加了一個(gè)@HystrixCommand),這些方法會應(yīng)用一個(gè)默認(rèn)的超時(shí)時(shí)間為1s
情況1
/**
* 超時(shí)訪問,演示降級
* @param id
* @return
*/
@HystrixCommand(fallbackMethod = "paymentInfo_TimeOutHandler",commandProperties = {
@HystrixProperty(name="execution.isolation.thread.timeoutInMilliseconds",value="3000")
})
public String paymentInfo_TimeOut(Integer id)
{
int second = 5;
try { TimeUnit.SECONDS.sleep(second); } catch (InterruptedException e) { e.printStackTrace(); }
return "線程池:"+Thread.currentThread().getName()+"paymentInfo_TimeOut,id: "+id+"\t"+"O(∩_∩)O,耗費(fèi)秒: "+second;
}
public String paymentInfo_TimeOutHandler(Integer id){
return "/(ㄒoㄒ)/調(diào)用支付接口超時(shí)或異常:\t"+ "\t當(dāng)前線程池名字" + Thread.currentThread().getName();
}@HystrixCommand(fallbackMethod = "paymentInfo_TimeOutHandler",
commandProperties ={@HystrixProperty(name="execution.isolation.thread.timeoutInMilliseconds",
value="3000")
})
@HystrixCommand:需要進(jìn)行降級處理的業(yè)務(wù)處理方法的標(biāo)注注解
fallbackMethod :發(fā)生時(shí)間過長的時(shí)候或運(yùn)行錯誤的時(shí)候需要調(diào)用的方法
@HystrixProperty:相關(guān)參數(shù)設(shè)置,如上就是設(shè)置超時(shí)時(shí)間,超過了3s就調(diào)用方法
情況2:每個(gè)業(yè)務(wù)方法對應(yīng)一個(gè)兜底的方法,代碼膨脹,統(tǒng)一和自定義的分開
@RestController
@Slf4j
@DefaultProperties(defaultFallback = "payment_Global_FallbackMethod")
public class PaymentHystirxController
{
@GetMapping("/consumer/payment/hystrix/timeout/{id}")
@HystrixCommand //加了@DefaultProperties屬性注解,并且沒有寫具體方法名字,就用統(tǒng)一全局的
public String paymentInfo_TimeOut(@PathVariable("id") Integer id)
{
String result = paymentHystrixService.paymentInfo_TimeOut(id);
return result;
}
public String paymentTimeOutFallbackMethod(@PathVariable("id") Integer id)
{
return "paymentTimeOutFallbackMethod,對方系統(tǒng)繁忙,請10秒鐘后再次嘗試/(ㄒoㄒ)/";
}
public String payment_Global_FallbackMethod()
{
return "Global異常處理信息,請稍后再試,/(ㄒoㄒ)/~~";
}
}@DefaultProperties(defaultFallback = "payment_Global_FallbackMethod")
defaultFallback :指定默認(rèn)改控制類的所有標(biāo)注了@HystrixCommand的控制方法降級處理都是名字為payment_Global_FallbackMethod
如果需要針對處理的,可以添加fallbackMethod 參數(shù)和情況1一樣處理掉
情況3:和業(yè)務(wù)邏輯混一起???混亂
說明:當(dāng)引發(fā)降級處理的時(shí)候,也可能是因?yàn)榉?wù)內(nèi)部程序發(fā)生了錯誤或調(diào)用的服務(wù)宕機(jī),這個(gè)時(shí)候就需要給客戶處理的不再是“業(yè)務(wù)繁忙”而是“內(nèi)部程序錯誤”
案列:現(xiàn)在有80服務(wù)調(diào)用8001端口的業(yè)務(wù),但8001端口的服務(wù)突然出現(xiàn)宕機(jī);80端口使用feign處理8001端口的調(diào)用
@Component
@FeignClient(value = "CLOUD-PROVIDER-HYSTRIX-PAYMENT",
fallback = PaymentFallbackService.class)
public interface PaymentHystrixService
{
@GetMapping("/payment/hystrix/ok/{id}")
String paymentInfo_OK(@PathVariable("id") Integer id);
@GetMapping("/payment/hystrix/timeout/{id}")
String paymentInfo_TimeOut(@PathVariable("id") Integer id);
}@FeignClient(value = "CLOUD-PROVIDER-HYSTRIX-PAYMENT",
fallback = PaymentFallbackService.class)
value:是8001端口的服務(wù)名稱
fallback :是該接口的實(shí)現(xiàn)類,也就是在80端口調(diào)用8001端口服務(wù)發(fā)生錯誤的時(shí)候需要進(jìn)行的方法
@Component //必須加 //必須加 //必須加
public class PaymentFallbackService implements PaymentHystrixService
{
@Override
public String paymentInfo_OK(Integer id) {
return "服務(wù)調(diào)用失敗,提示來自:cloud-consumer-feign-order80";
}
@Override
public String paymentInfo_TimeOut(Integer id) {
return "服務(wù)調(diào)用失敗,提示來自:cloud-consumer-feign-order80";
}
}補(bǔ)充 :
說明:現(xiàn)在有80端口控制類調(diào)用了8001端口業(yè)務(wù)處理類,但在8001端口這個(gè)服務(wù)也設(shè)置了服務(wù)降級,假設(shè)為5s超時(shí)處理,而80這邊設(shè)置的服務(wù)降級為3s超時(shí)處理,現(xiàn)在業(yè)務(wù)響如果超過了3s,那么應(yīng)該響應(yīng)的是80端口這邊的服務(wù)降級處理
到此這篇關(guān)于hystrix服務(wù)降級方法使用介紹的文章就介紹到這了,更多相關(guān)hystrix服務(wù)降級內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
關(guān)于Java單個(gè)TCP(Socket)連接發(fā)送多個(gè)文件的問題
這篇文章主要介紹了關(guān)于Java單個(gè)TCP(Socket)連接發(fā)送多個(gè)文件的問題,每次我只能使用一個(gè) Socket 發(fā)送一個(gè)文件,沒有辦法做到連續(xù)發(fā)送文件,本文來解決這個(gè)問題,需要的朋友可以參考下2023-04-04
Java詳細(xì)分析講解自動裝箱自動拆箱與Integer緩存的使用
裝箱就是把基本類型轉(zhuǎn)換成包裝類,拆箱就是把包裝類轉(zhuǎn)換成基本類型,下面這篇文章主要給大家介紹Java中自動裝箱、自動拆箱與Integer緩存,需要的朋友可以參考下2022-04-04
Java中volatile關(guān)鍵字的作用與用法詳解
volatile關(guān)鍵字雖然從字面上理解起來比較簡單,但是要用好不是一件容易的事情。這篇文章主要介紹了Java中volatile關(guān)鍵字的作用與用法詳解的相關(guān)資料,需要的朋友可以參考下2016-09-09
SpringMVC實(shí)現(xiàn)通過郵件找回密碼功能
本篇文章主要介紹的是SpringMVC實(shí)現(xiàn)通過郵件找回密碼功能,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧。2016-10-10
Springboot攔截器如何獲取@RequestBody參數(shù)
這篇文章主要介紹了Springboot攔截器如何獲取@RequestBody參數(shù)的操作,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-06-06
SpringData如何通過@Query注解支持JPA語句和原生SQL語句
這篇文章主要介紹了SpringData如何通過@Query注解支持JPA語句和原生SQL語句,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-11-11

