前文鏈接
[JavaEE] 搭建SpringCloud環(huán)境 進入微服務(wù)時代
http://www.reibang.com/p/a0365a635975
溫馨提示:本文是基于前文的擴展 沒有基礎(chǔ)的新手可以先去學(xué)習(xí)上文
一.簡介
Hystrix
是一套完善的服務(wù)保護組件, 可以實現(xiàn)服務(wù)降級
, 服務(wù)熔斷
, 服務(wù)隔離
等保護措施 使用它可以合理的應(yīng)對高并發(fā)的情況 做到保護服務(wù)的效果
二.發(fā)現(xiàn)問題
有人可能會問 為什么要使用服務(wù)保護功能呢? 我的服務(wù)器明明跑的很好的... 好的 那這里 我就舉個例子來說明一下 為什么要進行服務(wù)保護 設(shè)想這樣一種情況 你的服務(wù)器由于用戶量訪問過大 而癱瘓 這樣的例子不在少數(shù) 比如某寶雙11活動
或是12306
過年搶票 都導(dǎo)致過網(wǎng)站崩潰 有的是不能進行訪問
, 有的是在那里一直轉(zhuǎn)圈加載
, 這樣做顯然是有問題的, 因為用戶根本不知道你出了什么事, 春運是國人心中的大事, 不能買票更是讓人心不安
我們現(xiàn)在就來模擬一下這種狀況 這里使用阿帕奇的JMeter
來做壓力測試 我在service-a
中把延時調(diào)整為5秒
然后我們訪問一下接口 發(fā)現(xiàn)5秒之后可以順利的返回數(shù)據(jù)
之后我們使用JMeter
開1000個線程來訪問這個接口
之后我們訪問接口
我們發(fā)現(xiàn)服務(wù)10秒之后都無法訪問 證明服務(wù)已經(jīng)崩了 - -
之后我們再來看一個現(xiàn)象
我們在service-a中加入一個接口
@RequestMapping("/otherService")
public String otherService() {
return "我是其他服務(wù)";
}
然后重新運行服務(wù) 我們再次對hello接口做壓力測試
不幸的是你會發(fā)現(xiàn)otherService
服務(wù)也無法訪問了 - -
到這里你可能會問 我壓力測試的接口是hello 為什么otherService接口也會崩潰呢? 這種現(xiàn)象就叫做服務(wù)器的雪崩效應(yīng)
, 因為tomcat
啟動之后會創(chuàng)建一個線程池
來處理用戶請求, 而線程池中的線程是有限的, 當超出承載的最大請求數(shù)量
時, 那用戶的請求可就要開始排隊了, 所以就會出現(xiàn)一直轉(zhuǎn)圈的情況, 所以雖然訪問的是hello接口 但是他們兩個是用了同一個線程池 所以都受到了影響
那我們要如何解決這個問題呢?
三.集成Hystrix
沒錯 接下來我們就要使用這篇文章開始就提到的服務(wù)保護
來解決問題了, 我們使用服務(wù)隔離
機制就可以輕松的解決服務(wù)雪崩效應(yīng)
下面跟著我們的鏡頭一起來看吧!
一共分三步
1.導(dǎo)入Maven依賴
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
</dependencies>
2.在程序入口開啟@EnableHystrix
3.在接口上開啟Hystrix服務(wù)保護
然后重新運行服務(wù) 我們來看看效果
我們發(fā)現(xiàn)沒有開啟壓力測試接口仍為服務(wù)器繁忙 所以這里我們要進行一個配置 在application.yml
中設(shè)置
hystrix:
command:
default:
execution:
timeout:
enabled: false
這個配置的含義是忽略hystrix的超時時間 因為我們服務(wù)器配置延時5秒 hystrix默認就執(zhí)行了fallback
之后我們再次運行服務(wù) 發(fā)現(xiàn)可以正常訪問了
之后我們對這個接口做壓力測試 看另外的服務(wù)是否會受到影響
我們可以看到 做壓力測試之后hello
這個接口返回了我們設(shè)置好的 服務(wù)器繁忙
而另一個otherService
接口正常運行 這就是所謂的服務(wù)隔離機制
原理就是把hello
接口放入了hystrix
自己創(chuàng)建的線程池里面 使主線程池不受到影響 不過開啟服務(wù)保護需要消耗大量的CPU 所以只需要在高并發(fā)的接口上使用就可以了
我們在例子中可以看到 以前開啟壓力測試后的步驟是:
開啟hystrix前
1.壓力測試
2.訪問hello接口
3.一直轉(zhuǎn)圈
開啟hystrix后
1.壓力測試
2.訪問hello接口
3.提示:服務(wù)器繁忙
當服務(wù)器無法處理服務(wù) 返回用戶一個比較友好的提示 服務(wù)器繁忙
這種功能就叫做服務(wù)降級
, 而在服務(wù)降級之后 系統(tǒng)是不會再跳入這個接口了 直接執(zhí)行了fallback
這種現(xiàn)象就叫做服務(wù)熔斷
, 熔斷了hello
執(zhí)行了fallback
, 這個解釋夠明白吧, 可以參考保險絲來理解, 當家庭電器短路之后, 家里的保險絲會熔斷, 斷開電源來保證不會發(fā)生火災(zāi).
四.Demo
https://github.com/objcat/test-spring-cloud-demo.git