1. 程式人生 > >hystrix入門以及springboot結合hystrix

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既可以檢視