hystrix入門以及springboot結合hystrix
1.hystrix核心功能:
資源隔離。就是多個依賴服務的呼叫分別隔離到各自自己的資源池內。避免說對一個依賴服務的呼叫,因為依賴服務介面呼叫的失敗或者延遲,導致所有的執行緒資源
都全部耗費在這個介面上。一旦某個服務的執行緒資源全部耗盡可能導致服務的崩潰,甚至故障蔓延。 2.資源隔離的方法
訊號量semaphore,最多能容納10個請求。一旦超過10個訊號量最大容量,那麼就會拒絕其他請求。
訊號量與執行緒池資源隔離的區別:
執行緒池隔離技術並非控制tomcat等web容器的執行緒。更準確的說就是控制tomcat執行緒的執行。tomcat接到請求之後會呼叫hystrix執行緒池的執行緒去執行。當執行緒池滿了之後會呼叫fallback降級。
tomcat其他的執行緒不會卡死,快速返回,然後可以支撐其他事情。同時hystrix處理timeout超時問題。
訊號量隔離只是一個關卡,通過我的關卡的執行緒是固定的。容量滿了之後。fallback降級。
區別:執行緒池隔離技術是用自己的執行緒去執行呼叫。訊號量是直接讓tomcat執行緒去執行依賴服務。
2.hystrix整合springboot
(1) java 程式碼
import org.springframework.boot.web.servlet.ServletRegistrationBean; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import com.netflix.hystrix.contrib.javanica.aop.aspectj.HystrixCommandAspect; import com.netflix.hystrix.contrib.metrics.eventstream.HystrixMetricsStreamServlet; @Configuration public class HystrixConfig { //用來攔截處理HystrixCommand註解 @Bean public HystrixCommandAspect hystrixAspect() { return new HystrixCommandAspect(); } //用來像監控中心Dashboard傳送stream資訊 @Bean public ServletRegistrationBean hystrixMetricsStreamServlet() { ServletRegistrationBean registration = new ServletRegistrationBean(new HystrixMetricsStreamServlet()); registration.addUrlMappings("/hystrix.stream"); return registration; } }
@GetMapping @LogAnnotation(module = LogModule.GET_USER_BYID) @HystrixCommand( fallbackMethod = "getByIdFallback", threadPoolProperties = { //10個核心執行緒池,超過20個的佇列外的請求被拒絕; 當一切都是正常的時候,執行緒池一般僅會有1到2個執行緒啟用來提供服務 @HystrixProperty(name = "coreSize", value = "10"), @HystrixProperty(name = "maxQueueSize", value = "100"), @HystrixProperty(name = "queueSizeRejectionThreshold", value = "20")}, commandProperties = { @HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds", value = "10000"), //命令執行超時時間 @HystrixProperty(name = "circuitBreaker.requestVolumeThreshold", value = "2"), //若干10s一個視窗內失敗三次, 則達到觸發熔斷的最少請求量 @HystrixProperty(name = "circuitBreaker.sleepWindowInMilliseconds", value = "30000") //斷路30s後嘗試執行, 預設為5s }) private static int num = 1; public User getById(Long id) { if(num == 1) { num = 0; try { Thread.sleep(20000); } catch (InterruptedException e) { e.printStackTrace(); } } else { num = 1; } return userService.getById(id); } public User getByIdFallback(Long id) { throw new HystrixException("伺服器負載過重,請稍後請求!"); }
(2)Hystrix-Dashboard使用
①下載https://bintray.com/kennedyoliveira/maven/standalone-hystrix-dashboard/1.5.6
②執行nohup java -jar standalone-hystrix-dashboard-1.5.6-all.jar &
③瀏覽器開啟http://localhost:7979/hystrix-dashboard/ 輸入地址http://127.0.0.1/hystrix.stream
先點選 add stream
然後點選monitor stream既可以檢視